diff -x .svn -aruN 1.0.0.src/class2.php 1.0.2.src/class2.php
--- 1.0.0.src/class2.php	2012-10-30 15:39:55.422444481 +0000
+++ 1.0.2.src/class2.php	2012-10-30 15:40:38.277442670 +0000
@@ -10,9 +10,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/class2.php $
-|     $Revision: 12422 $
-|     $Id: class2.php 12422 2011-11-29 23:36:57Z e107coders $
-|     $Author: e107coders $
+|     $Revision: 12996 $
+|     $Id: class2.php 12996 2012-10-21 08:15:31Z e107steved $
+|     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
 //
@@ -47,7 +47,11 @@
 // Block common bad agents / queries / php issues. 
 array_walk($_SERVER,  'e107_filter', '_SERVER');
 if (isset($_GET)) array_walk($_GET,     'e107_filter', '_GET');
-if (isset($_POST)) array_walk($_POST,    'e107_filter', '_POST');
+if (isset($_POST))
+{
+	array_walk($_POST,    'e107_filter', '_POST');
+	reset($_POST);			// Change of behaviour in PHP 5.3.17?
+}
 if (isset($_COOKIE)) array_walk($_COOKIE,  'e107_filter', '_COOKIE');
 
 //
@@ -257,6 +261,8 @@
 $_SERVER['QUERY_STRING'] = e_QUERY;
 
 define("e_UC_PUBLIC", 0);
+define('e_UC_NEWUSER', 247);	// Users in 'probationary' period
+define('e_UC_BOTS', 246);	// Reserved to identify search bots
 define("e_UC_MAINADMIN", 250);
 define("e_UC_READONLY", 251);
 define("e_UC_GUEST", 252);
@@ -476,7 +482,9 @@
 
 $SESS_NAME = strtoupper(preg_replace("/[\W_]/","",$pref['cookie_name'])); // clean-up characters.  
 session_name('SESS'.$SESS_NAME); // avoid session conflicts with separate sites within subdomains
-unset($SESS_NAME);
+$doma = ((!e_SUBDOMAIN || defsettrue('MULTILANG_SUBDOMAIN')) && e_DOMAIN != FALSE) ? ".".e_DOMAIN : FALSE;
+session_set_cookie_params(FALSE,e_HTTP,$doma); // same cookie for www. and without 
+unset($SESS_NAME,$doma);
 
 // Start session after $prefs are available.
 session_start(); // Needs to be started after language detection (session.cookie_domain) to avoid multi-language 'access-denied' issues. 
@@ -498,9 +506,11 @@
 		$details .= "\nPlugins:\n";
 		$details .= print_r($pref['plug_installed'],true);
 			
-		$admin_log->log_event("Access denied", $details, E_LOG_WARNING);				
+		$admin_log->log_event("Access denied", $details, E_LOG_WARNING); // admin access may not be possible. 
+		echo nl2br($details);				
 	}	
 		// do not redirect, prevent dead loop, save server resources
+
 	die('Access denied');
 }
 
@@ -1041,7 +1051,7 @@
  */
 function check_class($var, $userclass = USERCLASS, $peer = FALSE, $debug = FALSE)
 {
-	global $tp;
+	global $tp,$pref;
 	if($var == e_LANGUAGE){
 		return TRUE;
 	}
@@ -1077,10 +1087,12 @@
 		$_user = true;
 		$_admin = $peer['user_admin'] === 1;
 		$peer = false;
+		$_userjoined = $peer['user_joined']; 
 	} else {
 		$_adminperms = defined('ADMINPERMS') ? ADMINPERMS : '';
 		$_user = USER;
 		$_admin = ADMIN;
+		$_userjoined = USERJOINED;
 	}
 
 	//Test 'special' userclass numbers
@@ -1090,6 +1102,11 @@
 		{
         	return TRUE;
 		}
+		//&& $_admin == FALSE
+		if ($var == e_UC_NEWUSER  && (time() < ($_userjoined + (varset($pref['user_new_period'],0)*86400))))
+		{
+			return TRUE;
+		}
 
 		if ($var == e_UC_MEMBER && $_user == TRUE)
 		{
@@ -1471,13 +1488,7 @@
 	define('USERIP', $e107->getip());
 	if (!isset($_COOKIE[$pref['cookie_name']]) && !isset($_SESSION[$pref['cookie_name']]))
 	{
-		define("USER", FALSE);
-		define('USERID', 0);
-		define("USERTHEME", FALSE);
-		define("ADMIN", FALSE);
-		define("GUEST", TRUE);
-		define('USERCLASS', '');
-		define('USEREMAIL', '');
+		setGuest();
 	}
 	else
 	{
@@ -1488,28 +1499,27 @@
 			cookie($pref['cookie_name'], "", (time() - 2592000));
 			$_SESSION[$pref['cookie_name']] = "";
 			session_destroy();
-			define("ADMIN", FALSE);
-			define("USER", FALSE);
-			define('USERID', 0);
-			define("USERCLASS", "");
+			setGuest();
 			define('USERCLASS_LIST', class_list());
-			define("LOGINMESSAGE",CORE_LAN10."<br /><br />");
+			define('LOGINMESSAGE',CORE_LAN10.'<br /><br />');
 			return (FALSE);
 		}
 
 		$result = get_user_data($uid);
-		if(is_array($result) && md5($result['user_password']) == $upw)
+		if(is_array($result) && (md5($result['user_password']) == $upw) && ($result['user_ban'] == 0))
 		{
-			define("USERID", $result['user_id']);
-			define("USERNAME", $result['user_name']);
-			define("USERURL", (isset($result['user_homepage']) ? $result['user_homepage'] : false));
-			define("USEREMAIL", $result['user_email']);
-			define("USER", TRUE);
-			define("USERCLASS", $result['user_class']);
-			define("USERREALM", $result['user_realm']);
-			define("USERVIEWED", $result['user_viewed']);
-			define("USERIMAGE", $result['user_image']);
-			define("USERSESS", $result['user_sess']);
+			define('USER', TRUE);
+			define('USERID', $result['user_id']);
+			define('USERNAME', $result['user_name']);
+			define('USERURL', (isset($result['user_homepage']) ? $result['user_homepage'] : false));
+			define('USEREMAIL', $result['user_email']);
+			define('USERCLASS', $result['user_class']);
+			define('USERREALM', $result['user_realm']);
+			define('USERVIEWED', $result['user_viewed']);
+			define('USERVISITS', $result['user_visits']);
+			define('USERIMAGE', $result['user_image']);
+			define('USERSESS', $result['user_sess']);
+			define('USERJOINED', $result['user_join']);
 
 			$update_ip = ($result['user_ip'] != USERIP ? ", user_ip = '".USERIP."'" : "");
 
@@ -1527,9 +1537,7 @@
 
 			$currentUser = $result;
 			$currentUser['user_realname'] = $result['user_login']; // Used by force_userupdate
-			define("USERLV", $result['user_lastvisit']);
-
-			if ($result['user_ban'] == 1) { exit; }
+			define('USERLV', $result['user_lastvisit']);
 
 			if ($result['user_admin'])
 			{
@@ -1568,12 +1576,8 @@
 		}
 		else
 		{
-			define("USER", FALSE);
-			define('USERID', 0);
-			define("USERTHEME", FALSE);
-			define("ADMIN", FALSE);
-			define("CORRUPT_COOKIE", TRUE);
-			define("USERCLASS", "");
+			setGuest();
+			define('CORRUPT_COOKIE', TRUE);
 		}
 	}
 
@@ -1594,6 +1598,29 @@
 //	}
 }
 
+
+/**
+ *	Set all the defines appropriate to a guest (visitor or user who isn't logged in)
+ */
+function setGuest()
+{
+	define('USER', FALSE);
+	define('ADMIN', FALSE);
+	define('GUEST', TRUE);
+	define('USERID', 0);
+	define('USERTHEME', FALSE);
+	define('USERCLASS', '');
+	define('USEREMAIL', '');
+	define('USERURL', '');
+	define('USEREMAIL', '');
+	define('USERREALM', '');
+	define('USERVIEWED', '');
+	define('USERIMAGE', '');
+	define('USERSESS', '');
+}
+
+
+
 $sql->db_Mark_Time('Start: Go online');
 if(isset($pref['track_online']) && $pref['track_online']) {
 	$e_online->online($pref['track_online'], $pref['flood_protect']);
@@ -1601,10 +1628,11 @@
 
 function cookie($name, $value, $expire=0, $path = e_HTTP, $domain = "", $secure = 0)
 {
-	if(defined('MULTILANG_SUBDOMAIN') && MULTILANG_SUBDOMAIN === TRUE)
+	if(!e_SUBDOMAIN || (defined('MULTILANG_SUBDOMAIN') && MULTILANG_SUBDOMAIN === TRUE))
 	{
-		$domain = e_DOMAIN;
+		$domain = (e_DOMAIN != FALSE) ? ".".e_DOMAIN : "";
 	}
+
 	setcookie($name, $value, $expire, $path, $domain, $secure);
 }
 
@@ -1754,7 +1782,7 @@
 			exit();	
 		}
 		
-		$regex = "/(wget |curl -o |fetch |lwp-download|onmouse)/i";
+		$regex = "/(wget |curl -o |fetch -|lwp-download|onmouse)/i";
 		if(preg_match($regex,$input))
 		{
 			header('HTTP/1.0 400 Bad Request', true, 400);
@@ -1866,9 +1894,13 @@
 			if (!check_class($row['user_extended_struct_applicable'])) { continue; }		// Must be applicable to this user class
 			if (!check_class($row['user_extended_struct_write'])) { continue; }				// And user must be able to change it
 			$user_extended_struct_name = "user_{$row['user_extended_struct_name']}";
-			if ((!$currentUser[$user_extended_struct_name]) || (($row['user_extended_struct_type'] == 7) && ($currentUser[$user_extended_struct_name] == '0000-00-00')))
+			if (!isset($currentUser[$user_extended_struct_name]))
 			{
-			  return TRUE;
+				return TRUE;
+			}
+			if (($row['user_extended_struct_type'] == 7) && ($currentUser[$user_extended_struct_name] == '0000-00-00'))
+			{
+				return TRUE;
 			}
 		}
 	}
diff -x .svn -aruN 1.0.0.src/e107_admin/ad_links.php 1.0.2.src/e107_admin/ad_links.php
--- 1.0.0.src/e107_admin/ad_links.php	2012-10-30 15:39:55.468444500 +0000
+++ 1.0.2.src/e107_admin/ad_links.php	2012-10-30 15:40:38.279444683 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/ad_links.php $
-|     $Revision: 11732 $
-|     $Id: ad_links.php 11732 2010-09-02 07:15:29Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12903 $
+|     $Id: ad_links.php 12903 2012-07-23 07:37:12Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 
@@ -363,6 +363,7 @@
 	'banlist' => E_32_BANLIST,
 	'banner' => E_32_BANNER,
 	'cache' => E_32_CACHE,
+	'comments' => E_32_COMMENT,
 	'credits' => E_32_CREDITS,
 	'custom' => E_32_CUST,
 	'database' => E_32_DATAB,
@@ -457,10 +458,11 @@
 	22 => array(e_ADMIN."upload.php", ADLAN_72, ADLAN_73, "V", 3, E_16_UPLOADS, E_32_UPLOADS),
 	23 => array(e_ADMIN."users.php", ADLAN_36, ADLAN_37, "4", 2, E_16_USER, E_32_USER),
 	24 => array(e_ADMIN."userclass2.php", ADLAN_38, ADLAN_39, "4", 2, E_16_USERCLASS, E_32_USERCLASS),
-	25 => array(e_ADMIN."language.php", ADLAN_132, ADLAN_133, "0", 1, E_16_LANGUAGE, E_32_LANGUAGE),
+	25 => array(e_ADMIN."language.php", ADLAN_132, ADLAN_133, "L", 1, E_16_LANGUAGE, E_32_LANGUAGE),
 	26 => array(e_ADMIN."mailout.php", ADLAN_136, ADLAN_137, "W", 2, E_16_MAIL, E_32_MAIL),
 	27 => array(e_ADMIN."users_extended.php", ADLAN_78, ADLAN_79, "4", 2, E_16_USER_EXTENDED, E_32_USER_EXTENDED),
 	28 => array(e_ADMIN."fileinspector.php", ADLAN_147, ADLAN_148, "Y", 4, E_16_INSPECT, E_32_INSPECT),
-	29 => array(e_ADMIN."notify.php", ADLAN_149, ADLAN_150, "O", 4, E_16_NOTIFY, E_32_NOTIFY)
+	29 => array(e_ADMIN."notify.php", ADLAN_149, ADLAN_150, "O", 4, E_16_NOTIFY, E_32_NOTIFY),
+	30 => array(e_ADMIN."modcomment.php", ADLAN_114, ADLAN_114, "B", 4, E_16_COMMENT, E_32_COMMENT)
 	);
 ?>
diff -x .svn -aruN 1.0.0.src/e107_admin/administrator.php 1.0.2.src/e107_admin/administrator.php
--- 1.0.0.src/e107_admin/administrator.php	2012-10-30 15:39:55.470445525 +0000
+++ 1.0.2.src/e107_admin/administrator.php	2012-10-30 15:40:38.280444575 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/administrator.php $
-|     $Revision: 11695 $
-|     $Id: administrator.php 11695 2010-08-23 18:12:30Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12903 $
+|     $Id: administrator.php 12903 2012-07-23 07:37:12Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 
@@ -193,42 +193,51 @@
 	<tr>
 	<td style='width:25%;vertical-align:top' class='forumheader3'>".ADMSLAN_18.": <br /></td>
 	<td style='width:75%' class='forumheader3'>";
-
-	$text .= checkb("1", $a_perms).ADMSLAN_19."<br />";			// Alter site preferences
-	$text .= checkb("2", $a_perms).ADMSLAN_20."<br />";			// Alter Menus
-	$text .= checkb("3", $a_perms).ADMSLAN_21."<br />";			// Modify administrator permissions
+	
+	$text .= "<div class='fcaption'>".ADLAN_CL_1."</div><br />"; // Settings
+	$text .= checkb("C", $a_perms).ADMSLAN_64."<br />";			// Clear Cache - Previously moderate chatbox
+	$text .= checkb("F", $a_perms).ADMSLAN_31."<br />";			// Configure emoticons
+	$text .= checkb("G", $a_perms).ADMSLAN_32."<br />";			// Configure front page content	
+	$text .= checkb("A", $a_perms).ADMSLAN_36."<br />";			// Configure Image Settings (Previously Moderate forums - NOW PLUGIN)
+	$text .= checkb("L", $a_perms).ADMSLAN_76."<br />";			// Language-Pack Area. 
+	$text .= checkb("T", $a_perms).ADMSLAN_34."<br />";			// Configure meta tags
+	$text .= checkb("1", $a_perms).ADMSLAN_19."<br />";			// Alter site preferences		
+	$text .= checkb("X", $a_perms).ADMSLAN_66."<br />";			// Configure Search
+	$text .= checkb("I", $a_perms).ADMSLAN_40."<br />";			// Post links
+	
+	$text .= "<br /><div class='fcaption'>".ADLAN_CL_2."</div><br />"; // Users
+	$text .= checkb("3", $a_perms).ADMSLAN_21."<br />";			// Modify administrator permissions		
 	$text .= checkb("4", $a_perms).ADMSLAN_22."<br />";			// Moderate users/bans etc
+	$text .= checkb("W", $a_perms).ADMSLAN_65."<br />";	// Configure mail settings and mailout
+	
+	$text .= "<br /><div class='fcaption'>".ADLAN_CL_3."</div><br />"; // Content
+	$text .= checkb("D", $a_perms).ADMSLAN_29."<br />";			// Manage banners	
 	$text .= checkb("5", $a_perms).ADMSLAN_23."<br />";			// create/edit custom pages/menus
-	$text .= checkb("Q", $a_perms).ADMSLAN_24."<br />";			// Manage download categories
+	$text .= checkb("R", $a_perms).ADMSLAN_44."<br />";			// Post downloads
+	$text .= checkb("Q", $a_perms).ADMSLAN_24."<br />";			// Manage download categories			
+	$text .= checkb("2", $a_perms).ADMSLAN_20."<br />";			// Alter Menus
+	$text .= checkb("H", $a_perms).ADMSLAN_39."<br />";			// Post news
+	$text .= checkb("7", $a_perms).ADMSLAN_26."<br />";			// Oversee news categories
+	$text .= checkb("N", $a_perms).ADMSLAN_47."<br />";	// Moderate submitted news
 	$text .= checkb("6", $a_perms).ADMSLAN_25."<br />";			// Upload /manage files
+	$text .= checkb("V", $a_perms).ADMSLAN_35."<br />";			// Configure public file uploads
+	$text .= checkb("M", $a_perms).ADMSLAN_46."<br />";			// Welcome message
+
+	$text .= "<br /><div class='fcaption'>".ADLAN_CL_6."</div><br />"; // Tools
+	$text .= checkb("B", $a_perms).ADMSLAN_37."<br />";			// Moderate comments
 	$text .= checkb("Y", $a_perms).ADMSLAN_67."<br />";			// file inspector
-	$text .= checkb("O", $a_perms).ADMSLAN_68."<br />";			// notify
-	$text .= checkb("7", $a_perms).ADMSLAN_26."<br />";			// Oversee news categories
-  //	$text .= checkb("8", $a_perms).ADMSLAN_27."<br />";		// Oversee link categories - NOWPLUGIN
-	$text .= checkb("C", $a_perms).ADMSLAN_64."<br />";			// Clear Cache - Previously moderate chatbox
 	$text .= checkb("9", $a_perms).ADMSLAN_28."<br />";			// Take site down for maintenance
-	$text .= checkb("W", $a_perms).ADMSLAN_65."<br /><br />";	// Configure mail settings and mailout
+	
+	$text .= checkb("O", $a_perms).ADMSLAN_68."<br />";			// notify
 
-	$text .= checkb("D", $a_perms).ADMSLAN_29."<br />";			// Manage banners
+ //	$text .= checkb("8", $a_perms).ADMSLAN_27."<br />";			// Oversee link categories - NOWPLUGIN
 //	$text .= checkb("E", $a_perms).ADMSLAN_30."<br />";			// Configure news feed headlines - now plugin
-	$text .= checkb("F", $a_perms).ADMSLAN_31."<br />";			// Configure emoticons
-	$text .= checkb("G", $a_perms).ADMSLAN_32."<br />";			// Configure front page content
 //	$text .= checkb("S", $a_perms).ADMSLAN_33."<br />";			// Configure log/stats - now plugin (used for system logs in 0.8)
-	$text .= checkb("T", $a_perms).ADMSLAN_34."<br />";			// Configure meta tags
-	$text .= checkb("V", $a_perms).ADMSLAN_35."<br />";			// Configure public file uploads
-	$text .= checkb("X", $a_perms).ADMSLAN_66."<br />";			// Configure Search
-	$text .= checkb("A", $a_perms).ADMSLAN_36."<br />";			// Configure Image Settings (Previously Moderate forums - NOW PLUGIN)
-	$text .= checkb("B", $a_perms).ADMSLAN_37."<br />";			// Moderate comments
-	$text .= checkb("H", $a_perms).ADMSLAN_39."<br />";			// Post news
-	$text .= checkb("I", $a_perms).ADMSLAN_40."<br />";			// Post links
-//	$text .= checkb("J", $a_perms).ADMSLAN_41."<br />";					// Post articles   - NOW PLUGIN
-//	$text .= checkb("K", $a_perms).ADMSLAN_42."<br />";					// Post reviews    - NOW PLUGIN
-//	$text .= checkb("L", $a_perms).ADMSLAN_43."<br />";					// Post content pages - NOW PLUGIN
-	$text .= checkb("R", $a_perms).ADMSLAN_44."<br />";			// Post downloads
-//	$text .= checkb("U", $a_perms).ADMSLAN_45."<br />";			// Post polls  - NOW PLUGIN.
-	$text .= checkb("M", $a_perms).ADMSLAN_46."<br />";			// Welcome message
-	$text .= checkb("N", $a_perms).ADMSLAN_47."<br /><br />";	// Moderate submitted news
 
+//	$text .= checkb("J", $a_perms).ADMSLAN_41."<br />";			// Post articles   - NOW PLUGIN
+//	$text .= checkb("K", $a_perms).ADMSLAN_42."<br />";			// Post reviews    - NOW PLUGIN
+//	$text .= checkb("U", $a_perms).ADMSLAN_45."<br />";			// Post polls  - NOW PLUGIN.
+	
 	$text .= "<br /><div class='fcaption'>".ADLAN_CL_7."</div><br />";
 	$text .= checkb("Z", $a_perms).ADMSLAN_62."<br /><br />";	// Plugin Manager
 
@@ -327,6 +336,7 @@
 		$pt["Q"] = ADMSLAN_24;	// Manage download categories
 		$pt["6"] = ADMSLAN_25;	// Upload /manage files
 		$pt["Y"] = ADMSLAN_67;	// file inspector
+		$pt["L"] = ADMSLAN_76; // Language Pack Access. 
 		$pt["O"] = ADMSLAN_68;	// notify
 		$pt["7"] = ADMSLAN_26;
 		$pt["8"] = ADMSLAN_27;
@@ -345,7 +355,7 @@
 		$pt["B"] = ADMSLAN_37;
 		$pt["H"] = ADMSLAN_39;
 		$pt["I"] = ADMSLAN_40;
-		$pt["L"] = ADMSLAN_43;
+
 		$pt["R"] = ADMSLAN_44;
 		$pt["U"] = ADMSLAN_45;
 		$pt["M"] = ADMSLAN_46;
diff -x .svn -aruN 1.0.0.src/e107_admin/core_image.php 1.0.2.src/e107_admin/core_image.php
--- 1.0.0.src/e107_admin/core_image.php	2012-10-30 15:39:55.471444772 +0000
+++ 1.0.2.src/e107_admin/core_image.php	2012-10-30 15:40:38.284442315 +0000
@@ -10,7 +10,7 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/core_image.php $
-|     $Id: core_image.php 12481 2011-12-28 07:43:38Z e107coders $
+|     $Id: core_image.php 12999 2012-10-22 20:57:24Z e107coders $
 +----------------------------------------------------------------------------+
 */
 
@@ -38,14 +38,14 @@
       'core_sql.php' => '03fbdc6930452734558146cd9cf4728b',
       'extended_country.php' => 'a0d285e0ed6c9db3eb10fd7d06c47af7',
     ),
-    'ad_links.php' => 'e6e818f7dded90dcb20f57ea7ebd17b8',
+    'ad_links.php' => '666a20168a0abc93ca3264648ab036be',
     'admin.php' => 'fa57d18b04384ec9a5c6354a93c524bb',
     'admin_classis.php' => '1ad9a3d24d76efdc2e5320caeb2b6e12',
     'admin_combo.php' => '72ed3c4ca9c6e348af758323cface540',
     'admin_etalkers.php' => '4606fdf97453273e37f0fd973e64c1d6',
     'admin_log.php' => '25773504f8afc13dbcf0025c97e65c95',
     'adminb.php' => '34fba5666d40d75b4a433cfb670ab33b',
-    'administrator.php' => 'ca893ed78fcfa45d3305d29ece36c100',
+    'administrator.php' => '31a95c01c86d2871f6165ea2d4ae6f93',
     'article.php' => '718991e8d07f3af22917c6babcb16d18',
     'auth.php' => '677c9b2f80a2b85b0895b212db602a7b',
     'banlist.php' => 'aca33bf3e75b23310458df1051dfcf88',
@@ -59,13 +59,13 @@
     'comment.php' => '64e8eb798697c404ca7d9551680606e6',
     'compact.php' => 'ec130bd289f9c97fa3aa2174b717cedc',
     'content.php' => '393ac3283845587d8c9fde0cc60afb3e',
-    'core_image.php' => 'f6ff9e23e184f24cc9fdc5b9d3dd288c',
-    'cpage.php' => '201e77b9624ee1c25de780c0611dd581',
+    'core_image.php' => 'dc82289a58a46feaaa065973681389cc',
+    'cpage.php' => 'e89815db5a488d60cc6ed04c50c2709b',
     'credits.php' => 'd7938184f98199cad278f68167ec748a',
     'db.php' => '74139e11c3664555bdf7cf8080ab26bf',
     'db_verify.php' => 'e811e73c73dfd3d3333f12999c0b2564',
     'docs.php' => 'f664d88854f00b622ef94d5058f6d409',
-    'download.php' => '9bc411b3158953bf26ba35511491993a',
+    'download.php' => '41cb7357aaa7da0c6f749750497c62aa',
     'e107_update.php' => 'f732438744e472390a1b439465d7f0e8',
     'emoticon.php' => '4ead8f97b1ac650d03bac44687ef8732',
     'fileinspector.php' => '71450f515e8134573897e6b2fbf3d065',
@@ -77,33 +77,33 @@
     'header.php' => '268095a9e4042861b4a66ac18e62b0f1',
     'image.php' => '7cdd8e6b6589e93bd18979752da4d3bd',
     'index.php' => '26700800ddf746629a55e2747b9e8e0f',
-    'lancheck.php' => 'cc9bf73f69694041e9e472281fb58ca7',
-    'language.php' => 'e255fb03c3c33499722bd2f6c2097918',
+    'lancheck.php' => '03072c0e657625407e8c5e90b4f5b7b8',
+    'language.php' => '85ede27b3860e59d1973026d2f64d579',
     'links.php' => 'da6418d37f24dc20f15c5d7ff893a0e6',
     'mailout.php' => '5e2df321b542f6da7be9811a8c902dfb',
     'menus.php' => '0873f17e7aa314d3ae6eff79ef745a74',
     'message.php' => '5f69b7440db09e5bee30288241bdad35',
     'meta.php' => '0371c24cac6be53833b0e9feea1f5d1f',
-    'modcomment.php' => 'dbf112846aea17d36c03d66206bc5a15',
-    'newspost.php' => 'dc07088f28d63c7f2c6725decf6911ef',
-    'notify.php' => '07e00910ee8ac60951a0b83b9fcb2fd7',
+    'modcomment.php' => 'ccfddd5fefc102d5ec41fcbacd20b79d',
+    'newspost.php' => '72ae96ed60d524f179a732a24ccbeda4',
+    'notify.php' => 'a99892ab1fba4f9f4496eef5de562dbc',
     'phpinfo.php' => 'f1153cdf730e14f0ed22b13806183875',
     'plugin.php' => '71646ef1775f46d4bf697ff79596697d',
-    'prefs.php' => '0184f2610b784c2010f576b04881c7bd',
+    'prefs.php' => 'aa79e9e1f4dde8569b0304ef6fddfe02',
     'review.php' => 'b7ec4170f13068a622d1ec2582c21a6f',
     'search.php' => '55b03caa1435222f0675f713dcd3dae7',
     'theme.php' => 'a3f8219bacbc8028a7ffd21c798f4f8b',
     'ugflag.php' => '6bceb5eef44d91cf2929b92fd1854432',
-    'update_routines.php' => '63d626d0546b49db8551b04613305485',
+    'update_routines.php' => 'd07a875e2035457de35324815cd61a7a',
     'updateadmin.php' => '3f0c55903abcffc20e8ae612c9adb3fd',
     'upload.php' => 'eb45f5e64818c2a33c32db5e737a3bcb',
     'userclass.php' => '46791da1459ae7df9b4c0adb14ccbecf',
     'userclass2.php' => 'ea33cb3a5dadd33a5c85d4f04d77c2d9',
     'userinfo.php' => '86461ecfae44ebdbaa1f710acc63cf13',
-    'users.php' => '1be4c09fbfd4baba02bcfc072e615ae0',
+    'users.php' => '075873a9431ba3aed9116eb6a852268d',
     'users_extended.php' => 'c788d3532e058496c4f4d0caf47e7147',
     'users_extended_predefined.php' => 'a7f1f96f56cbb0b1f4a0b71126318597',
-    'ver.php' => '12b0e72188531888b0d23cd99bb4df25',
+    'ver.php' => '29554d564c02b623a0293c88497dd4a8',
     'wmessage.php' => 'eae41daa06adf50107d3652e173f568d',
   ),
   $coredir['docs'] => 
@@ -146,8 +146,8 @@
     'bbcode' => 
     array (
       'b.bb' => '467bfb5e80f460fcebcdc2e6a3a8d38b',
-      'bb_youtube.php' => 'e7d620653fc108d9593700e36fceb936',
-      'blockquote.bb' => '2cfbbd3ab3fe2872d1a9873223d21522',
+      'bb_youtube.php' => '4ffe9edd6c936153ccb24c27675f4646',
+      'blockquote.bb' => 'f08e9d2163d665d09927aec7ca6769c6',
       'br.bb' => 'cb8d211703f0459735baa8dfbebb4bb4',
       'center.bb' => '5a1957946e3d8898a0b3d86650771809',
       'code.bb' => '15d5237cb3d77aaa80e830ffeb6f6bbb',
@@ -163,7 +163,7 @@
       'justify.bb' => '016500f910beb0f820dd58c4915f2489',
       'left.bb' => '990ddba32b14bea648745cc373035bde',
       'link.bb' => 'e9776a03f23071259f449d92f59863a7',
-      'list.bb' => 'b8a3e5c98d6ebc1f1ca1a122bd7ced0e',
+      'list.bb' => '741e64dcaa10d60d312e8ae687d11f6e',
       'php.bb' => 'b6afb99a8b52877e56e43efc54b9e5bb',
       'quote.bb' => '12bfbba32661e309a33972e388b0e912',
       'right.bb' => '9bd60ca738b30f35742a0049c5efc191',
@@ -262,8 +262,8 @@
       'batch' => 
       array (
         'bbcode_shortcodes.php' => '140adff9b52e4515b4e134b66eb144cc',
-        'comment_shortcodes.php' => 'f31a6553dd61db387730fe1cf7e39530',
-        'contact_shortcodes.php' => 'e4a9d766c2d8230a8c194edc73a0ee67',
+        'comment_shortcodes.php' => 'ce5206ab062106520d046175c0375c65',
+        'contact_shortcodes.php' => 'e7daa09fb55080d4a8ff52c4a9243dce',
         'download_shortcodes.php' => 'ddc28b227ed55098bc2a085585bc73af',
         'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
         'news_archives.php' => '17478354b5a68bfcac46e46484b7e4ce',
@@ -271,10 +271,10 @@
         'signup_shortcodes.php' => '85c54e5e3c3f7d90312b0f91fc2a9dab',
         'sitedown_shortcodes.php' => '2e795ea320860124c884606926e37219',
         'user_shortcodes.php' => 'fb17c7e2754da7bc9204c87995eca7ba',
-        'usersettings_shortcodes.php' => 'c89a0e5127175befca158cb3b16ef0a2',
+        'usersettings_shortcodes.php' => '1b54d9e65898c7fe087a6fbdcb7e11cf',
       ),
       'admin_alt_nav.sc' => '17f82050dadf0bcc51f36e9bcfab58d9',
-      'admin_credits.sc' => 'f46b9492eeeac383d2e5d67f730f21b6',
+      'admin_credits.sc' => '513da741f9d89b8de701e0942f6ee0a9',
       'admin_docs.sc' => 'b010b7ac7618fa669c8777754a8337c6',
       'admin_help.sc' => '6bcd7a3280c9eb76cd0bbddb7cc4660a',
       'admin_icon.sc' => '4843c11cc5e5e14db4d5cacd537569c2',
@@ -283,7 +283,7 @@
       'admin_log.sc' => '9ed4a14759eb20032fb3e953b3374ce3',
       'admin_logged.sc' => 'dec16fb0a9f5485db6ca1b4955753c2e',
       'admin_logo.sc' => 'a97a3ad7bd7a505373ca5b794310a7ff',
-      'admin_menu.sc' => '70587ca7d1d1c79573deffc27bdb0884',
+      'admin_menu.sc' => '5a29730ac28d3fd1cebd33c470833378',
       'admin_msg.sc' => '1906530f20e337964878fd144b1047c5',
       'admin_nav.sc' => 'c22be64cb31ee333f0510f6dd8778363',
       'admin_plugins.sc' => 'd2a629cdf1bda821867e4177bd4999e1',
@@ -292,7 +292,7 @@
       'admin_sel_lan.sc' => '0d011beac7113c9cd8e0b31fd73ebdd0',
       'admin_siteinfo.sc' => '64b9b7289a7794b4dbea603ca7ede2ab',
       'admin_status.sc' => '0d29c1581183a9e0010cc440f0e407e8',
-      'admin_update.sc' => '80b99041946daf2b7339d55129ad7fa4',
+      'admin_update.sc' => '495a22596e1649b9ca219385ceddf7b6',
       'admin_userlan.sc' => 'd1ced8f4235d221877e47efcaaecc835',
       'banner.sc' => '9f40612195bb3a863615b06f059b9ab1',
       'breadcrumb.sc' => '0591ee7dc26ded7ac9a359dea4b8fdf6',
@@ -310,7 +310,7 @@
       'languagelinks.sc' => '86777cfae68e873ef74d41c3ffd8a767',
       'linkstyle.sc' => '5ed64d972bc892a798f80179878f1266',
       'logo.sc' => '7989dac8bea9ec4c0da489fb942ae507',
-      'menu.sc' => 'a59149f7071b59afdb17a9be17d0c901',
+      'menu.sc' => 'f14b86a1d81b190aaeae5783b8398a97',
       'news_alt.sc' => '25596ffed2cf4bed831b80397c77e295',
       'news_categories.sc' => '84c01e079adf626fb875897e290bd212',
       'news_category.sc' => '25596ffed2cf4bed831b80397c77e295',
@@ -337,9 +337,9 @@
       'user_extended.sc' => 'fa0c0db13bf38c94f7ae2c58576d879c',
       'wmessage.sc' => '7e6ca101862dab61e56e748431bfb561',
     ),
-    'def_e107_prefs.php' => 'b6ecba83396e89ae0b7133bac4372eed',
+    'def_e107_prefs.php' => '64698742c55c8690290112e319913854',
     'e107.css' => 'e5cfa4047831f19def7df032ef8bc830',
-    'e107.js' => '6bbab5925033c771476843ab5c34fced',
+    'e107.js' => '8caa1b6afcf3b9e2ab558b40de908461',
     'e_ajax.js' => 'b583773e72852158e27af8a9bba7c97f',
     'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
     'nav_menu.css' => '58ca165986f7428fb05e8b7b82c2ee13',
@@ -406,7 +406,7 @@
     array (
       'langs' => 
       array (
-        'en.js' => 'b4181af2804b6b384931372aad8cbd48',
+        'en.js' => '6128f98c883fd83a43b81ccb8cfd7edd',
       ),
       'plugins' => 
       array (
@@ -426,8 +426,13 @@
             'spacer.gif' => '12bf9e19374920de3146a64775f46a5e',
           ),
           'contextmenu.css' => '93ad8b3e8a5e1a48bf6ed727ca0384e2',
-          'editor_plugin.js' => '33823d4ec2c7f493b5b9ad66171e0e3a',
-          'editor_plugin_src.js' => 'bd32bdf199580f66c4446932d08e20b5',
+          'editor_plugin.js' => '80e3dfe19d1114b5d9f43681d7ca257d',
+          'editor_plugin_src.js' => '838ad70ff08b06452eabeaa15a3538e9',
+        ),
+        'directionality' => 
+        array (
+          'editor_plugin.js' => '653c3a89058b610fd12242faf4f01cdf',
+          'editor_plugin_src.js' => '13abc7859906fb6a50fa62a6819772f2',
         ),
         'emoticons' => 
         array (
@@ -495,7 +500,7 @@
           'js' => 
           array (
             'embed.js' => '2288f2d23b707283921aaeff2dfeb005',
-            'media.js' => '2cad38c1432ab01600c2182e62f1eaf6',
+            'media.js' => '454695b36189eb9108eced9bca80f914',
           ),
           'jscripts' => 
           array (
@@ -504,11 +509,11 @@
           ),
           'langs' => 
           array (
-            'en_dlg.js' => 'c2e2d9994c2b1bc101560c80dd11ca88',
+            'en_dlg.js' => 'a63ff4036a493cacda034684fcde7ad7',
           ),
-          'editor_plugin.js' => 'cc97fbc2bc892884a3fc3e3cab3b9aba',
-          'editor_plugin_src.js' => '07889a41f5b7406c27454e90c05e6637',
-          'media.htm' => '29486341f52da1a84cdaf154a0fb33b1',
+          'editor_plugin.js' => '9ce4c5f8e09f3b86b7b62abb19f32b09',
+          'editor_plugin_src.js' => '0445ecc5bc87cd9ebf47d6cd72f39dfa',
+          'media.htm' => 'd62448f53b5bf1b96b23878879cafff5',
         ),
         'paste' => 
         array (
@@ -519,10 +524,12 @@
           ),
           'langs' => 
           array (
-            'en_dlg.js' => '83e31108dcecfeb84650a60e8734840a',
+            'en_dlg.js' => '6ea2189562f65287be8e5e3185c405b7',
           ),
-          'editor_plugin.js' => 'c513165512b7f547106f5c713bb30a90',
-          'editor_plugin_src.js' => '6473847c2f7ba00f71fc949425e49e02',
+          'editor_plugin.js' => 'ace4ee20adc97976943071a23a644834',
+          'editor_plugin_src.js' => '866380ab0d488314e1b324a25db31d50',
+          'pastetext.htm' => 'c02ac66284aece2bc48309f451000b8c',
+          'pasteword.htm' => 'b3694520c9851c9a6e4e2cae86f691bd',
         ),
         'table' => 
         array (
@@ -550,10 +557,10 @@
           ),
           'js' => 
           array (
-            'cell.js' => '17609fd761d902c543747e563a20ea37',
+            'cell.js' => '19ee530d1dcc7ebb77f25d254eb4aec3',
             'merge_cells.js' => '2fa2cbbf3adcc15354cf63cc204277ee',
-            'row.js' => 'a0aa30a57ca4293838029888e4f9b68e',
-            'table.js' => 'd4b3d67217775a98633e8fa43fae4715',
+            'row.js' => 'c3491397b9e0045216839ae422c02f53',
+            'table.js' => '3f034debcb1d591300fc0a2cf62191cf',
           ),
           'jscripts' => 
           array (
@@ -564,14 +571,14 @@
           ),
           'langs' => 
           array (
-            'en_dlg.js' => 'cc0716e27eec0ab6a14ef7340f825a22',
+            'en_dlg.js' => 'ee3484503050cdae74d2cafa7d2e9999',
           ),
-          'cell.htm' => '809d7d5d8e3be13824d00e97f952e132',
-          'editor_plugin.js' => 'b2716161a4f7904ad2c4d9f95a8a4845',
-          'editor_plugin_src.js' => '0eb885bf2360edbcf01b9c77bf7d92d1',
+          'cell.htm' => '68cba9d1057047060bfb4766dcba0d53',
+          'editor_plugin.js' => '62302b2c6f82c8395cc4e321a0e6e26b',
+          'editor_plugin_src.js' => 'e9aeda67d811d977e53e6ee66e606c59',
           'merge_cells.htm' => '6a38cd801c48f419c0f61357aaff015f',
-          'row.htm' => 'de8e0048183374d3b2f471f777674a75',
-          'table.htm' => 'c09ac2ce7cfdf538c44ead7dc6a57887',
+          'row.htm' => '65566ac45731f8da4cb2ec282bb369aa',
+          'table.htm' => '6f7f91e3920ff13e82a2cbe8370d29b2',
         ),
         'zoom' => 
         array (
@@ -697,16 +704,16 @@
           ),
           'img' => 
           array (
-            'colorpicker.jpg' => '35246246c8889992f3a2a42d501f8bfe',
-            'icons.gif' => 'a9ef6e48ea2f231052bb7cdd45ef1f6c',
+            'colorpicker.jpg' => '77e59888aa233f78c24d322ccbf585d4',
+            'icons.gif' => 'dbf4d8ad063ac6c6edf414fc310ac9b2',
           ),
           'js' => 
           array (
             'about.js' => 'df58ed30ec67f2613d0cecf8075532fb',
-            'anchor.js' => '44501b7e6b4eabfc765e26cb9c1f6f3a',
-            'charmap.js' => '649992a33abc026dd84e508a24fb6539',
-            'color_picker.js' => 'b1804c4c0ac93ee1969082a12f207c7f',
-            'image.js' => 'c47c78fcc61531555f64c56318d92363',
+            'anchor.js' => 'fa2a3f0aecd825a4bf7d3449cf0f1b3f',
+            'charmap.js' => 'b450303e370bf7bd4602c883da14081a',
+            'color_picker.js' => 'd1a0706a6c3d92399dcd5d249d431158',
+            'image.js' => '804bbd375f5c2bb9568c24ca5613b41d',
             'link.js' => 'a696883dbf03011bcff1c5179e8afac0',
             'source_editor.js' => 'aed34941d3644083cca88148078d52de',
           ),
@@ -722,8 +729,8 @@
           ),
           'langs' => 
           array (
-            'en.js' => 'd1e3c3505d46e73fdd45214521844b7e',
-            'en_dlg.js' => '58f531fcf2b62c980b1791f6d6f51e7d',
+            'en.js' => '58c814313230f1dec07fe45ad5f304e5',
+            'en_dlg.js' => 'f3451497895d2c63182553fcdb13496b',
           ),
           'skins' => 
           array (
@@ -731,26 +738,26 @@
             array (
               'img' => 
               array (
-                'buttons.png' => 'f3b8decaa968630b3635b0d939d155cc',
-                'items.gif' => '5cb42865ce70a58d420786854fed4ae1',
+                'buttons.png' => '245a1554d2b0d5c678cc6698884ba929',
+                'items.gif' => 'd201498a710fc8aac6e117820b9814b7',
                 'menu_arrow.gif' => 'e21752451a9d80e276fef7b602bdbdba',
                 'menu_check.gif' => 'c7d003885737f94768eecae49dcbca63',
                 'progress.gif' => '208a0e0f39c548fd938680b564ea3bd1',
-                'tabs.gif' => '47ef3b1cf81bd4cc7b27aed88af21533',
+                'tabs.gif' => '73604ff7e567051a1aae352e98989229',
               ),
-              'content.css' => 'ff089cfc8553222a3a76fa061f2fd8c2',
+              'content.css' => '991cf574470efc74895682b6d4ef4d5d',
               'dialog.css' => '0ac841fc13582f90b6a031c752895d1f',
-              'ui.css' => 'f713449f13e50501d330dd0c19ed5b8c',
+              'ui.css' => '469b1b90219b7263fa02dd307cf553eb',
             ),
           ),
           'about.htm' => '6bc9ec57ef916969d978cec4e6b1018d',
           'anchor.htm' => 'f5683e39d2477e89186ef2a6387eda3d',
-          'charmap.htm' => 'd91b19f15c3651b59cff8075913e894d',
+          'charmap.htm' => '995faac552d2491b5f7a6360c4b93b87',
           'color_picker.htm' => '8ad6db3a03ed31b641761770ccb60887',
           'editor_content.css' => '99f256c087e16872937f6cf9e4ea0c32',
           'editor_popup.css' => 'a2bbb5f95ba2d3422c1666222170d700',
-          'editor_template.js' => 'c5d7988cec2d1be2a55ff4c271193954',
-          'editor_template_src.js' => '8374ce406af556f9773e59d08475dc80',
+          'editor_template.js' => 'dff644a587caca6335374fd0a1c04029',
+          'editor_template_src.js' => 'c721593b21ed8a04d532d4653fbf1ad3',
           'editor_ui.css' => '62632779c868eddf46f3a8e121083d31',
           'image.htm' => '9cff4955ae75a87fb6b66d3c7431ba26',
           'link.htm' => 'f3989d2bf0a0b735698b514c27efc656',
@@ -759,21 +766,21 @@
       ),
       'utils' => 
       array (
-        'editable_selects.js' => '4a7b89cf5ae0b0c22f8c7a2b2c74ab2e',
+        'editable_selects.js' => '8ed9da32d3b863f84d6d0b31bc2ec390',
         'form_utils.js' => 'cc3af39dea773af8ecff73f4c43384c2',
         'mclayer.js' => '9db8de8efcf4da4694f65f8b64873b55',
         'mctabs.js' => 'c7d01d9f8b9322d9597d9e5fc0276df2',
-        'validate.js' => '9ebff5e1ee4dbe4391f6fb1b9732855e',
+        'validate.js' => 'e1a9536cd598371520144a2ca73feea7',
       ),
       'blank.htm' => '72406c871a9be7972922686221a885a2',
       'filelist.php' => 'da02decd86335cc0d179df0cd3886bdd',
       'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
-      'tiny_mce.js' => '9d30ab9d3d465b38a9263014881ed942',
+      'tiny_mce.js' => 'd36954c036035a210b27beb643295182',
       'tiny_mce_gzip.js' => 'ea730144f7836073b9dcc0bd09c3ab5d',
       'tiny_mce_gzip.php' => 'def6c78847a3a181cfed52b93d8d5f06',
       'tiny_mce_popup.js' => '309ec618f86dc6a95854de0027d1791f',
-      'tiny_mce_src.js' => '90b04c1c92f22fa6df3ee38fe2124c76',
-      'wysiwyg.php' => 'd27d9e53ccb6ea2ebd281a0346f42660',
+      'tiny_mce_src.js' => 'fa2997e8b373e42007fbd3f0515fe27c',
+      'wysiwyg.php' => 'c165cf3f1dfd2c461b7d2055e3f2721b',
     ),
     'admin_handler.php' => '2d593943e40bf02d5d46cf6b6af6b7e7',
     'admin_log_class.php' => 'fd0dd236d400f018fe0fce8dd8c4c1e8',
@@ -781,13 +788,13 @@
     'avatar_handler.php' => 'd62b4eec902a6f0100c5fe5817d99357',
     'bbcode_handler.php' => '30316e2e59935e3e097a5821693a741a',
     'cache_handler.php' => '000f6cdd45fac48adb59fdf7fce8af03',
-    'comment_class.php' => 'c25240c11191f62eac412976389eb1c4',
+    'comment_class.php' => '3849cc3d573c2dd2c2df37acf83d0952',
     'date_handler.php' => 'e2edc265b7b99e277de5a3785a26e3a4',
-    'db_debug_class.php' => 'ce99404dc0c6b2168cf7bfa67ae21aaa',
-    'debug_handler.php' => '5836a6d058d3a3acbbe005ac59342e1f',
+    'db_debug_class.php' => '342891a99af082bc390bd76853b5a2e2',
+    'debug_handler.php' => 'd9c3b9f0793e3a495b0ced3206655b84',
     'e107_Compat_handler.php' => 'b927ac5a004fec8506e7d51b4e79a00f',
     'e107_class.php' => '5fba52d2321e3ffe9b8f0dd86a9c4776',
-    'e_parse_class.php' => '24042142a7f24c0edbd184471122c602',
+    'e_parse_class.php' => 'a651d31b6c9cd0e36271018468e0740a',
     'emailprint_class.php' => 'db7b892f5b103d8f3e1198ca82fba358',
     'emote.php' => 'cdf1bbc5f815f499f2c7c52340032084',
     'emote_filter.php' => '32f03814a155ab2d48517384c4f23efa',
@@ -805,7 +812,7 @@
     'message_handler.php' => '8a02bc87ac579485d1c944d96bea5325',
     'mysql_class.php' => 'f83025bc85b6c21050489e943282a5a2',
     'news_class.php' => '4823c2a7a079b39bb5cfedb04a0b1da4',
-    'notify_class.php' => '51ce6c2477d82024582d7132ae72046b',
+    'notify_class.php' => 'f3fa92914faca89b09889e061ecc8014',
     'np_class.php' => '20b3571a82960caaa4ce83c5e7c72e37',
     'override_class.php' => '8c3cb1c429d3473909fec59fe9fd877b',
     'parser_functions.php' => '8f94e2d568edaaf56dc5c21e87b8fa73',
@@ -822,14 +829,14 @@
     'preset_class.php' => 'f1e41a4a5d74153528fd4a69ecef6e41',
     'profanity_filter.php' => '7ad95608ae69c52042b0e27c96c6b293',
     'rate_class.php' => '5ab1d2b83bff6a28489d50534d69c460',
-    'ren_help.php' => 'f48fd86873af8daa59499899867924e2',
+    'ren_help.php' => '65b1f52400e41f661c9dfb119c4ce370',
     'resize_handler.php' => 'ae885747b6f474b67b4a930c38e2e1e7',
     'search_class.php' => '584d45a8308a89c2a46e445a8d7e66e4',
     'secure_img_handler.php' => '05fb734037c47bced5454ba2bbca0c16',
     'secure_img_render.php' => 'c8fb615bbcb3d22fe0e0e943e0b88d0e',
     'session_handler.php' => '6609d7029789a7e977c601fc7d80b11b',
     'shortcode_handler.php' => 'ca69b5c2084f3183d1e6e0abf7f63e7e',
-    'sitelinks_class.php' => '9b5b58152182ce45c36808c32f1034bd',
+    'sitelinks_class.php' => 'ffffef3e6a782f9ace63062d68fa3ff5',
     'smtp.php' => 'e3802cca9a715e79e93569750c0459fc',
     'theme_handler.php' => '008360ee83ad9b0b9a39c6285d09045e',
     'traffic_class.php' => 'eef68f1158a5059ee6e0c87367ac9f97',
@@ -838,9 +845,9 @@
     'user_extended_class.php' => 'b3826e1d3bd69eeaaae10dbff63b078e',
     'user_func.php' => '6885908b955e072bb78fef95e0a40f87',
     'user_select_class.php' => 'e5bf8f03d63b4401b1ffbda8ef467694',
-    'userclass_class.php' => '117e778284aad0e8f4b344ca0d4189dd',
+    'userclass_class.php' => '21dd7d89b44ac4618b76beb18e735b63',
     'usersession_class.php' => '582e2228f8e563a930f11199f27b019d',
-    'xml_class.php' => '6b8f43e2a0e667ef91b53a91732c8ebf',
+    'xml_class.php' => '1bd673cbd1eb9dec4dadaac4f24acc7a',
   ),
   $coredir['images'] => 
   array (
@@ -879,8 +886,8 @@
       'cat_users_32.png' => 'fcb8449127c2e201430a17369a6a4938',
       'chatbox_16.png' => '6524280b8f44bde11dd5ca5581432c14',
       'chatbox_32.png' => '2e6ae5a5be12ec8d09b5083e959347b9',
-      'comments_16.png' => '721b2c81aa4fa1c43fe4211fb35c2ce0',
-      'comments_32.png' => 'd5ba6ada9b084efe6209e1d9d603f749',
+      'comments_16.png' => '830bfb5112ae255267feb3339fcb0e4f',
+      'comments_32.png' => 'b2418362a0b5c8b88861f1d1b5c2430f',
       'content_16.png' => '0205fc5130dc19a8b279244aeeeb4729',
       'content_32.png' => '2d2b276bf5f57a38575446262ac4fc75',
       'credits_16.png' => 'a24c7cbe05d44b7effcb6386f6a69455',
@@ -1343,9 +1350,9 @@
           'users_extended.php' => 'af8d62ff77304e40c10ac365ecb8a8a9',
           'wmessage.php' => '06be89e920e35429e90adc5f54445053',
         ),
-        'lan_admin.php' => '4824c80560bbc3385db24673864507e9',
+        'lan_admin.php' => 'f8ba7d121bbd193fcaebc1e0cb8b40e9',
         'lan_admin_log.php' => 'da9d4f6af4ab0dafce14408b88e5a7ae',
-        'lan_administrator.php' => '3eaf0d0b14adca57a4606b73c7a7be24',
+        'lan_administrator.php' => '5ce2b51488cdc3cda143c2ffc1ae9301',
         'lan_banlist.php' => '260b7e19f84798e1ca6371a71db1d294',
         'lan_banner.php' => 'f64903cbc17497df42f471f327c382d8',
         'lan_cache.php' => 'e4e9c1785e92595921252e2cf6a099e7',
@@ -1355,7 +1362,7 @@
         'lan_db.php' => '2dd4d09c54c7e466732ff15b59b6c1cf',
         'lan_db_verify.php' => 'a7a5f80f124cb104a6e60166f2589877',
         'lan_docs.php' => '9df02b4a6fafef4e9be2962bfeaed509',
-        'lan_download.php' => '57af709ca30866083b2fdcaef09783dc',
+        'lan_download.php' => '093ed3af120115ca34ff60761d79601d',
         'lan_e107_update.php' => '06e75a49b55733d7e5ffa6a968113af3',
         'lan_emoticon.php' => 'c3a9e4cd7c0cab4f2cdbb4f24620b538',
         'lan_fileinspector.php' => 'aa6ec8442d1205564ecfca27becc63fa',
@@ -1366,17 +1373,17 @@
         'lan_header.php' => 'fe9b76d39a11a579566670879b12bf63',
         'lan_image.php' => 'a1928159cec5539caf1d32c1b8fbac23',
         'lan_lancheck.php' => '9eea32afd605d6d03b28e064da067b61',
-        'lan_language.php' => '7397cb9caa694a1e8033308ec326ce1c',
+        'lan_language.php' => 'fd1eda81fe5aba41ea9f640ffb4d9de3',
         'lan_links.php' => 'c8f88fbfbbd6e3e9d0d18d7955b7ffac',
         'lan_mailout.php' => '49972c5b43fe4341e1419d2a94dee864',
         'lan_menus.php' => '907505caa943ce9469b882e82fef72f2',
         'lan_message.php' => '9b5dc4ec9230bc114644188187272371',
         'lan_meta.php' => 'fb0068f9717c59b8973508d405121344',
-        'lan_modcomment.php' => 'd96f55439d8cd9779766d3c4393dc6c5',
+        'lan_modcomment.php' => '29c618324103623f21ee58b0543f4b63',
         'lan_newspost.php' => '2c5720bf24c3097fc48ee99254703e73',
-        'lan_notify.php' => '6f7a252b6ac7e78a2325f5cddca153e0',
+        'lan_notify.php' => '3571c081cfe526a67cffaaf4f78fa396',
         'lan_plugin.php' => '381bf223550b49b03001809c2384a85c',
-        'lan_prefs.php' => '01ed0800386a060cc41292f447139606',
+        'lan_prefs.php' => '414e6b3f9159fa85872d641aa0205b31',
         'lan_search.php' => 'aefebce7e8e000cf23cdfa7ef97e9a4c',
         'lan_theme.php' => '23db85c43ac49cde3fc728e5277d808d',
         'lan_ugflag.php' => 'a7ee88dde31b32f021ff98419bee0fc2',
@@ -1385,25 +1392,25 @@
         'lan_userclass.php' => '6c1291c06699d573c5a3d8bb9e84ac4d',
         'lan_userclass2.php' => '6f4d7fe63fc3c5d78e026e25b59a729a',
         'lan_userinfo.php' => 'eca9060238e2fabd6bf427f61ed48c6c',
-        'lan_users.php' => 'f2b83ff85ccfee477ac5f4f19c4a441b',
+        'lan_users.php' => '1ec05c3df0634676ad8f33db32bcd419',
         'lan_users_extended.php' => 'd09d843ddef35897d81cf5e930e2d8ba',
         'lan_wmessage.php' => '2977457ef1a96253bd352b2618fc6886',
       ),
       'English.php' => '000e2b68e79b11c182fa2728f45f4078',
       'lan_banner.php' => '1e1df1d874720d81a306dded0f4bb533',
-      'lan_comment.php' => '683a6bf1de72f9e40c5c94f08bb8d915',
+      'lan_comment.php' => 'ab6d751f87ebde47b9a4cb5ada30e863',
       'lan_contact.php' => 'e6b05827065cfc1f4f88f8d474b2f4e4',
       'lan_date.php' => 'cb650a1f0bc9be44631de0211aceaf70',
       'lan_download.php' => 'ef5d6dfed05c3eb59dbc66ca8e2a4931',
       'lan_email.php' => 'e73a709f16284cd9b2e94230ea19f30e',
       'lan_error.php' => '70191ace1f300a2cbce74d2f1bd67637',
       'lan_fpw.php' => '0325398c51a1f1f62672f3debb214c36',
-      'lan_installer.php' => 'e927522135ab8a894d1e1246dff93df1',
+      'lan_installer.php' => 'fb2849458a04d29f15e0d9f6a0f5cefa',
       'lan_login.php' => '4da79429580b285e2adbc5a5a5bc3ee0',
       'lan_mail_handler.php' => 'c66941db3d7dfc1dafd7ccfc63e8fc87',
       'lan_membersonly.php' => '426b6ed91b539457aa862daa8c5c0f4e',
       'lan_news.php' => 'ab5a0af1071796d8e59aa7443183d31d',
-      'lan_notify.php' => '31d041c6ab85cd43129b0d89a44291af',
+      'lan_notify.php' => 'f164668795657aebeaa131bca343f514',
       'lan_np.php' => '4cd32385b62a034f190957aab5b75809',
       'lan_online.php' => 'b6d815ef9e09bbea55b4c62be6dbb180',
       'lan_page.php' => '44578401a528e5aafa265f1909d05127',
@@ -1423,7 +1430,7 @@
       'lan_user.php' => 'e3f57415291d1bb80137dc2fe3e21393',
       'lan_user_extended.php' => 'bb63b4ee830081f93c5c1be9895dbc06',
       'lan_user_select.php' => 'cd5e96d51d480caf4db510d5fa524233',
-      'lan_userclass.php' => '0f52a39b5ca88ee357edaf2d111f568f',
+      'lan_userclass.php' => '40b64693371b18450bc558ba490a70f0',
       'lan_userposts.php' => 'c1b849be22e0e930e52131c16f20bc83',
       'lan_usersettings.php' => 'f20d15a09094bc922dc6e7ec6effa6a1',
     ),
@@ -1445,21 +1452,21 @@
       array (
         'English' => 
         array (
-          'lan_alt_auth_conf.php' => '012604e8400b5dfce4a4d95086152ac2',
-          'lan_ldap_auth.php' => '1fec91ecfe7419204ef65af051a249bd',
-          'lan_otherdb_auth.php' => '11309b4fe52763d7d28f94df64001016',
+          'lan_alt_auth_conf.php' => '46245577fa92a4e6f8433adb02cce599',
+          'lan_ldap_auth.php' => '6de5ce1aa7196074f8ac371d09e07123',
+          'lan_otherdb_auth.php' => '8c7225de41040b4fa88c7823f251195b',
         ),
       ),
-      'alt_auth_adminmenu.php' => '3dddfee80a662a804a06d833ad9d2670',
-      'alt_auth_conf.php' => 'f0bfd0afc82ff459fb0dfca96697c64d',
+      'alt_auth_adminmenu.php' => '76ca443efe3306eba249202b457c3561',
+      'alt_auth_conf.php' => '24aa231e6279075d184480213adaabba',
       'alt_auth_login_class.php' => '83cbf3d789a254fd761aa02073de0e74',
       'alt_auth_readme.txt' => '75b056df0169fa9a03bb31633d7fcbdb',
       'alt_login_class.php' => '1e0ceb9ed0a525f4e01fbe628f4fba37',
       'ldap_auth.php' => '5f008145891dcd7e42f1231f6381a73f',
-      'ldap_conf.php' => 'f5d3c58e8e292ad1d6b515886e46330a',
+      'ldap_conf.php' => '2a30966b13dddf1b49a7a07e8c518032',
       'otherdb_auth.php' => 'b5f874d3cf8faa136b5b5216fb981647',
-      'otherdb_conf.php' => 'dec34880c2f4fdeb20ab578ccbaa7bae',
-      'plugin.php' => '4c7bab7cda917b808fb991813a847558',
+      'otherdb_conf.php' => '72cd7b65920eb2e417de9e6df1e7ec3e',
+      'plugin.php' => 'ed2bd120747f1834163248570afea883',
     ),
     'alt_news' => 
     array (
@@ -1481,8 +1488,8 @@
         'English.php' => '0961198dae1f414bacbb40feb6b751af',
       ),
       'archive.php' => '1b2f8aa510e3e589fc36891a9589f5e8',
-      'blogcalendar_menu.php' => '53f9500d41a742c9196814e83462ccc7',
-      'calendar.php' => 'af97064cfe6841da536b5233baa616ef',
+      'blogcalendar_menu.php' => '3d7eca25264f6fac26a07e271264c289',
+      'calendar.php' => 'a8cd233f078a14f855728ea8995b4b39',
       'config.php' => '54296584044c95e21f9f6d95c7879b39',
       'functions.php' => '0441913d9f0759335ece338b918ee094',
       'styles.php' => '62ecc355feafc5310ad97a7df58c264b',
@@ -1544,7 +1551,7 @@
       'e_list.php' => '645f43cf7f01952906dbb83b8cb13cc0',
       'e_notify.php' => 'dac7e03da18f34b014f4692de2b17532',
       'e_rss.php' => '325d16e7d289ae41732a25ab75178c87',
-      'e_search.php' => '9dd5034774d238383271db97e289f76c',
+      'e_search.php' => '4ece2ee9bffc6fa603ebd479e0de0dea',
       'ecal_class.php' => '2899fcaf7a18fa5b5b0f905a3ee37786',
       'event.php' => '9e7ac615ce4b86b39364f5a1dbab8357',
       'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
@@ -1633,7 +1640,7 @@
         'content_convert_class.php' => 'efb3baae82fd0aa890d7b288f306720d',
         'content_db_class.php' => '36e1239b945ea5f23868f66560d88ae7',
         'content_defines.php' => '17705ead3b96dabdd746a32c8f29935f',
-        'content_form_class.php' => '21df2a946fb4e2230455c2247a7f4393',
+        'content_form_class.php' => 'eb872cc9322094ec93915a1bd92e7c20',
         'content_preset.php' => 'f3061b1451c85ffa473bf5520d41b49a',
       ),
       'images' => 
@@ -1756,7 +1763,7 @@
       'content.php' => 'fce17190563f678c19c24c2f402ae810',
       'content_manager.php' => '3041be3c78fcbd9d47eec36681b60d0e',
       'content_shortcodes.php' => '6fe643a18d7f1b8a877eed93f82bb165',
-      'content_sql.php' => 'd7a84ed35a0d9d8a671bfeb1006ca5eb',
+      'content_sql.php' => 'a7f25fe87558b9abe596dcc2de985df0',
       'content_submit.php' => '57fa063db6a52dcbc28d6afacd301eef',
       'content_update.php' => '4aae0d6c228ff659e8ea93dc975b3d21',
       'content_update_check.php' => 'b26a684630318dd56aa2ddeae77786e3',
@@ -1923,7 +1930,7 @@
         array (
           'lan_forum.php' => '49a0d82c1ae146419d52ad4d08786bb2',
           'lan_forum_admin.php' => '0eb27907ec2f619515f82b3a653f3c02',
-          'lan_forum_conf.php' => '0e5d0da729ab0ad41f90ce8dfc23fae1',
+          'lan_forum_conf.php' => '75c8e643e3a3982366ec80ad616e733f',
           'lan_forum_frontpage.php' => '80f99c88f4e92429d8ca40c439fd68d3',
           'lan_forum_notify.php' => 'd5ba57c5a1a59e72e726d0d04c8c5fce',
           'lan_forum_post.php' => 'ce9072f1ec06a3e3e83004094c591c29',
@@ -1960,11 +1967,11 @@
       'e_search.php' => 'f0c6eabebb2359afd8bc4557bbc3dd02',
       'e_status.php' => 'e707e64a960612d443e16906faaf0e22',
       'forum.php' => 'c953a361a1497f246d994a331569ea68',
-      'forum_admin.php' => '1a1cecdeddf2b485d945bedd8e236a0c',
+      'forum_admin.php' => 'b1e40e6d0d964ab7c726958d0bc945ab',
       'forum_class.php' => '73b910e41a07ad0aed085fb4e119384e',
       'forum_conf.php' => '2e9e8b1060173d5c1f376f5a1ba3b3ca',
       'forum_mod.php' => 'd32054b1725ca2c28e5995917093b37b',
-      'forum_post.php' => '50a3946ce4a17fee48dedb5875e65293',
+      'forum_post.php' => '7858447ba28038371abb6d02fa006be4',
       'forum_post_shortcodes.php' => '58d0390a6fa95d713603a203025eb3f2',
       'forum_shortcodes.php' => '7386595103ffe351e37b1f849b9ecee7',
       'forum_sql.php' => '5a3560b2363ea1d679036aa0a4eb2d2f',
@@ -1978,7 +1985,7 @@
       'index.php' => 'c7fcd091b1a82fd885b7d193595c7ad8',
       'newforumposts_menu.php' => '953569947c1522075f110ddcc0561dc6',
       'newforumposts_menu_config.php' => 'ffd1b077ee3529706ce587892e112bdb',
-      'plugin.php' => '3eccbbc3e0adcc145b0f4aea2a25f0cf',
+      'plugin.php' => '0084b9fb5052b574e36a64725bc15540',
     ),
     'gsitemap' => 
     array (
@@ -1991,7 +1998,7 @@
       array (
         'gsitemap_English.php' => '3ef04f9ce48cf9bd6ea602525ee98465',
       ),
-      'admin_config.php' => '8e979ca0655c04bdf9d90564330a9022',
+      'admin_config.php' => '0ad79a94c36d8a5812ce02d08fd1ad92',
       'gsitemap_sql.php' => '1b113956d7964d2b44a027cb8bcc91bb',
       'plugin.php' => '8b1ab5750ee9bba949ba6b52bd48fe03',
     ),
@@ -2033,7 +2040,7 @@
       ),
       'languages' => 
       array (
-        'English.php' => 'f2b2b76938fc723b5316cf7fb6bc2b86',
+        'English.php' => '7bec1caacb13856628debd49c2cf9a48',
         'English_help.php' => 'b7cf104c7a9f0d950dc1b5e6b68905b7',
       ),
       'link_images' => 
@@ -2046,7 +2053,7 @@
         'search_comments.php' => 'f887861124deb8c3b087359cb9f3210c',
         'search_parser.php' => '20039d017a7341b7902a80a44dd0df7f',
       ),
-      'admin_linkspage_config.php' => 'd828bf4cb8f599cd64c2b73e333f3d48',
+      'admin_linkspage_config.php' => '6d6458eeff9598e31a49f0290cf58e6c',
       'e_comment.php' => '13b0aa38e21d08a535276a7526cedde2',
       'e_frontpage.php' => 'afdc379a04c4918247d26559dfc4d4e2',
       'e_help.php' => '8358d0abfac6d1ed475bfca52a259b06',
@@ -2056,12 +2063,12 @@
       'e_rss.php' => 'd213cc9cc0d5eeed3442b861e565961e',
       'e_search.php' => '7a7416dde4bc42481cf92431f4832b65',
       'e_status.php' => 'e1b28e610e6f89277440430a2f8747d8',
-      'link_class.php' => 'ca56a4af2cabb5092f8591da60f0a309',
+      'link_class.php' => 'bb9dbbdba97963b3e317b42e0c9fe909',
       'link_defines.php' => 'c74dab30a2b3f330a05e4ac95a6c068a',
       'link_menu.php' => '4d088d2e0770954afcd78ac56456765b',
       'link_shortcodes.php' => '259ec21b4f86cd9ccf1b9d18aa7ad983',
       'links.php' => 'fa8e533d0b48f82edb3854dfcf3ddd8f',
-      'links_page_sql.php' => '25d000b7df2b32e190cdde75be17e19f',
+      'links_page_sql.php' => '95ed09107bb69cfeca3cdb8e0ec72bba',
       'links_template.php' => '0db68fac6783d782ec188fc7ad5a486e',
       'plugin.php' => 'fa8cc14316a027f2a5e69dac5ee58587',
     ),
@@ -2077,7 +2084,7 @@
         'English.php' => 'cdd4262dfe21daa49d2829f67c59a0de',
       ),
       'admin_config.php' => 'fb96cbde42a8d6ae8e7d41f84f5cea1c',
-      'linkwords.php' => 'f17376241f88a9d978b9f9122bf21f15',
+      'linkwords.php' => '4262c8db55367ad1392b8dbeee11733e',
       'linkwords_sql.php' => 'a846d028cfeeb778e7db62b1799962a1',
       'plugin.php' => 'ea8b844abebf6cad40a90dd1cd480ef6',
     ),
@@ -2108,14 +2115,14 @@
       ),
       'section' => 
       array (
-        'list_comment.php' => '5efa984e2682a3fd37cffc87d8e8f94c',
+        'list_comment.php' => '4b4b1351f16c073ac74b4fed7f388f78',
         'list_download.php' => '3102c9800ca28fa39e5bea9ec29efaa5',
         'list_members.php' => 'f2cec9a4125081502c309f794f72dc1b',
         'list_news.php' => '7faa1d6728ff1e692aa834ac4027c4e0',
       ),
       'admin_list_config.php' => '02d59542009fc531bd2cd803f02eac32',
       'list.php' => 'd944b381d79ba194ed8f3e816c07dfb7',
-      'list_class.php' => 'cd9f009b8c720ed7955b93fcce3f368f',
+      'list_class.php' => '0c8d2022c8cdff496c443a987fdc6144',
       'list_new_menu.php' => 'b47f1cb3fe0c97dd00635a45375e4acb',
       'list_recent_menu.php' => '50435ceb28a41e66f2adee448c3b1c7a',
       'list_shortcodes.php' => 'a633155a8d4377b4f2d7a8d5c54ea415',
@@ -2225,9 +2232,9 @@
         'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e',
       ),
       'admin_config.php' => 'f5b386d9f28260b3c6bfaa8d5ab91ddd',
-      'consolidate.php' => '4ad263421a3173059c6e3b37e2131890',
+      'consolidate.php' => 'e4a7d8cc1f8be71c7b49e46437c4adcd',
       'e_meta.php' => 'c7c1bff20fb308d2461bf3bf9ac89d45',
-      'log.php' => '30dc9d881572f1db10f770711969656a',
+      'log.php' => 'bdbc80558b0d01adb5e7bfcd7476c017',
       'log_sql.php' => 'd2f48ba525c87b3f11cf5758e68cc9d2',
       'log_update.php' => '96ffd24abbaadb7086b49d19feeb3763',
       'log_update_check.php' => '98648cff5205b2b3791648d955e979fc',
@@ -2284,7 +2291,7 @@
       'e_frontpage.php' => 'e382f0f562128593eb6f92ec404fa6e3',
       'e_help.php' => '3127973c339216ff9f080cc5edc51474',
       'newsfeed.php' => 'e4d7d6b2a4c3da4d0f1f5ab6d023ffeb',
-      'newsfeed_functions.php' => '930aa10475d1d72ed130e4a726c5fd17',
+      'newsfeed_functions.php' => '16e5d3c8e1551abc8baef365de46ab9b',
       'newsfeed_menu.php' => 'f2ca9780e96d8a86da73e4ca35fa66eb',
       'plugin.php' => '5bbfc89b2d9caf58cc2aa91f92c94918',
     ),
@@ -2382,7 +2389,7 @@
         'English.php' => 'c74373c9f5282591ecb0278fe6b75be5',
       ),
       'admin_pdf_config.php' => 'd2d40ad601eb21392dd53db414d0c7ea',
-      'e107pdf.php' => 'f8263fa492abcff351474262488e3e2a',
+      'e107pdf.php' => '042cea8d06e6cbd8d5308f7e4bac40f7',
       'fpdf.css' => '35c07d5049ac6e55b8ab473c6dc38bf0',
       'fpdf.php' => 'da7385d29345f1c12fe85b6cacf5e905',
       'pdf.php' => '913314caf7dce67dc08c0001879dc203',
@@ -2631,9 +2638,9 @@
         'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
         'reply_new_thread.png' => '62bf421db333810f70c415c7c59c6b15',
       ),
-      'admin_alt_nav.sc' => 'd1bd9236ba603535aa382bfd2af0201d',
-      'admin_style.css' => 'c1927ce8962dc5fae4fb8fb5eb8f5972',
-      'admin_template.php' => 'bec44c56a51d4eca92c53e52fa37fa8a',
+      'admin_alt_nav.sc' => '1120fe1616ab704e2fccde0873adfb25',
+      'admin_style.css' => 'e9c8dee3528b17a22d861bab02add4f7',
+      'admin_template.php' => 'b5e068b1fdb54ed15fe4c18d1f54cd78',
       'calendar_template.php' => '5269c1c83089a62d0d94a01705ecb6dc',
       'comment_menu_template.php' => '0b860a1796a979a0dcafb7407899f309',
       'demo_gallery_template.php' => 'f7b6623b94dcf31be77ba2ccd1f6ec54',
@@ -2649,7 +2656,7 @@
       'preview.jpg' => '969b0bbcc6454ea7bdb39f54df2f00c6',
       'style.css' => 'b895d98bff15819fecec3c422714211c',
       'theme.php' => '4059bf55f6cdd06ae7c7384f263484f0',
-      'usersettings_template.php' => '4ec9e8084cd224bebdeb4b90448f9f22',
+      'usersettings_template.php' => 'adecaf448389f81572e834bf5541081f',
     ),
     'crahan' => 
     array (
@@ -3103,9 +3110,9 @@
       'contact_template.php' => 'e5e3c69021c04c13918d4d166b642728',
       'download_template.php' => 'aec0e423eba7c807f677acd40dbf8314',
       'email_template.php' => '41869d37035cb352d450090e0e0237d0',
-      'footer_default.php' => 'c177167d6a9eee3d9515d73744d5fa5c',
+      'footer_default.php' => '174b457ee6db851b49035a8a8446a0aa',
       'fpw_template.php' => '1431ea272c9ff92a6263f0f229aafeff',
-      'header_default.php' => '4ba5c3888143b272f61ae1d171eceb97',
+      'header_default.php' => '3605ae5a560740666ec179b98a57a3f6',
       'index.html' => 'd41d8cd98f00b204e9800998ecf8427e',
       'login_template.php' => 'b33580598a6638c7f26370a56b4a030b',
       'membersonly_template.php' => '676ea2c380313007d32c89c62f83e6a7',
@@ -3117,7 +3124,7 @@
       'trackback_template.php' => 'fd54d8c26c75f9d380e8ec90860b0107',
       'user_template.php' => '678075f8a8c4a0e5720a0e8050ebca8d',
       'userposts_template.php' => '9f79c479f467aab1971f67b403f423ba',
-      'usersettings_template.php' => 'ccfc36f695b7afe6477abf9b8ce2b653',
+      'usersettings_template.php' => '33799626146c798a6559f729da15e732',
     ),
     'vekna_blue' => 
     array (
@@ -3151,7 +3158,7 @@
   ),
   'article.php' => '99ff41edab6c0488b360b34db5264b11',
   'banner.php' => '1103034d2d9220f93aa7511952c9c79a',
-  'class2.php' => '8b391768a5c32aadf617c36ec23a5a75',
+  'class2.php' => '07f9b17b214d779dac3b5f5e1b6cedad',
   'comment.php' => '8ac267b76a39a29f183041e988efd33b',
   'contact.php' => 'ea2c1d44da9b4d1963ca5d79b5e6f21b',
   'content.php' => 'f7c62efce19e34901f7d3366cd3855ce',
@@ -3170,14 +3177,14 @@
   'links.php' => 'bed206fc2abe8f1307ef4db3b7fee63e',
   'login.php' => 'd3864019b3d0d21446f0006a32ce1ebe',
   'membersonly.php' => '9ddbd174e30439869f144bb7dc41f677',
-  'news.php' => '37e239533b5ea7807f1a48615ed0fe2d',
+  'news.php' => '8d4c38ec568c7edc3b0619e4258cec79',
   'online.php' => 'dedde4aafef396cbc2f145fb3f6ba020',
   'page.php' => '890ebaf60b434685178082e720db3744',
   'print.php' => 'ff80b3a7061f43d2d17a87339c20abcd',
   'rate.php' => '6a28db191f8bb1ebca3b060d867647eb',
   'request.php' => '70a5ff9866c53204cab4077a87bdd90e',
-  'search.php' => '4a659b16ee93b16e8dc0e9422c305ed4',
-  'signup.php' => '699b74e3acf37f7b4007f808acb199a6',
+  'search.php' => '4e40a72859ba224230d6be5081d34dc4',
+  'signup.php' => 'bb0a044f05d77768f05d3ddedf0b0a34',
   'sitedown.php' => 'b4ed625d7fccd4bac6cb0564af53e549',
   'subcontent.php' => '13134ebbb9c45234963500e05d9e692f',
   'submitnews.php' => 'ce1763c73637a115b0a77d788f62ae62',
diff -x .svn -aruN 1.0.0.src/e107_admin/cpage.php 1.0.2.src/e107_admin/cpage.php
--- 1.0.0.src/e107_admin/cpage.php	2012-10-30 15:39:55.473442025 +0000
+++ 1.0.2.src/e107_admin/cpage.php	2012-10-30 15:40:38.285442733 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/cpage.php $
-|     $Revision: 12145 $
-|     $Id: cpage.php 12145 2011-04-19 01:29:45Z e107coders $
+|     $Revision: 12848 $
+|     $Id: cpage.php 12848 2012-06-28 01:33:31Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -108,7 +108,7 @@
 
 		$text = "<div style='text-align: center;'>";
 
-		if(!$sql -> db_Select("page", "*", "ORDER BY page_datestamp DESC", "nowhere"))
+		if(!$sql -> db_Select("page", "*", "ORDER BY Field(page_theme,'') DESC, page_id DESC", "nowhere"))
 		{
 			$text .= CUSLAN_42;
 		}
@@ -116,27 +116,45 @@
 		{
 			$pages = $sql -> db_getList('ALL', FALSE, FALSE);
 			$text .= "<form action='".e_SELF."' id='newsform' method='post'>
-			<table style='".ADMIN_WIDTH."' class='fborder'>
+			<table style='".ADMIN_WIDTH."' class='fborder'>\n";
+			
+			$head = "
 			<tr>
 			<td style='width:5%; text-align: center;' class='fcaption'>ID</td>
 			<td style='width:60%' class='fcaption'>".CUSLAN_1."</td>
 			<td style='width:15%; text-align: center;' class='fcaption'>".CUSLAN_2."</td>
 			<td style='width:20%; text-align: center;' class='fcaption'>".CUSLAN_3."</td>
 			</tr>";
+		
+			$text .= $head;
 
+			$prev = "";
+			
 			foreach($pages as $pge)
 			{
+				
+				$type = ($pge['page_theme'] ? "menu" : "page");
+				
+				if($type != $prev && $prev !='')
+				{
+					$text .= "<tr><td  colspan='4'>&nbsp;</td></tr>".$head;				
+				
+				}
+
+				
 			  $title_text = $pge['page_title'] ? $pge['page_title'] : ($pge['page_theme'] ? CUSLAN_43.$pge['page_theme'] : CUSLAN_44);
 			  $text .= "
 				<tr>
 				<td style='width:5%; text-align: center;' class='forumheader3'>{$pge['page_id']}</td>
 				<td style='width:60%' class='forumheader3'><a href='".($pge['page_theme'] ? e_ADMIN."menus.php" : e_BASE."page.php?{$pge['page_id']}" )."'>{$title_text}</a></td>
-				<td style='width:15%; text-align: center;' class='forumheader3'>".($pge['page_theme'] ? "menu" : "page")."</td>
+				<td style='width:15%; text-align: center;' class='forumheader3'>".($type)."</td>
 				<td style='width:20%; text-align: center;' class='forumheader3'>
 				<a href='".e_SELF."?".($pge['page_theme'] ? "createm": "create").".edit.{$pge['page_id']}'>".ADMIN_EDIT_ICON."</a>
 				<input type='image' title='".LAN_DELETE."' name='delete[{$pge['page_id']}]' src='".ADMIN_DELETE_ICON_PATH."' onclick=\"return jsconfirm('".CUSLAN_4." [ ID: $pge[page_id] ]')\"/>
 				</td>
 				</tr>";
+				
+				$prev = ($pge['page_theme'] ? "menu" : "page");
 			}
 
 			$text .= "
@@ -294,7 +312,7 @@
 
 	function submitPage($mode = FALSE, $type=FALSE)
 	{
-		global $sql, $tp, $e107cache;
+		global $sql, $tp, $e107cache,$pref;
 
 		$page_title = $tp -> toDB($_POST['page_title']);
 		$page_text = $tp -> toDB($_POST['data']);
@@ -329,6 +347,17 @@
 					}
 				}
 			}
+			
+			// Prevent links being updated in another language unless the table is present. 
+			if(($pref['sitelanguage'] != $sql->mySQLlanguage) && ($sql->mySQLlanguage!='') && ($sql->db_IsLang("links")=='links'))
+			{
+				//echo "DISABLED LINK CREATION";
+				//echo ' Sitelan='.$pref['sitelanguage'];
+				//echo " Dblang=".$sql->mySQLlanguage;
+				//echo " Links=".$sql->db_IsLang("links");
+			
+				return;	
+			}
 
 			if ($_POST['page_link'])
 			{
@@ -364,6 +393,18 @@
 			{
 				$sql -> db_Insert("menus", "0, '$menuname', '0', '0', '0', '', '".mysql_insert_id()."' ");
 			}
+			
+
+			// Prevent links being updated in another language unless the table is present. 
+			if((($pref['sitelanguage'] != $sql->mySQLlanguage) && ($sql->mySQLlanguage!='')) && ($sql->db_IsLang("links")=='links'))
+			{
+				//echo "DISABLED LINK CREATION";
+				//echo ' Sitelan='.$pref['sitelanguage'];
+				//echo " Dblang=".$sql->mySQLlanguage;
+				//echo " Links=".$sql->db_IsLang("links");
+			
+				return;	
+			}
 
 			if($_POST['page_link'])
 			{
diff -x .svn -aruN 1.0.0.src/e107_admin/download.php 1.0.2.src/e107_admin/download.php
--- 1.0.0.src/e107_admin/download.php	2012-10-30 15:39:55.466445990 +0000
+++ 1.0.2.src/e107_admin/download.php	2012-10-30 15:40:38.286444287 +0000
@@ -10,9 +10,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/download.php $
-|     $Revision: 11868 $
-|     $Id: download.php 11868 2010-10-09 11:51:09Z e107coders $
-|     $Author: e107coders $
+|     $Revision: 12599 $
+|     $Id: download.php 12599 2012-02-27 14:31:16Z nlstart $
+|     $Author: nlstart $
 +----------------------------------------------------------------------------+
 */
 
@@ -262,6 +262,10 @@
 	$download->show_categories($sub_action, $id);
 }
 
+if ($action == "requests")
+{
+	$download->show_requests($sub_action);
+}
 
 if ($delete == 'main')
 {
@@ -629,6 +633,16 @@
 				case "download_comment" :
                   $text .= ($row[$disp]) ? ADMIN_TRUE_ICON : "&nbsp;";
 				  break;
+				case "download_requested" :
+				  if($row[$disp]>0)
+				  {
+					$text .= "<a href='".e_SELF."?requests.".$row['download_id']."' alt=''>".$row[$disp]."</a>";
+				  }
+				  else
+				  {	// Display zero requested without link
+					$text .= $row[$disp];
+				  }
+				  break;
 				default :
 				  $text .= $row[$disp]."&nbsp;";
 			  }
@@ -1901,6 +1915,54 @@
 		}
 	}
 
+	
+	function show_requests($id)
+	{
+		global $sql,$ns;
+		include_once(e_HANDLER."date_handler.php");
+		$gen = new convert();
+		$sql2 = new db();
+		$query2 = "
+			SELECT r.*,d.*
+			FROM #download_requests AS r
+			JOIN #download AS d ON download_request_download_id = download_id
+			WHERE download_request_download_id =".intval($id)."
+			ORDER BY r.download_request_datestamp DESC
+			";
+		$sql2->db_Select_Gen($query2);
+		$text = "
+			<table style='".ADMIN_WIDTH."' class='fborder'>
+			<tr>
+				<td style='width: 30%;' class='forumheader'>".DOWLAN_163."</td>
+				<td style='width: 30%;' class='forumheader'>".DOWLAN_164."</td>
+				<td style='width: 40%;' class='forumheader'>".DOWLAN_165."</td>
+			</tr>
+		";
+		while ($row2 = $sql2->db_Fetch()) 
+		{
+			extract($row2);
+			if ($user = get_user_data($row2['download_request_userid'])) 
+			{
+				$user_name = $user["user_name"];
+			}
+			$download_request_datestamp = $gen->convert_date($row2['download_request_datestamp'], "short");
+			$text .= 
+			"<tr>
+				<td style='width: 30%;' class='forumheader3'><a href='".SITEURL."user.php?id.".$row2['download_request_userid']."' alt=''>".$user_name."</a></td>
+				<td style='width: 30%;' class='forumheader3'>".$row2['download_request_ip']."</td>
+				<td style='width: 40%;' class='forumheader3'>".$download_request_datestamp."</td>
+			</tr>";
+			$download_name = $row2['download_name'];
+		}
+		$text .= "
+			</table>
+			<br />
+			<div style='text-align:center;'><input class='button' type='submit' value='".DOWLAN_166."' onClick='history.go(-1)' /></div>			
+			";
+		$ns -> tablerender(DOWLAN_162." '".$download_name."'", $text);
+		return TRUE;
+	}
+	
 // -------------------------------------------------------------------------
 
 
diff -x .svn -aruN 1.0.0.src/e107_admin/lancheck.php 1.0.2.src/e107_admin/lancheck.php
--- 1.0.0.src/e107_admin/lancheck.php	2012-10-30 15:39:55.468444500 +0000
+++ 1.0.2.src/e107_admin/lancheck.php	2012-10-30 15:40:38.290444623 +0000
@@ -11,341 +11,724 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/lancheck.php $
-|     $Revision: 11868 $
-|     $Id: lancheck.php 11868 2010-10-09 11:51:09Z e107coders $
+|     $Revision: 12903 $
+|     $Id: lancheck.php 12903 2012-07-23 07:37:12Z e107coders $
 |     $Author: e107coders $
 |	  With code from Izydor and Lolo.
 +----------------------------------------------------------------------------+
 */
 require_once("../class2.php");
-if (!getperms("0")) {
+if (!getperms("L")) {
 	header("location:".e_BASE."index.php");
 	exit;
 }
-$e_sub_cat = 'language';
-require_once("auth.php");
 
-$qry = explode("|",e_QUERY);
-$f = varset($qry[0]);
-$lan = varset($qry[1]);
-$mode = varset($qry[2]);
 
-if($f == "tools" || $f == "db" || $f == "modify")
-{
-	$f = "";
-	
-}
 
-// Write the language file.
-if(isset($_POST['submit']))
+class lancheck
 {
+	
+	var $core_plugins = array(
+		"alt_auth","banner_menu","blogcalendar_menu","calendar_menu","chatbox_menu",
+		"clock_menu","comment_menu","compliance_menu","content","counter_menu",
+		"featurebox","forum","gsitemap","integrity_check","lastseen","links_page",
+		"linkwords","list_new","log","login_menu","newforumposts_main","newsfeed",
+		"newsletter","online_extended_menu","online_menu","other_news_menu","pdf",
+		"pm","poll","powered_by_menu","rss_menu","search_menu","sitebutton_menu",
+		"trackback","tree_menu","userlanguage_menu","usertheme_menu"
+		);
+		
+	var $core_themes = array("crahan","core","e107v4a","human_condition","interfectus","jayya",
+		"khatru","kubrick","lamb","leaf","sebes","vekna_blue");
+		
+	var $errorsOnly = FALSE;
+	
+	var $coreImage = array();
 
-	unset($input);
-	$kom_start = chr(47)."*";
-	$kom_end = "*".chr(47);
-
-	if($_POST['root'])
+	
+	function init()
 	{
-		$writeit = $_POST['root'];
-	}
+		global $ns,$tp;
+		
+		$acceptedLans = explode(",",e_LANLIST);
+	
+		
+		if(!isset($_SESSION['lancheck-core-image']))
+		{
+			$core = array();	
 
-	$old_kom = "";
-	$in_kom=0;
-	$data = file($writeit);
-	foreach($data as $line)
-	{
+			$coredir = array('admin' => 'e107_admin', 'files' => 'e107_files', 'images' => 'e107_images', 'themes' => 'e107_themes', 'plugins' => 'e107_plugins', 'handlers' => 'e107_handlers', 'languages' => 'e107_languages', 'downloads' => 'e107_downloads', 'docs' => 'e107_docs');
+			
+			require_once(e_ADMIN."core_image.php");
+			
+			unset($core_image['e107_images'],$core_image['e107_files'],$core_image['e107_admin']);
+			
+			$_SESSION['lancheck-core-image'] = $core_image;	
+		}
+		
 
-		if (strpos($line,$kom_start) !== False && $old_kom == "")
+			
+		if(isset($_POST['language_sel'])) // Verify
 		{
-			$in_kom=1;
+			
+			$_SESSION['lancheck-errors-only'] 	= ($_POST['errorsonly']==1 ) ?  1 : 0;	
+			$this->errorsOnly 					= ($_POST['errorsonly']==1) ?  TRUE : FALSE;
+			$this->check_all();
+			return TRUE;
 		}
-		if ($in_kom) { $old_kom.=$line; }
-		if (strpos($line,$kom_end) !== False && $in_kom) {$in_kom = 0;}
+		
+		// Write the language file.
+		if(isset($_POST['submit']) && varsettrue($_POST['lan']) && in_array($_POST['lan'],$acceptedLans))
+		{
+			
+			$this->write_lanfile($_POST['lan']);	
+			return TRUE;	
+		} 
+		
+		// Edit the Language File.
+		if(varsettrue($_GET['f']) && varsettrue($_GET['lan']) && in_array($_GET['lan'],$acceptedLans))
+		{
+			
+			if (!$_GET['mode'])
+			{
+				$dir1 =  e_LANGUAGEDIR."English/";
+				$f1= $tp->toDB($_GET['f']);
+				$dir2 =  e_LANGUAGEDIR.$_GET['lan']."/";
+				$f2= $tp->toDB($_GET['f']);
+			}
+			else
+			{
+				$fullpath_orig = $tp->toDB($_GET['f']);
+				$fullpath_trans = str_replace("English",$_GET['lan'],$tp->toDB($_GET['f']));
+		
+				$f1 = basename($fullpath_orig);
+				$f2 = basename($fullpath_trans);
+				$dir1 = dirname($fullpath_orig)."/";
+				$dir2 = dirname($fullpath_trans)."/";
+			}
+			
+			$this->edit_lanfiles($dir1,$dir2,$f1,$f2,$_GET['lan']);	
+			return TRUE;	
+		}	
+		
+		return FALSE;
 	}
-
-
-	$message = "<div style='text-align:left'><br />";
-	$input .= chr(60)."?php\n";
-	if ($old_kom == "")
+	
+	
+	function countFiles($array)
 	{
-		// create CVS compatible description.
-		$diz = chr(47)."*\n";
-		$diz .= "+---------------------------------------------------------------+\n";
-		$diz .= "|        e107 website system ".$lan." Language File\n";
-		$diz .= "|        Released under the terms and conditions of the\n";
-		$diz .= "|        GNU General Public License (http://gnu.org).\n";
-		$diz .= "|\n";
-		$diz .= "|        ".chr(36)."URL: $writeit ".chr(36)."\n";
-		$diz .= "|        ".chr(36)."Revision: 1.0 ".chr(36)."\n";
-		$diz .= "|        ".chr(36)."Id: ".date("Y/m/d H:i:s")." ".chr(36)."\n";
-		$diz .= "|        ".chr(36)."Author: ".USERNAME." ".chr(36)."\n";
-		$diz .= "+---------------------------------------------------------------+\n";
-		$diz .= "*".chr(47)."\n\n";
+		foreach($array as $k=>$val)
+		{
+			if(is_array($val))
+			{
+				$key = key($val);
+				$this->coreImage[$key] = $val;
+			}
+			elseif($val)
+			{
+			//	$this->totalFiles++;		
+			}	
+			
+		}	
 	}
-	else
+	
+	
+	
+	function check_all($mode='render')
 	{
-		$diz = $old_kom;
-	}
+		global $ns,$tp;
+			
+		$_POST['language'] = key($_POST['language_sel']);
+
+		$_SESSION['lancheck'][$_POST['language']] = array();
+		$_SESSION['lancheck'][$_POST['language']]['file']	= 0;
+		$_SESSION['lancheck'][$_POST['language']]['def']	= 0;
+		$_SESSION['lancheck'][$_POST['language']]['bom']	= 0;
+		$_SESSION['lancheck'][$_POST['language']]['utf']	= 0;
+		$_SESSION['lancheck'][$_POST['language']]['total']	= 0;
+	
+	
+		$core_text 	= $this->check_core_lanfiles($_POST['language']);
+		$core_admin = $this->check_core_lanfiles($_POST['language'],"admin/");
+		$plug_text = "";
+		$theme_text = "";
+	
+	
+		// Plugins -------------
+		$plug_header = "<table class='fborder' style='".ADMIN_WIDTH."'>
+		<tr>
+		<td class='fcaption'>".LAN_PLUGIN."</td>
+		<td class='fcaption'>".LAN_CHECK_16."</td>
+		<td class='fcaption'>".$_POST['language']."</td>
+		<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
+	
+		foreach($this->core_plugins as $plugs)
+		{
+			if(is_readable(e_PLUGIN.$plugs))
+			{
+				$plug_text .= $this->check_lanfiles('P',$plugs,"English",$_POST['language']);
+			}
+		}
+		
+		$plug_footer = "</table>";
+	
+		// Themes  -------------
+		$theme_header = "<table class='fborder' style='".ADMIN_WIDTH."'>
+		<tr>
+		<td class='fcaption'>".LAN_CHECK_22."</td>
+		<td class='fcaption'>".LAN_CHECK_16."</td>
+		<td class='fcaption'>".$_POST['language']."</td>
+		<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
+		foreach($this->core_themes as $them)
+		{
+			if(is_readable(e_THEME.$them))
+			{
+				$theme_text .= $this->check_lanfiles('T',$them,"English",$_POST['language']);
+			}
+		}
+		$theme_footer = "</table>";
+		
+		// -------------------------
+		
+
+		
+		
+		if($mode != 'render')
+		{
+			 return;
+		}
+	
+		$message .= "<div style='".ADMIN_WIDTH.";text-align:center;padding:20px'>
+		<form id='lancheck' method='post' action='".e_ADMIN."language.php?tools'>
+		<div>\n";
+		
+		$icon = ($_SESSION['lancheck'][$_POST['language']]['total']>0) ? ADMIN_FALSE_ICON : ADMIN_TRUE_ICON;	
+		
+		
+		$errors_diz = (defsettrue('LAN_CHECK_23')) ? LAN_CHECK_23 : "Errors Found";
+		
+		$message .= "<div>".$icon." ".$errors_diz.": ".$_SESSION['lancheck'][$_POST['language']]['total']."</div>";	
+	
+		$just_go_diz = (defsettrue('LAN_CHECK_20')) ? LAN_CHECK_20 : "Generate Language Pack";
+		$lang_sel_diz = (defsettrue('LAN_CHECK_21')) ? LAN_CHECK_21 : "Verify Again";
+		$lan_pleasewait = (defsettrue('LAN_PLEASEWAIT')) ?  $tp->toJS(LAN_PLEASEWAIT) : "Please Wait";
+		
+		$message .= "
+		<br /><br />
+		<input type='hidden' name='language' value='".$_POST['language']."' />
+		<input type='hidden' name='errorsonly' value='".$_SESSION['lancheck-errors-only']."' />    
+	    <input type='submit' name='ziplang[".$_POST['language']."]' value=\"".$just_go_diz."\" class='button' onclick=\"this.value = '".$lan_pleasewait."'\" />
+	    <input type='submit' name='language_sel[".$_POST['language']."]' value=\"".$lang_sel_diz."\" class='button' />
+		</div>
+	    </form>
+		</div>";
+		
+//	print_a($_SESSION['lancheck'][$_POST['language']]);
 
-	$input .= $diz;
-	$message .= str_replace("\n","<br />",$diz);
+		$plug_text = ($plug_text) ? $plug_header.$plug_text.$plug_footer : "<div>".LAN_OK."</div>";	
+		$theme_text = ($theme_text) ? $theme_header.$theme_text.$theme_footer : "<div>".LAN_OK."</div>";	
 
-	for ($i=0; $i<count($_POST['newlang']); $i++)
+			
+		$ns -> tablerender(LAN_CHECK_24.": ".$_POST['language'],$message);
+	
+		$ns -> tablerender(LAN_CHECK_3.": ".$_POST['language'], $core_text);
+		$ns -> tablerender(LAN_CHECK_3.": ".$_POST['language']."/admin", $core_admin);
+		$ns -> tablerender(ADLAN_CL_7, $plug_text);
+		$ns -> tablerender(LAN_CHECK_25, $theme_text);	
+		
+	}
+	
+	
+	function write_lanfile($lan='')
 	{
-		$notdef_start = "";
-		$notdef_end = "\n";
-		$deflang = (MAGIC_QUOTES_GPC === TRUE) ? stripslashes($_POST['newlang'][$i]) : $_POST['newlang'][$i];
-		$func = "define";
-		$quote = chr(34);
-
-		if (strpos($_POST['newdef'][$i],"ndef++") !== FALSE )
-		{
-			$defvar = str_replace("ndef++","",$_POST['newdef'][$i]);
-			$notdef_start = "if (!defined(".chr(34).$defvar.chr(34).")) {";
-			$notdef_end = "}\n";
+		if(!$lan){ 	return; }
+		
+		global $ns;
+		
+		unset($input);
+		$kom_start = chr(47)."*";
+		$kom_end = "*".chr(47);
+	
+		if(varsettrue($_SESSION['lancheck-edit-file']))
+		{
+			$writeit = $_SESSION['lancheck-edit-file'];
 		}
 		else
 		{
-			$defvar = $_POST['newdef'][$i];
+			return;	
 		}
-
-		if($_POST['newdef'][$i] == "LC_ALL" && isset($_POST['root']))
+	
+		$old_kom = "";
+		$in_kom=0;
+		
+		if(is_readable($writeit)) // File Exists; 
 		{
-			$message .= $notdef_start.'setlocale('.htmlentities($defvar).','.$deflang.');<br />'.$notdef_end;
-			$input .= $notdef_start."setlocale(".$defvar.",".$deflang.");".$notdef_end;
+			$data = file($writeit);
+			foreach($data as $line)
+			{
+		
+				if (strpos($line,$kom_start) !== False && $old_kom == "")
+				{
+					$in_kom=1;
+				}
+				if ($in_kom) { $old_kom .= $line; }
+				if (strpos($line,$kom_end) !== False && $in_kom) {$in_kom = 0;}
+			}	
+		}
+		
+	
+	
+		$message = "<div style='text-align:left'><br />";
+		$input .= chr(60)."?php\n";
+		if ($old_kom == "")
+		{
+			// create CVS compatible description.
+			$diz = chr(47)."*\n";
+			$diz .= "+---------------------------------------------------------------+\n";
+			$diz .= "|        e107 website content management system ".$lan." Language File\n";
+			$diz .= "|        Released under the terms and conditions of the\n";
+			$diz .= "|        GNU General Public License (http://gnu.org).\n";
+			$diz .= "|\n";
+			$diz .= "|        ".chr(36)."URL: $writeit ".chr(36)."\n";
+			$diz .= "|        ".chr(36)."Revision: 1.0 ".chr(36)."\n";
+			$diz .= "|        ".chr(36)."Id: ".date("Y/m/d H:i:s")." ".chr(36)."\n";
+			$diz .= "|        ".chr(36)."Author: ".USERNAME." ".chr(36)."\n";
+			$diz .= "+---------------------------------------------------------------+\n";
+			$diz .= "*".chr(47)."\n\n";
 		}
 		else
 		{
-			$message .= $notdef_start.$func.'('.$quote.htmlentities($defvar).$quote.',"'.$deflang.'");<br />'.$notdef_end;
-			$input .= $notdef_start.$func."(".$quote.$defvar.$quote.", ".chr(34).$deflang.chr(34).");".$notdef_end;
+			$diz = $old_kom;
 		}
+	
+		$input .= $diz;
+		$message .= str_replace("\n","<br />",$diz);
+	
+		for ($i=0; $i<count($_POST['newlang']); $i++)
+		{
+			$notdef_start = "";
+			$notdef_end = "\n";
+			$deflang = (MAGIC_QUOTES_GPC === TRUE) ? stripslashes($_POST['newlang'][$i]) : $_POST['newlang'][$i];
+			$func = "define";
+			$quote = chr(34);
+	
+			if (strpos($_POST['newdef'][$i],"ndef++") !== FALSE )
+			{
+				$defvar = str_replace("ndef++","",$_POST['newdef'][$i]);
+				$notdef_start = "if (!defined(".chr(34).$defvar.chr(34).")) {";
+				$notdef_end = "}\n";
+			}
+			else
+			{
+				$defvar = $_POST['newdef'][$i];
+			}
+	
+			if($_POST['newdef'][$i] == "LC_ALL" && varsettrue($_SESSION['lancheck-edit-file']))
+			{
+				$message .= $notdef_start.'setlocale('.htmlentities($defvar).','.$deflang.');<br />'.$notdef_end;
+				$input .= $notdef_start."setlocale(".$defvar.",".$deflang.");".$notdef_end;
+			}
+			else
+			{
+				$message .= $notdef_start.$func.'('.$quote.htmlentities($defvar).$quote.',"'.$deflang.'");<br />'.$notdef_end;
+				$input .= $notdef_start.$func."(".$quote.$defvar.$quote.", ".chr(34).$deflang.chr(34).");".$notdef_end;
+			}
+		}
+	
+		$message .="<br />";
+		$message .="</div>";
+		$input .= "\n\n?>";
+			//<?
+		// Write to file.
+		
+		$writeit = str_replace("//","/",$writeit); // Quick Fix. 
+		
+		$fp = @fopen($writeit,"w");
+		if(!@fwrite($fp, $input))
+		{
+			$caption = LAN_ERROR;
+			$message = LAN_CHECK_17;
+		}
+		else
+		{
+			$caption = LAN_SAVED." <b>".$lan."/".$writeit."</b>";
+		}
+		fclose($fp);
+	
+		$message .= "<form method='post' action='".e_SELF."?tools' id='select_lang'>
+		<div style='text-align:center'><br />";
+		$message .= "<br /><br /><input class='button' type='submit' name='language_sel[".$lan."]' value=\"".LAN_BACK."\" />
+		</div></form>";
+	
+		unset($_SESSION['lancheck-edit-file']);
+		$ns -> tablerender($caption, $message);
 	}
-
-	$message .="<br />";
-	$message .="</div>";
-	$input .= "\n\n?>";
-
-	// Write to file.
-	$fp = @fopen($writeit,"w");
-	if(!@fwrite($fp, $input))
-	{
-		$caption = LAN_ERROR;
-		$message = LAN_CHECK_17;
-	}
-	else
+	
+		
+		
+		
+	function check_core_lanfiles($checklan,$subdir='')
 	{
-		$caption = LAN_SAVED." <b>$lan/".$writeit."</b>";
-	}
-	fclose($writeit);
-
-	$message .= "<form method='post' action='".e_SELF."' id='select_lang'>
-	<div style='text-align:center'><br />";
-	$message .= "<br /><br /><input class='button' type='submit' name='language_sel' value=\"".LAN_BACK."\" />
-	<input type='hidden' name='language' value='$lan' /></div></form>";
-
-
-	$ns -> tablerender($caption, $message);
-	require_once(e_ADMIN."footer.php");
-	exit;
-}
+		global $lanfiles,$_POST,$sql;
+	
+	//	$sql->db_Mark_Time('Start Get Core Lan Phrases English');
+		$English = $this->get_comp_lan_phrases(e_LANGUAGEDIR."English/".$subdir,$checklan);
+		
+	//	$sql->db_Mark_Time('End Get Core Lan Phrases English');
+		
+		$check = $this->get_comp_lan_phrases(e_LANGUAGEDIR.$checklan."/".$subdir,$checklan);
+		
+	//	print_a($check);
+	//	return;
+		$text = "";
+	
+		$header = "<table class='fborder' style='".ADMIN_WIDTH."'>
+		<tr>
+		<td class='fcaption'>".LAN_CHECK_16."</td>
+		<td class='fcaption'>".$_POST['language']." ".LAN_CHECK_26."</td>
+		<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
+	
+		$keys = array_keys($English);
+	
+		sort($keys);
+		$er = "";
+	
+		foreach($keys as $k)
+		{
+			if($k != "bom")
+			{
+				$lnk = $k;
+				$k_check = str_replace("English",$checklan,$k);
+				if(array_key_exists($k,$check))
+				{
+					// $text .= "<tr><td class='forumheader3' style='width:45%'>{$lnk}</td>";
+					$subkeys = array_keys($English[$k]);
+	
+					$er="";
+					$utf_error = "";
+	
+					$bomkey = str_replace(".php","",$k_check);
+				//	$bom_error = ($check['bom'][$bomkey]) ? "<i>".LAN_CHECK_15."</i><br />" : ""; // illegal chars
+	
+					if($check['bom'][$bomkey])
+					{
+						$bom_error = "<i>".LAN_CHECK_15."</i><br />";
+						$this->checkLog('bom',1);;	
+					}
+					else
+					{
+						$bom_error = "";	
+					}
+	
+					foreach($subkeys as $sk)
+					{
+						if($utf_error == "" && !$this->is_utf8($check[$k][$sk]))
+						{
+							$utf_error = "<i>".LAN_CHECK_19."</i><br />";
+							$this->checkLog('utf',1);
+						}
+	
+						if($sk == "LC_ALL"){
+							$check[$k][$sk] = str_replace(chr(34).chr(34),"",$check[$k][$sk]);
+						}
+					
+						$er .= $this->check_lan_errors($English[$k],$check[$k],$sk);
+					}
+					
+					if($this->errorsOnly == TRUE && !$er && !$utf_error && !$bom_error)
+					{
+						continue;		
+					}
+						
+					$text .= "<tr><td class='forumheader3' style='width:45%'>{$lnk}</td>";
+					$style = ($er) ? "forumheader2" : "forumheader3";
+					$text .= "<td class='{$style}' style='width:50%'><div class='smalltext'>";
+					$text .= $bom_error . $utf_error;
+					$text .= (!$er && !$bom_error && !$utf_error) ? "<img src='".e_IMAGE."fileinspector/integrity_pass.png' alt='".LAN_OK."' />" : $er."<br />";
+					$text .= "</div></td>";
+				}
+				else
+				{
+					$this->checkLog('file',1);
+					$text .= "<tr>
+					<td class='forumheader3' style='width:45%'>{$lnk}</td>
+					<td class='forumheader' style='width:50%'>".LAN_CHECK_4."</td>"; // file missing.
+				}
+				// Leave in EDIT button for all entries - to allow re-translation of bad entries.
+				$subpath = ($subdir!='') ? $subdir.$k : $k;
+				$text .="<td class='forumheader3' style='width:5%;text-align:center'>
+				<input class='tbox' type='button' style='width:60px' name='but_$i' value=\"".LAN_EDIT."\" onclick=\"window.location='".e_SELF."?f=".$subpath."&amp;lan=".$_POST['language']."'\" /> ";
+				$text .="</td></tr>";
+			}
+		}
 
-// ============================================================================
+		$footer = "</table>";
+		
+		if($text)
+		{
+			return $header.$text.$footer;	
+		}
+		else
+		{
+		 	return "<div>".LAN_OK."</div>";
+		}
+	}
 
-// Edit the Language File.
 
-if($f != ""){
 
-	if (!$mode)
+	
+	function check_lan_errors($english,$translation,$def)
 	{
-		$dir1 =  e_BASE.$LANGUAGES_DIRECTORY."English/";
-		$f1=$f;
-		$dir2 =  e_BASE.$LANGUAGES_DIRECTORY.$lan."/";
-		$f2=$f;
+		$eng_line = $english[$def];
+		$trans_line = $translation[$def];
+		
+		// return $eng_line."<br />".$trans_line."<br /><br />";
+			
+		$error = array();
+			
+		if((!array_key_exists($def,$translation) && $eng_line != "") || (trim($trans_line) == "" && $eng_line != ""))
+		{
+			$this->checkLog('def',1);
+			return $def.": ".LAN_CHECK_5."<br />";
+		}
+		
+		if((strpos($eng_line,"[link=")!==FALSE && strpos($trans_line,"[link=")===FALSE) || (strpos($eng_line,"[b]")!==FALSE && strpos($trans_line,"[b]")===FALSE))
+		{
+			$error[] = $def. ": Missing bbcodes";
+		}
+		elseif((strpos($eng_line,"[")!==FALSE && strpos($trans_line,"[")===FALSE) || (strpos($eng_line,"]")!==FALSE && strpos($trans_line, "]")===FALSE))
+		{
+			$error[] = $def. ": Missing [ and/or ] character(s)";
+		}
+		
+		if((strpos($eng_line,"--LINK--")!==FALSE && strpos($trans_line,"--LINK--")==FALSE))
+		{
+			$error[] = $def. ": Missing --LINK--";
+		}
+		
+		if((strpos($eng_line,"e107.org")!==FALSE && strpos($trans_line,"e107.org")==FALSE))
+		{
+			$error[] = $def. ": Missing e107.org URL";
+		}
+		
+		if((strpos($eng_line,"e107coders.org")!==FALSE && strpos($trans_line,"e107coders.org")==FALSE))
+		{
+			$error[] = $def. ": Missing e107coders.org URL";
+		}
+		
+		if(strip_tags($eng_line) != $eng_line)
+		{
+			$stripped = strip_tags($trans_line);
+					
+			if(($stripped == $trans_line))
+			{					
+				// echo "<br /><br />".$def. "<br />".$stripped."<br />".$trans_line;
+				$error[] = $def. ": Missing HTML tags" ; 		
+			}
+		}
+		
+		$this->checkLog('def',count($error));
+	
+		return ($error) ? implode("<br />",$error)."<br />" : "";
+		
 	}
-	else
+	
+	
+	
+	
+	function checkLog($type='error',$count)
 	{
-		$fullpath_orig = $f;
-		$fullpath_trans = str_replace("English",$lan,$f);
-
-		$f1 = basename($fullpath_orig);
-		$f2 = basename($fullpath_trans);
-		$dir1 = dirname($fullpath_orig)."/";
-		$dir2 = dirname($fullpath_trans)."/";
+		$_SESSION['lancheck'][$_POST['language']][$type] += $count;
+		$_SESSION['lancheck'][$_POST['language']]['total'] += $count;
 	}
-
-	edit_lanfiles($dir1,$dir2,$f1,$f2);
-
-}
-
-// ===========================================================================
-
-$core_plugins = array(
-"alt_auth","banner_menu","blogcalendar_menu","calendar_menu","chatbox_menu",
-"clock_menu","comment_menu","compliance_menu","content","counter_menu",
-"featurebox","forum","gsitemap","integrity_check","lastseen","links_page",
-"linkwords","list_new","log","login_menu","newforumposts_main","newsfeed",
-"newsletter","online_extended_menu","online_menu","other_news_menu","pdf",
-"pm","poll","powered_by_menu","rss_menu","search_menu","sitebutton_menu",
-"trackback","tree_menu","userlanguage_menu","usertheme_menu"
-);
-
-$core_themes = array("crahan","e107v4a","human_condition","interfectus","jayya",
-"khatru","kubrick","lamb","leaf","reline","sebes","vekna_blue");
-
-
-if(isset($_POST['language_sel'])){
 	
-	$_POST['language'] = key($_POST['language_sel']);
-
-	$_SESSION['lancheck_'.$_POST['language']] = array();
-	$_SESSION['lancheck_'.$_POST['language']]['file']	= 0;
-	$_SESSION['lancheck_'.$_POST['language']]['def']	= 0;
-	$_SESSION['lancheck_'.$_POST['language']]['bom']	= 0;
-	$_SESSION['lancheck_'.$_POST['language']]['utf']	= 0;
-	$_SESSION['lancheck_'.$_POST['language']]['total']	= 0;
-
-
-	$core_text = check_core_lanfiles($_POST['language']);
-	$core_admin = check_core_lanfiles($_POST['language'],"admin/");
-
-	$plug_text = "<table class='fborder' style='".ADMIN_WIDTH."'>
-	<tr>
-	<td class='fcaption'>".LAN_PLUGIN."</td>
-	<td class='fcaption'>".LAN_CHECK_16."</td>
-	<td class='fcaption'>".$_POST['language']."</td>
-	<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
-
-	foreach($core_plugins as $plugs)
-	{
-		if(is_readable(e_PLUGIN.$plugs))
+	
+	
+	function get_lan_file_phrases($dir1,$dir2,$file1,$file2){
+	
+		$ret = array();
+		$fname = $dir1.$file1;
+		$type='orig';
+	
+		if(is_file($fname))
+		{
+			$data = file_get_contents($fname);
+			$ret= $ret + $this->fill_phrases_array($data,$type);
+			if(substr($data,0,5) != "<?php")
+			{
+				$key = str_replace(".php","",$fname);
+				$ret['bom'][$key] = $fname;
+			}
+		}
+	
+		$fname = $dir2.$file2;
+		$type='tran';
+	
+		if(is_file($fname))
 		{
-			$plug_text .= check_lanfiles('P',$plugs,"English",$_POST['language']);
+			$data = file_get_contents($fname);
+			$ret=$ret + $this->fill_phrases_array($data,$type);
+			if(substr($data,0,5) != "<?php")
+			{
+				$key = str_replace(".php","",$fname);
+				$ret['bom'][$key] = $fname;
+			}
 		}
+		
+	
+		return $ret;
 	}
-	$plug_text .= "</table>";
-
-
-	$theme_text = "<table class='fborder' style='".ADMIN_WIDTH."'>
-	<tr>
-	<td class='fcaption'>".LAN_CHECK_22."</td>
-	<td class='fcaption'>".LAN_CHECK_16."</td>
-	<td class='fcaption'>".$_POST['language']."</td>
-	<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
-	foreach($core_themes as $them)
+	
+	
+	
+	
+	function get_comp_lan_phrases($comp_dir,$lang,$depth=0)
 	{
-		if(is_readable(e_THEME.$them))
+		if(!is_dir($comp_dir))
 		{
-			$theme_text .= check_lanfiles('T',$them,"English",$_POST['language']);
+			return array();
+		}
+		
+		
+		require_once(e_HANDLER."file_class.php");
+		$fl = new e_file;
+		$ret = array();
+			
+		if($lang_array = $fl->get_files($comp_dir, ".php$","standard",$depth)){
+			sort($lang_array);
 		}
-	}
-	$theme_text .= "</table>";
-
-	$message .= "<div style='".ADMIN_WIDTH.";text-align:center;padding:20px'>
-	<form name='lancheck' method='post' action='".e_ADMIN."language.php?tools'>";
 	
-	$icon = ($_SESSION['lancheck_'.$_POST['language']]['total']>0) ? ADMIN_FALSE_ICON : ADMIN_TRUE_ICON;	
+		$regexp = (strpos($comp_dir,e_LANGUAGEDIR) !== FALSE) ? "#.php#" : "#".$lang."#";
 	
+		foreach($lang_array as $f)
+		{
+			if(preg_match($regexp,$f['path'].$f['fname']) && is_file($f['path'].$f['fname']))
+			{
+				$allData = file_get_contents($f['path'].$f['fname']);
+				$data = explode("\n",$allData);
+				// $data = file($f['path'].$f['fname']);
+				$relpath = str_replace($comp_dir,"",$f['path']);
+				
+				$key = str_replace(".php","",$relpath.$f['fname']);
+				
+				if(substr($data[0],0,5) != "<?php")
+				{
+					
+					$ret['bom'][$key] = $f['fname'];
+				}
+						
+				$end_of_file = 0;
+							
+				foreach($data as $line)
+				{
+					if($end_of_file == 1)
+					{
+						$ret['bom'][$key] = $f['fname'];
+					}
+											
+					$line = trim($line);
+					if($line == "?>")
+					{
+						$end_of_file = 1;  	
+					}
+				}
+					
+			
+				
+				if($f['path'].$f['fname'] == e_LANGUAGEDIR.$lang."/".$lang.".php")
+				{
+					$f['fname'] = "English.php";  // change the key for the main language file.
+				}
 	
-	$errors_diz = (defsettrue('LAN_CHECK_23')) ? LAN_CHECK_23 : "Errors Found";
+				if($f['path'].$f['fname'] == e_LANGUAGEDIR.$lang."/".$lang."_custom.php")
+				{
+					$f['fname'] = "English_custom.php";  // change the key for the main language file.
+				}
 	
-	$message .= "<div>".$icon." ".$errors_diz.": ".$_SESSION['lancheck_'.$_POST['language']]['total']."</div>";	
-
-	$just_go_diz = (defsettrue('LAN_CHECK_20')) ? LAN_CHECK_20 : "Generate Language Pack";
-	$lang_sel_diz = (defsettrue('LAN_CHECK_21')) ? LAN_CHECK_21 : "Verify Again";
+				$ret=$ret + $this->fill_phrases_array($allData,$relpath.$f['fname']);
 	
-	$message .= "<span>
-	<br /><br />
-	<input type='hidden' name='language' value='".$_POST['language']."' />
-    <input type='submit' name='just_go' value=\"".$just_go_diz."\" class='button' />
-	</span>
-    </form>
-	<form name='refresh' method='post' action='".e_SELF."?tools'>
-	<span>
-	<input type='hidden' name='language' value='".$_POST['language']."' />
-    <input type='submit' name='language_sel[".$_POST['language']."]' value=\"".$lang_sel_diz."\" class='button' />
-	</span>
-    </form>
-	</div>";
-		
-	$ns -> tablerender(LAN_CHECK_24.": ".$_POST['language'],$message);
-
-	$ns -> tablerender(LAN_CHECK_3.": ".$_POST['language'], $core_text);
-	$ns -> tablerender(LAN_CHECK_3.": ".$_POST['language']."/admin", $core_admin);
-	$ns -> tablerender(ADLAN_CL_7, $plug_text);
-	$ns -> tablerender(LAN_CHECK_25, $theme_text);
+			}
+		}
 	
-	require_once(e_ADMIN."footer.php");
-	exit;
-}
-
-
-function check_core_lanfiles($checklan,$subdir=''){
-	global $lanfiles,$_POST,$sql;
-
-//	$sql->db_Mark_Time('Start Get Core Lan Phrases English');
-	$English = get_comp_lan_phrases(e_LANGUAGEDIR."English/".$subdir,$checklan);
+		return $ret;
 	
-//	$sql->db_Mark_Time('End Get Core Lan Phrases English');
+	}
 	
-	$check = get_comp_lan_phrases(e_LANGUAGEDIR.$checklan."/".$subdir,$checklan);
 	
-//	print_a($check);
-//	return;
 	
-
-	$text .= "<table class='fborder' style='".ADMIN_WIDTH."'>
-	<tr>
-	<td class='fcaption'>".LAN_CHECK_16."</td>
-	<td class='fcaption'>".$_POST['language']." ".LAN_CHECK_26."</td>
-	<td class='fcaption'>".LAN_OPTIONS."</td></tr>";
-
-	$keys = array_keys($English);
-
-	sort($keys);
-	$er = "";
-
-	foreach($keys as $k)
-	{
-		if($k != "bom")
+	// for plugins and themes - checkes what kind of language files directory structure we have
+	function check_lanfiles($mode,$comp_name,$base_lan="English",$target_lan){
+		global $ns,$sql;
+	
+		$folder['P'] = e_PLUGIN.$comp_name;
+		$folder['T'] = e_THEME.$comp_name;
+		$comp_dir = $folder[$mode];
+	
+		$baselang 	= $this->get_comp_lan_phrases($comp_dir."/languages/","English",1);
+		$check 		= $this->get_comp_lan_phrases($comp_dir."/languages/",$target_lan,1);	
+	
+		$text = "";
+		$keys = array_keys($baselang);
+		sort($keys);
+	
+		foreach($keys as $k)
 		{
+			
+			if($k == 'bom')
+			{
+				continue;
+			}
+			
 			$lnk = $k;
-			$k_check = str_replace("English",$checklan,$k);
-			if(array_key_exists($k,$check))
+			//echo "klucz ".$k."<br />";
+			$k_check = str_replace("English",$target_lan,$k);
+			if(array_key_exists($k_check,$check))
 			{
-				$text .= "<tr><td class='forumheader3' style='width:45%'>{$lnk}</td>";
-				$subkeys = array_keys($English[$k]);
-
+				
+	
+				$subkeys = array_keys($baselang[$k]);
 				$er="";
 				$utf_error = "";
-
+	
 				$bomkey = str_replace(".php","",$k_check);
-			//	$bom_error = ($check['bom'][$bomkey]) ? "<i>".LAN_CHECK_15."</i><br />" : ""; // illegal chars
-
 				if($check['bom'][$bomkey])
 				{
 					$bom_error = "<i>".LAN_CHECK_15."</i><br />";
-					checkLog('bom',1);;	
+					$this->checkLog('bom',1); 
 				}
 				else
 				{
 					$bom_error = "";	
 				}
-
+			// 	$bom_error = ($check['bom'][$bomkey]) ? "<i>".LAN_CHECK_15."</i><br />" : ""; // illegal chars
+			
 				foreach($subkeys as $sk)
 				{
-					if($utf_error == "" && !is_utf8($check[$k][$sk]))
+					if($utf_error == "" && !$this->is_utf8($check[$k_check][$sk]))
 					{
 						$utf_error = "<i>".LAN_CHECK_19."</i><br />";
-						checkLog('utf',1);
+						$this->checkLog('utf',1);
 					}
-
-					if($sk == "LC_ALL"){
-						$check[$k][$sk] = str_replace(chr(34).chr(34),"",$check[$k][$sk]);
+					
+					/*
+					if(!array_key_exists($sk,$check[$k_check]) || (trim($check[$k_check][$sk]) == "" && $baselang[$k][$sk] != ""))
+					{
+						$er .= ($er) ? "<br />" : "";
+						$er .= $sk." ".LAN_CHECK_5;
 					}
-				
-					$er .= check_lan_errors($English[$k],$check[$k],$sk);
+					*/
+					$er .= $this->check_lan_errors($baselang[$k],$check[$k_check],$sk);
 				}
-
+	
+				if($this->errorsOnly == TRUE && !$er && !$utf_error && !$bom_error)
+				{
+					continue;		
+				}
+	
+				$text .= "<tr>
+				<td class='forumheader3' style='width:20%'>".$comp_name."</td>
+				<td class='forumheader3' style='width:25%'>".str_replace("English/","",$lnk)."</td>";
+	
 				$style = ($er) ? "forumheader2" : "forumheader3";
 				$text .= "<td class='{$style}' style='width:50%'><div class='smalltext'>";
 				$text .= $bom_error . $utf_error;
@@ -354,427 +737,192 @@
 			}
 			else
 			{
-				checkLog('file',1);
+				$this->checkLog('file',1);
 				$text .= "<tr>
-				<td class='forumheader3' style='width:45%'>{$lnk}</td>
-				<td class='forumheader' style='width:50%'>".LAN_CHECK_4."</td>"; // file missing.
+				<td class='forumheader3' style='width:20%'>".$comp_name."</td>
+				<td class='forumheader3' style='width:25%'>".str_replace("English/","",$lnk)."</td>
+				<td class='forumheader' style='width:50%'><span style='cursor:pointer' title=\"".str_replace("English",$target_lan,$lnk)."\">".LAN_CHECK_4."</span></td>";
 			}
-			// Leave in EDIT button for all entries - to allow re-translation of bad entries.
-			$subpath = ($subdir!='') ? $subdir.$k : $k;
+	
 			$text .="<td class='forumheader3' style='width:5%;text-align:center'>
-			<input class='tbox' type='button' style='width:60px' name='but_$i' value=\"".LAN_EDIT."\" onclick=\"window.location='".e_SELF."?".$subpath."|".$_POST['language']."'\" /> ";
+			<input class='tbox' type='button' style='width:60px' name='but_$i' value=\"".LAN_EDIT."\" onclick=\"window.location='".e_SELF."?f=".$comp_dir."/languages/".$lnk."&amp;lan=".$target_lan."&amp;mode={$mode}'\" /> ";
 			$text .="</td></tr>";
 		}
-	}
-	$text .= "</table>";
-
-	return $text;
-}
-
-function check_lan_errors($english,$translation,$def)
-{
-	$eng_line = $english[$def];
-	$trans_line = $translation[$def];
 	
-	// return $eng_line."<br />".$trans_line."<br /><br />";
-		
-	$error = array();
-		
-	if((!array_key_exists($def,$translation) && $eng_line != "") || (trim($trans_line) == "" && $eng_line != ""))
-	{
-		checkLog('def',1);
-		return $def.": ".LAN_CHECK_5."<br />";
-	}
 	
-	if((strpos($eng_line,"[link=")!==FALSE && strpos($trans_line,"[link=")===FALSE) || (strpos($eng_line,"[b]")!==FALSE && strpos($trans_line,"[b]")===FALSE))
-	{
-		$error[] = $def. ": Missing bbcodes";
-	}
-	elseif((strpos($eng_line,"[")!==FALSE && strpos($trans_line,"[")===FALSE) || (strpos($eng_line,"]")!==FALSE && strpos($trans_line, "]")===FALSE))
-	{
-		$error[] = $def. ": Missing [ and/or ] character(s)";
-	}
 	
-	if((strpos($eng_line,"--LINK--")!==FALSE && strpos($trans_line,"--LINK--")==FALSE))
-	{
-		$error[] = $def. ": Missing --LINK--";
+		// if (!$known) {$text = LAN_CHECK_18." : --> ".$fname." :: ".$dname;}
+		return $text;
 	}
 	
-	if((strpos($eng_line,"e107.org")!==FALSE && strpos($trans_line,"e107.org")==FALSE))
-	{
-		$error[] = $def. ": Missing e107.org URL";
-	}
 	
-	if((strpos($eng_line,"e107coders.org")!==FALSE && strpos($trans_line,"e107coders.org")==FALSE))
-	{
-		$error[] = $def. ": Missing e107coders.org URL";
-	}
 	
-	if(strip_tags($eng_line) != $eng_line)
+	function edit_lanfiles($dir1,$dir2,$f1,$f2,$lan)
 	{
-		$stripped = strip_tags($trans_line);
-				
-		if(($stripped == $trans_line))
-		{					
-			// echo "<br /><br />".$def. "<br />".$stripped."<br />".$trans_line;
-			$error[] = $def. ": Missing HTML tags" ; 		
+		if($lan == '')
+		{
+			echo "Language selection was lost. ";
+			return;
 		}
-	}
+		
+		global $ns,$sql;
 	
-	checkLog('def',count($error));
-
-	return ($error) ? implode("<br />",$error)."<br />" : "";
+		/*    echo "<br />dir1 = $dir1";
+		echo "<br />file1 = $f1";
 	
-}
-
-
-function checkLog($type='error',$count)
-{
-	$_SESSION['lancheck_'.$_POST['language']][$type] += $count;
-	$_SESSION['lancheck_'.$_POST['language']]['total'] += $count;
-}
-
-function get_lan_file_phrases($dir1,$dir2,$file1,$file2){
-
-	$ret = array();
-	$fname = $dir1.$file1;
-	$type='orig';
-
-	if(is_file($fname))
-	{
-		$data = file_get_contents($fname);
-		$ret= $ret + fill_phrases_array($data,$type);
-		if(substr($data,0,5) != "<?php")
+		echo "<br />dir2 = $dir2";
+		echo "<br />file2 = $f2";*/
+		
+	
+	
+		if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English.php") // it's a language config file.
 		{
-			$key = str_replace(".php","",$fname);
-			$ret['bom'][$key] = $fname;
+			$f2 = $lan.".php";
+			$root_file = e_LANGUAGEDIR.$lan."/".$lan.".php";
 		}
-	}
-
-	$fname = $dir2.$file2;
-	$type='tran';
-
-	if(is_file($fname))
-	{
-		$data = file_get_contents($fname);
-		$ret=$ret + fill_phrases_array($data,$type);
-		if(substr($data,0,5) != "<?php")
+		else
 		{
-			$key = str_replace(".php","",$fname);
-			$ret['bom'][$key] = $fname;
+			$root_file = $dir2.$f2;
 		}
-	}
 	
-
-	return $ret;
-}
-
-
-function get_comp_lan_phrases($comp_dir,$lang,$depth=0)
-{
-	require_once(e_HANDLER."file_class.php");
-	$fl = new e_file;
-	$ret = array();
-
-	if($lang_array = $fl->get_files($comp_dir, ".php","standard",$depth)){
-		sort($lang_array);
-	}
-
-	$regexp = (strpos($comp_dir,e_LANGUAGEDIR) !== FALSE) ? "#.php#" : "#".$lang."#";
-
-	foreach($lang_array as $f)
-	{
-		if(preg_match($regexp,$f['path'].$f['fname']) && is_file($f['path'].$f['fname']))
-		{
-			$allData = file_get_contents($f['path'].$f['fname']);
-			$data = explode("\n",$allData);
-			// $data = file($f['path'].$f['fname']);
-			$relpath = str_replace($comp_dir,"",$f['path']);
-			
-			$key = str_replace(".php","",$relpath.$f['fname']);
-			
-			if(substr($data[0],0,5) != "<?php")
-			{
-				
-				$ret['bom'][$key] = $f['fname'];
-			}
-					
-			$end_of_file = 0;
-						
-			foreach($data as $line)
-			{
-				if($end_of_file == 1)
-				{
-					$ret['bom'][$key] = $f['fname'];
-				}
-										
-				$line = trim($line);
-				if($line == "?>")
-				{
-					$end_of_file = 1;  	
-				}
-			}
-				
-		
-			
-			if($f['path'].$f['fname'] == e_LANGUAGEDIR.$lang."/".$lang.".php")
-			{
-				$f['fname'] = "English.php";  // change the key for the main language file.
-			}
-
-			if($f['path'].$f['fname'] == e_LANGUAGEDIR.$lang."/".$lang."_custom.php")
-			{
-				$f['fname'] = "English_custom.php";  // change the key for the main language file.
-			}
-
-			$ret=$ret + fill_phrases_array($allData,$relpath.$f['fname']);
-
-		}
-	}
-
-	return $ret;
-
-}
-
-// for plugins and themes - checkes what kind of language files directory structure we have
-function check_lanfiles($mode,$comp_name,$base_lan="English",$target_lan){
-	global $ns,$sql;
-
-	$folder['P'] = e_PLUGIN.$comp_name;
-	$folder['T'] = e_THEME.$comp_name;
-	$comp_dir = $folder[$mode];
-
-	$baselang = get_comp_lan_phrases($comp_dir."/languages/","English",1);
-	$check = get_comp_lan_phrases($comp_dir."/languages/",$target_lan,1);	
-
-	$text = "";
-	$keys = array_keys($baselang);
-	sort($keys);
-
-	foreach($keys as $k)
-	{
-		
-		if($k == 'bom')
+		if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English_custom.php") // it's a language config file.
 		{
-			continue;
+			$f2 = $lan."_custom.php";
+			$root_file = e_LANGUAGEDIR.$lan."/".$lan."_custom.php";
 		}
-		
-		$lnk = $k;
-		//echo "klucz ".$k."<br />";
-		$k_check = str_replace("English",$target_lan,$k);
-		if(array_key_exists($k_check,$check))
+	
+	
+		$writable = (is_writable($dir2)) ? TRUE : FALSE;
+		$trans = $this->get_lan_file_phrases($dir1,$dir2,$f1,$f2);
+		$keys = array_keys($trans);
+		sort($keys);
+	
+		$text = "<div style='text-align:center'>
+		<form method='post' action='".e_SELF."?".e_QUERY."' id='transform'>
+		<table style='".ADMIN_WIDTH."' class='fborder'>";
+	
+		$subkeys = array_keys($trans['orig']);
+		foreach($subkeys as $sk)
 		{
-			$text .= "<tr>
-			<td class='forumheader3' style='width:20%'>".$comp_name."</td>
-			<td class='forumheader3' style='width:25%'>".str_replace("English/","",$lnk)."</td>";
-
-			$subkeys = array_keys($baselang[$k]);
-			$er="";
-			$utf_error = "";
-
-			$bomkey = str_replace(".php","",$k_check);
-			if($check['bom'][$bomkey])
-			{
-				$bom_error = "<i>".LAN_CHECK_15."</i><br />";
-				checkLog('bom',1); 
+			$rowamount = round(strlen($trans['orig'][$sk])/34)+1;
+			$hglt1=""; $hglt2="";
+			if ($trans['tran'][$sk] == "" && $trans['orig'][$sk]!="") {
+				$hglt1="<span style='font-style:italic;font-weight:bold;color:red'>";
+				$hglt2="</span>";
 			}
-			else
+			$text .="<tr>
+			<td class='forumheader3' style='width:10%;vertical-align:top'>".$hglt1.htmlentities($sk).$hglt2."</td>
+			<td class='forumheader3' style='width:40%;vertical-align:top'>".htmlentities(str_replace("ndef++","",$trans['orig'][$sk])) ."</td>";
+			$text .= "<td class='forumheader3' style='width:50%;vertical-align:top'>";
+			$text .= ($writable) ? "<textarea  class='tbox' name='newlang[]' rows='$rowamount' cols='45' style='height:100%'>" : "";
+			$text .= str_replace("ndef++","",$trans['tran'][$sk]);
+			$text .= ($writable) ? "</textarea>" : "";
+			//echo "orig --> ".$trans['orig'][$sk]."<br />";
+			if (strpos($trans['orig'][$sk],"ndef++") !== False)
 			{
-				$bom_error = "";	
+				//echo "+orig --> ".$trans['orig'][$sk]." <> ".strpos($trans['orig'][$sk],"ndef++")."<br />";
+				$text .= "<input type='hidden' name='newdef[]' value='ndef++".$sk."' />";
 			}
-		// 	$bom_error = ($check['bom'][$bomkey]) ? "<i>".LAN_CHECK_15."</i><br />" : ""; // illegal chars
-		
-			foreach($subkeys as $sk)
+			else
 			{
-				if($utf_error == "" && !is_utf8($check[$k_check][$sk]))
-				{
-					$utf_error = "<i>".LAN_CHECK_19."</i><br />";
-					checkLog('utf',1);
-				}
-				
-				/*
-				if(!array_key_exists($sk,$check[$k_check]) || (trim($check[$k_check][$sk]) == "" && $baselang[$k][$sk] != ""))
-				{
-					$er .= ($er) ? "<br />" : "";
-					$er .= $sk." ".LAN_CHECK_5;
-				}
-				*/
-				$er .= check_lan_errors($baselang[$k],$check[$k_check],$sk);
+				$text .= "<input type='hidden' name='newdef[]' value='".$sk."' />";
 			}
-
-			$style = ($er) ? "forumheader2" : "forumheader3";
-			$text .= "<td class='{$style}' style='width:50%'><div class='smalltext'>";
-			$text .= $bom_error . $utf_error;
-			$text .= (!$er && !$bom_error && !$utf_error) ? "<img src='".e_IMAGE."fileinspector/integrity_pass.png' alt='".LAN_OK."' />" : $er."<br />";
-			$text .= "</div></td>";
+			$text .="</td></tr>";
 		}
-		else
+	
+		unset($_SESSION['lancheck-edit-file']);
+	
+		//Check if directory is writable
+		
+		if($writable)
 		{
-			checkLog('file',1);
-			$text .= "<tr>
-			<td class='forumheader3' style='width:20%'>".$comp_name."</td>
-			<td class='forumheader3' style='width:25%'>".str_replace("English/","",$lnk)."</td>
-			<td class='forumheader' style='width:50%'><span style='cursor:pointer' title=\"".str_replace("English",$target_lan,$lnk)."\">".LAN_CHECK_4."</span></td>";
+			$text .="<tr style='vertical-align:top'>
+			<td colspan='3' style='text-align:center' class='forumheader'>
+			<input type='hidden' name='lan' value='{$lan}' />
+			<input class='button' type='submit' name='submit' value=\"".LAN_SAVE." ".str_replace($dir2,"",$root_file)." \" />";
+	
+			if($root_file)
+			{			
+				$_SESSION['lancheck-edit-file'] = $root_file;
+			}
+	
+			$text .= "</td></tr>";
 		}
-
-		$text .="<td class='forumheader3' style='width:5%;text-align:center'>
-		<input class='tbox' type='button' style='width:60px' name='but_$i' value=\"".LAN_EDIT."\" onclick=\"window.location='".e_SELF."?".$comp_dir."/languages/".$lnk."|".$target_lan."|file'\" /> ";
-		$text .="</td></tr>";
-	}
-
-
-
-	// if (!$known) {$text = LAN_CHECK_18." : --> ".$fname." :: ".$dname;}
-	return $text;
-}
-
-function edit_lanfiles($dir1,$dir2,$f1,$f2){
-	global $ns,$sql,$lan;
-
-	/*    echo "<br />dir1 = $dir1";
-	echo "<br />file1 = $f1";
-
-	echo "<br />dir2 = $dir2";
-	echo "<br />file2 = $f2";*/
-
-	if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English.php") // it's a language config file.
-	{
-		$f2 = $lan.".php";
-		$root_file = e_LANGUAGEDIR.$lan."/".$lan.".php";
-	}
-	else
-	{
-		$root_file = $dir2.$f2;
-	}
-
-	if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English_custom.php") // it's a language config file.
-	{
-		$f2 = $lan."_custom.php";
-		$root_file = e_LANGUAGEDIR.$lan."/".$lan."_custom.php";
+	
+		$text .= "
+		</table>
+		</form>
+		</div>";
+	
+		$text .= "<form method='post' action='".e_SELF."?tools' id='select_lang'>
+		<div style='text-align:center'><br />";
+		$text .= (!$writable) ? "<br />".$dir2.$f2.LAN_NOTWRITABLE : "";
+		$text .= "<br /><br /><input class='button' type='submit' name='language_sel[{$lan}]' value=\"".LAN_BACK."\" />
+		</div></form>";
+	
+	
+		$caption = LAN_CHECK_3." <b>".$dir2.$f2."</b> -> <b>".$lan."</b>";
+		$ns -> tablerender($caption, $text);
+		require_once(e_ADMIN."footer.php");
+		exit;
+	
 	}
-
-
-	$writable = (is_writable($dir2)) ? TRUE : FALSE;
-	$trans = get_lan_file_phrases($dir1,$dir2,$f1,$f2);
-	$keys = array_keys($trans);
-	sort($keys);
-
-	$text = "<div style='text-align:center'>
-	<form method='post' action='".e_SELF."?".e_QUERY."' id='transform'>
-	<table style='".ADMIN_WIDTH."' class='fborder'>";
-
-	$subkeys = array_keys($trans['orig']);
-	foreach($subkeys as $sk)
-	{
-		$rowamount = round(strlen($trans['orig'][$sk])/34)+1;
-		$hglt1=""; $hglt2="";
-		if ($trans['tran'][$sk] == "" && $trans['orig'][$sk]!="") {
-			$hglt1="<span style='font-style:italic;font-weight:bold;color:red'>";
-			$hglt2="</span>";
-		}
-		$text .="<tr>
-		<td class='forumheader3' style='width:10%;vertical-align:top'>".$hglt1.htmlentities($sk).$hglt2."</td>
-		<td class='forumheader3' style='width:40%;vertical-align:top'>".htmlentities(str_replace("ndef++","",$trans['orig'][$sk])) ."</td>";
-		$text .= "<td class='forumheader3' style='width:50%;vertical-align:top'>";
-		$text .= ($writable) ? "<textarea  class='tbox' name='newlang[]' rows='$rowamount' cols='45' style='height:100%'>" : "";
-		$text .= str_replace("ndef++","",$trans['tran'][$sk]);
-		$text .= ($writable) ? "</textarea>" : "";
-		//echo "orig --> ".$trans['orig'][$sk]."<br />";
-		if (strpos($trans['orig'][$sk],"ndef++") !== False)
+	
+	
+	
+	function fill_phrases_array($data,$type)
+	{	
+		$retloc = array();
+		
+		if(preg_match_all('/(\/\*[\s\S]*?\*\/)/i',$data, $multiComment))
 		{
-			//echo "+orig --> ".$trans['orig'][$sk]." <> ".strpos($trans['orig'][$sk],"ndef++")."<br />";
-			$text .= "<input type='hidden' name='newdef[]' value='ndef++".$sk."' />";
+			$data = str_replace($multiComment[1],'',$data);	// strip multi-line comments. 	
 		}
-		else
+					
+		if(preg_match('/^\s*?setlocale\s*?\(\s*?([\w]+)\s*?,\s*?(.+)\s*?\)\s*?;/im',$data,$locale)) // check for setlocale();
 		{
-			$text .= "<input type='hidden' name='newdef[]' value='".$sk."' />";
+			$retloc[$type][$locale[1]]= $locale[2];	
 		}
-		$text .="</td></tr>";
-	}
-
-	//Check if directory is writable
-	if($writable)
-	{
-		$text .="<tr style='vertical-align:top'>
-		<td colspan='3' style='text-align:center' class='forumheader'>
-		<input class='button' type='submit' name='submit' value=\"".LAN_SAVE." ".str_replace($dir2,"",$root_file)." \" />";
-
-		if($root_file)
+				
+		if(preg_match_all('/^\s*?define\s*?\(\s*?(\'|\")([\w]+)(\'|\")\s*?,\s*?(\'|\")([\s\S]*?)\s*?(\'|\")\s*?\)\s*?;/im',$data,$matches))
 		{
-			$text .= "<input type='hidden' name='root' value='".$root_file."' />";
+			$def = $matches[2];
+			$values = $matches[5];	
+	
+			foreach($def as $k=>$d)
+			{
+				$retloc[$type][$d]= $values[$k];
+			}	
 		}
-
-		$text .= "</td></tr>";
-	}
-
-	$text .= "
-	</table>
-	</form>
-	</div>";
-
-	$text .= "<form method='post' action='".e_SELF."' id='select_lang'>
-	<div style='text-align:center'><br />";
-	$text .= (!$writable) ? "<br />".$dir2.$f2.LAN_NOTWRITABLE : "";
-	$text .= "<br /><br /><input class='button' type='submit' name='language_sel[{$lan}]' value=\"".LAN_BACK."\" />
-	</div></form>";
-
-
-	$caption = LAN_CHECK_3." <b>".$dir2.$f2."</b> -> <b>".$lan."</b>";
-	$ns -> tablerender($caption, $text);
-	require_once(e_ADMIN."footer.php");
-	exit;
-
-}
-
-function fill_phrases_array($data,$type)
-{	
-	$retloc = array();
+			
+		return $retloc;
+		
+		/*
+		echo "<h2>Raw Data ".$type."</h2><pre>";
+		echo htmlentities($data);
+		echo "</pre>";	
 	
-	if(preg_match_all('/(\/\*[\s\S]*?\*\/)/i',$data, $multiComment))
-	{
-		$data = str_replace($multiComment[1],'',$data);	// strip multi-line comments. 	
-	}
-				
-	if(preg_match('/^\s*?setlocale\s*?\(\s*?([\w]+)\s*?,\s*?(.+)\s*?\)\s*?;/im',$data,$locale)) // check for setlocale();
-	{
-		$retloc[$type][$locale[1]]= $locale[2];	
-	}
+		*/
 			
-	if(preg_match_all('/^\s*?define\s*?\(\s*?(\'|\")([\w]+)(\'|\")\s*?,\s*?(\'|\")([\s\S]*?)\s*?(\'|\")\s*?\)\s*?;/im',$data,$matches))
-	{
-		$def = $matches[2];
-		$values = $matches[5];	
-
-		foreach($def as $k=>$d)
-		{
-			$retloc[$type][$d]= $values[$k];
-		}	
 	}
-		
-	return $retloc;
 	
-	/*
-	echo "<h2>Raw Data ".$type."</h2><pre>";
-	echo htmlentities($data);
-	echo "</pre>";	
-
-	*/
-		
-}
-
-//--------------------------------------------------------------------
-
-
-function is_utf8($str) {
-	/*
-	* @see http://hsivonen.iki.fi/php-utf8/   validation.php
-	*/
-	if(strtolower(CHARSET) != "utf-8" || $str == "")
-	{
-		return TRUE;
+	
+	
+	//--------------------------------------------------------------------
+	
+	
+	function is_utf8($str) {
+		/*
+		* @see http://hsivonen.iki.fi/php-utf8/   validation.php
+		*/
+		if(strtolower(CHARSET) != "utf-8" || $str == "")
+		{
+			return TRUE;
+		}
+	
+		return (preg_match('/^.{1}/us',$str,$ar) == 1);
 	}
-
-	return (preg_match('/^.{1}/us',$str,$ar) == 1);
+	
+	
 }
 
-
diff -x .svn -aruN 1.0.0.src/e107_admin/language.php 1.0.2.src/e107_admin/language.php
--- 1.0.0.src/e107_admin/language.php	2012-10-30 15:39:55.469449648 +0000
+++ 1.0.2.src/e107_admin/language.php	2012-10-30 15:40:38.291444865 +0000
@@ -10,18 +10,22 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/language.php $
-|     $Revision: 12128 $
-|     $Id: language.php 12128 2011-04-11 10:39:05Z e107coders $
+|     $Revision: 12903 $
+|     $Id: language.php 12903 2012-07-23 07:37:12Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
+
 require_once("../class2.php");
-if (!getperms('0'))
+
+if (!getperms('L'))
 {
     header("location:".e_BASE."index.php");
     exit;
 }
 
+
+
 $e_sub_cat = 'language';
 
 if (e_QUERY) 
@@ -32,6 +36,10 @@
     $id = varset($tmp[2]);
     unset($tmp);
 }
+else
+{
+	unset($_SESSION['language-list']); // Clear Language-List Cache on first page load. 
+}
 
 require_once("auth.php");
 include_lan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_lancheck.php");
@@ -40,9 +48,11 @@
 require_once(e_HANDLER."file_class.php");
 require_once(e_HANDLER."language_class.php");
 
-$ln = new language;
+// $ln = new language;
+$ln = $lng;
 $fl = new e_file;
 $rs = new form;
+$lck = new lancheck;
 
 $tabs = table_list(); // array("news","content","links");
 
@@ -51,10 +61,8 @@
 
 
 
-
-
-
-if (isset($_POST['submit_prefs']) && isset($_POST['mainsitelanguage'])) {
+if (isset($_POST['submit_prefs']) && isset($_POST['mainsitelanguage']) && getperms('0'))
+{
 
     $pref['multilanguage']  = $_POST['multilanguage'];
     $pref['multilanguage_subdomain'] = $_POST['multilanguage_subdomain'];
@@ -62,7 +70,7 @@
 
     save_prefs();
     $ns->tablerender(LAN_SAVED, "<div style='text-align:center'>".LAN_SETSAVED."</div>");
-
+	
 }
 
 
@@ -79,13 +87,15 @@
         }
     }
     global $cachevar;
+	unset($_SESSION['language-list']);
     unset($cachevar['table_list']);
 
 }
 
 // ----------create tables -----------------------------------------------------
 
-if (isset($_POST['kreate_tbl']) && $_POST['language']) {
+if (isset($_POST['kreate_tbl']) && $_POST['language'] && getperms('0')) 
+{
 
     $table_to_copy = array();
     $lang_to_create = array();
@@ -130,22 +140,30 @@
 	{
 		$_COOKIE['e107_certified'] = $certVal; 	
 	}
-		
-		
+			
 	$_POST['language'] = key($_POST['ziplang']);
 	
-		$status = zip_up_lang($_POST['language']);
-		if($status['error']==FALSE)
-		{	
-			$text = $status['message']."<br />";
-			$text .= share($status['file']); 
-			$ns->tablerender(LAN_CREATED, $text );
-			
-		}
-		else
-		{
-			$ns->tablerender(LAN_CREATED_FAILED, $status['message']);
-		}
+	// If no session data, scan before zipping. 	
+	if(!isset($_SESSION['lancheck'][$_POST['language']]['total']) || $_SESSION['lancheck'][$_POST['language']]['total']!='0')
+	{
+		$_POST['language_sel'] = $_POST['ziplang'];	
+		$lck->check_all('norender');
+		unset($_POST['language_sel']);
+	}
+	
+	$status = zip_up_lang($_POST['language']);
+	
+	if($status['error']==FALSE)
+	{	
+		$text = $status['message']."<br />";
+		$text .= share($status['file']); 
+		$ns->tablerender(LAN_CREATED, $text );
+		
+	}
+	else
+	{
+		$ns->tablerender(LAN_CREATED_FAILED, $status['message']);
+	}
 }
 
     if(isset($message) && $message){
@@ -178,13 +196,13 @@
 	<br />...would like to contribute the following language pack for e107. (see attached)<br />:
 		
 	
-	<br />Missing Files: ".$_SESSION['lancheck_'.$_POST['language']]['file']."
-	<br />Bom Errors : ".$_SESSION['lancheck_'.$_POST['language']]['bom']."
-	<br />UTF Errors : ".$_SESSION['lancheck_'.$_POST['language']]['utf']."
-	<br />Definition Errors : ".$_SESSION['lancheck_'.$_POST['language']]['def']."
-	<br />Total Errors: ".$_SESSION['lancheck_'.$_POST['language']]['total']."
+	<br />Missing Files: ".$_SESSION['lancheck'][$_POST['language']]['file']."
+	<br />Bom Errors : ".$_SESSION['lancheck'][$_POST['language']]['bom']."
+	<br />UTF Errors : ".$_SESSION['lancheck'][$_POST['language']]['utf']."
+	<br />Definition Errors : ".$_SESSION['lancheck'][$_POST['language']]['def']."
+	<br />Total Errors: ".$_SESSION['lancheck'][$_POST['language']]['total']."
 	<br />
-	<br />XML file: ".$_SESSION['lancheck_'.$_POST['language']]['xml'];
+	<br />XML file: ".$_SESSION['lancheck'][$_POST['language']]['xml'];
 	
 	
 	
@@ -221,18 +239,30 @@
 
 unset($text);
 
+if(!getperms('0'))
+{
+	$action = 'tools';
+}
 
 if (!e_QUERY || $action == 'main' && !$_POST['language'] && !$_POST['edit_existing']) {
     multilang_prefs();
 }
 
-if ($action == 'db') {
+if ($action == 'db')
+{
     multilang_db();
 }
 
 
+$debug = "<br />f=".$_GET['f'];
+$debug .= "<br />mode=".$_GET['mode'];
+$debug .= "<br />lan=".$_GET['lan'];
+// $ns->tablerender("Debug",$debug);
 
-if($action == "tools"){
+ $rendered = $lck->init(); // Lancheck functions. 
+
+if($action == "tools" && !$rendered)
+{
     show_tools();
 }
 
@@ -295,7 +325,13 @@
 require_once(e_ADMIN."footer.php");
 
 // ---------------------------------------------------------------------------
-function multilang_prefs() {
+function multilang_prefs() 
+{
+	if(!getperms('0'))
+	{
+		return;
+	}
+	
     global $ns, $pref,$lanlist;
 
     $text = "<div style='text-align:center'>
@@ -373,6 +409,9 @@
 	
 	$release_diz = defined("LANG_LAN_30") ? LANG_LAN_30 : "Release Date";
 	$compat_diz = defined("LANG_LAN_31") ?  LANG_LAN_31 : "Compatibility";
+	$lan_pleasewait = (defsettrue('LAN_PLEASEWAIT')) ?  $tp->toJS(LAN_PLEASEWAIT) : "Please Wait";
+	$lan_displayerrors = (defsettrue('LANG_LAN_33')) ?  LANG_LAN_33 : "Display only errors during verification";
+	
 	
 	$text = "<form id='lancheck' method='post' action='".e_SELF."?tools'>
 			<table class='fborder' style='".ADMIN_WIDTH."'>";
@@ -420,30 +459,38 @@
 				'compatibility' => '&nbsp;'
 			);	
 		}
+		
+		$errFound = (isset($_SESSION['lancheck'][$language]['total']) && $_SESSION['lancheck'][$language]['total'] > 0) ?  TRUE : FALSE;
+		
 						
 		$text .= "<tr>
 			<td class='forumheader3' >".$language."</td>
 			<td class='forumheader3' >".$value['date']."</td>
 			<td class='forumheader3' >".$value['compatibility']."</td>
-			<td class='forumheader3' style='text-align:center' >".($ver == $value['compatibility'] || varset($_SESSION['lancheck_'.$language]['total']) =='0' ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON)."</td>
+			<td class='forumheader3' style='text-align:center' >".($ver != $value['compatibility'] || $errFound ? ADMIN_FALSE_ICON : ADMIN_TRUE_ICON )."</td>
 			<td class='forumheader3' style='text-align:center'><input type='submit' name='language_sel[{$language}]' value=\"".LAN_CHECK_2."\" class='button' />
-			<input type='submit' name='ziplang[{$language}]' value=\"".LANG_LAN_23."\" class='button' /></td>	
+			<input type='submit' name='ziplang[{$language}]' value=\"".LANG_LAN_23."\" class='button' onclick=\"this.value = '".$lan_pleasewait."'\" /></td>	
 			</tr>";
 		}
 		
 		$srch = array("[","]");
-		$repl = array("<a rel='external' href='http://e107.org/news.php?extend.876.1'>","</a>");
+		$repl = array("<a rel='external' href='http://e107.org/content/About-Us:The-Team#translation-team'>","</a>");
 		$diz = (defsettrue("LANG_LAN_28")) ? LANG_LAN_28 : "Check this box if you're an [e107 certified translator].";
 	
 		$checked = varset($_COOKIE['e107_certified']) == 1 ? "checked='checked'" : "";
-		$text .= "<tr><td class='forumheader' colspan='5' style='text-align:center'>
+		$text .= "<tr><td class='forumheader' colspan='4' style='text-align:center'>
 		 <input type='checkbox' name='contribute_pack' value='1' {$checked} />".str_replace($srch,$repl,$diz);
-				
-		$text .= "</td></tr></table>";
 		
+		$echecked = varset($_SESSION['lancheck-errors-only']) == 1 ? "checked='checked'" : "";		
+		$text .= "</td>
+		<td class='forumheader' style='text-align:center'>
+		<input type='checkbox' name='errorsonly' value='1' {$echecked}  /> ".$lan_displayerrors." </td>
+		
+		</tr></table>";
 		
-		$text .= "</form>";
 		
+		$text .= "</form>";
+	
 	$text .= "<div class='smalltext' style='padding-top:50px;text-align:center'>".LANG_LAN_AGR."</div>";	
 	$ns->tablerender(LANG_LAN_32, $text);		
 	return;
@@ -544,7 +591,15 @@
 
 
 // ------------- render form ---------------------------------------------------
-function multilang_db(){
+function multilang_db()
+{
+	if(!getperms('0'))
+	{
+		return "Access Denied";
+	}
+	
+	
+	
     global $pref,$ns,$tp,$rs,$lanlist,$tabs;
 
     if(isset($pref['multilanguage']) && $pref['multilanguage']){
@@ -643,7 +698,16 @@
 	$ret = array();
 	$ret['file'] = "";
 	
-	if(!isset($_SESSION['lancheck_'.$language]))
+	if($_SESSION['lancheck'][$language]['total'] > 0)
+	{
+		$ret = array();
+		$ret['error'] = TRUE;
+		$message = (defined('LANG_LAN_34')) ? LANG_LAN_34 : "Please verify and correct the remaining [x] error(s) before attempting to create a language-pack.";
+		$ret['message'] = str_replace("[x]",$_SESSION['lancheck'][$language]['total'],$message);
+		return $ret;		
+	}
+		
+	if(!isset($_SESSION['lancheck'][$language]))
 	{
 		$ret = array();
 		$ret['error'] = TRUE;
@@ -651,7 +715,7 @@
 		return $ret;	
 	}
 	
-	if(varset($_POST['contribute_pack']) && varset($_SESSION['lancheck_'.$language]['total']) !='0')
+	if(varset($_POST['contribute_pack']) && varset($_SESSION['lancheck'][$language]['total']) !='0')
 	{
 		$ret['error'] = TRUE;
 		$ret['message'] = (defined("LANG_LAN_29")) ? LANG_LAN_29 : "You should correct the remaining errors before contributing your language pack.";	
@@ -684,7 +748,7 @@
 	);
 	 
 	 $core_themes = array("crahan","e107v4a","human_condition","interfectus","jayya",
-	 "khatru","kubrick","lamb","leaf","newsroom","reline","sebes","vekna_blue");
+	 "khatru","kubrick","lamb","leaf","newsroom","core","sebes","vekna_blue");
 
 	require_once(e_HANDLER.'pclzip.lib.php');
 	list($ver, $tmp) = explode(" ", $e107info['e107_version']);
@@ -715,7 +779,7 @@
 	$plugs = grab_lans(e_BASE.$PLUGINS_DIRECTORY, $language, $core_plugins); // standardized path. 
 	$theme  = grab_lans(e_BASE.$THEMES_DIRECTORY, $language, $core_themes);
 	$docs = grab_lans(e_BASE.$HELP_DIRECTORY,$language);
-	$handlers = grab_lans(e_BASE.$HANDLERS_DIRECTORY,$language); // standardized path. 
+	$handlers = grab_lans(e_BASE.$HANDLERS_DIRECTORY,$language); // standardized path. 		
 		
 	$file = array_merge($core,$core_admin, $plugs, $theme, $docs, $handlers);
 	$data = implode(",", $file);
@@ -728,11 +792,13 @@
 	}
 	else
 	{
-		if($_POST['contribute_pack'])
-		{
 			
 			$fileName = e_FILE."public/".$language.".xml";
-			@unlink($fileName);
+			if(is_readable($fileName))
+			{
+				@unlink($fileName);	
+			}
+			
 		$fileData = '<?xml version="1.0" encoding="utf-8"?>
 <e107Language name="'.$language.'" compatibility="'.$ver.'" date="'.date("Y-m-d").'" >
 <author name ="'.USERNAME.'" email="'.USEREMAIL.'" url="'.SITEURL.'" />
@@ -741,15 +807,15 @@
 			if(file_put_contents($fileName,$fileData))
 			{
 				$addTag = $archive->add($fileName, PCLZIP_OPT_ADD_PATH, 'e107_languages/'.$language, PCLZIP_OPT_REMOVE_PATH, e_FILE.'public/');				
-				$_SESSION['lancheck_'.$language]['xml'] = "Yes";
+				$_SESSION['lancheck'][$language]['xml'] = "Yes";
 			}
+			else
+			{
+				$_SESSION['lancheck'][$language]['xml'] = "No";	
+			}
+			
 			@unlink($fileName);	
-		}
-		else
-		{
-			$_SESSION['lancheck_'.$language]['xml'] = "No";
-			// echo "NO CONTRIBUTE";
-		}
+
 
 		
 		$ret['file']  = $newfile; 
@@ -780,8 +846,61 @@
 	return $list;	
 }
 
+function coreFile($path,$language,$isocode)
+{
+	global $lng;
+	
+	if(strpos($path,"help/")!==FALSE)
+	{
+		return TRUE;
+	}
+	
+	$valid = FALSE;
+	
+	$image = $_SESSION['lancheck-core-image'];
+	
+	$rpath = str_replace("../","",$path);
+	$rpath = str_replace($language,"English",$rpath);
+	$rpath = str_replace($isocode.".js","en.js",$rpath); // TinyMce
+	$rpath = str_replace($isocode."_dlg.js","en_dlg.js",$rpath); // TinyMce
+	$rpath = str_replace("phpmailer.lang-".$isocode.".php","phpmailer.lang-en.php",$rpath);
+
+	$tmp = explode("/",$rpath);
+	
+	$l = '$image';
+	
+	foreach($tmp as $key)
+	{
+		$l .= "['".$key."']";	
+	}
+	
+	eval("\$valid = isset(".$l.");");
+	/*
+	if($valid == FALSE)
+	{
+		echo "<br />Excluded: ".$path;
+		print_a($image[$tmp[0]][$tmp[1]]);
+	
+		echo "<hr>";
+	}
+	
+	 */
+	
+	return $valid;
+
+}
+
+
+
+
 function grab_lans($path, $language, $filter = "",$depth=5)
 {
+	
+	// print_a($_SESSION['lancheck-core-image']);
+	// $this->validFile($path);
+
+	
+	
 	global $fl,$ln;
 	
 	$isocode = $ln->convert($language);
@@ -823,21 +942,25 @@
 				$dir =  basename(dirname($p['path']));
 				foreach($filter as $val)
 				{
-					if(strpos($fullpath,'/'.$val.'/')!==FALSE)
+					if(strpos($fullpath,'/'.$val.'/')!==FALSE && coreFile($fullpath,$language,$isocode))
 					{
 						$pzip[] = $fullpath;	
 					}
 				}
 		
 			}
-			else
+			elseif(coreFile($fullpath,$language,$isocode))
 			{
 				$pzip[] = $fullpath;	
 			}
 			
 		}
 	}
-	return $pzip;
+	
+	// print_a($pzip);
+	//return;
+	
+	 return $pzip;
 }
 
 
@@ -845,22 +968,38 @@
 // --------------------------------------------------------------------------
 
 
-function language_adminmenu() {
-    global $action,$pref;
+function language_adminmenu()
+{
+    global $pref;
+	
+	list($action,$other) = explode('.', e_QUERY);
+
     if ($action == "") {
         $action = "main";
     }
 
-    if($action == "modify"){
+    if($action == "modify")
+    {
         $action = "db";
     }
-    $var['main']['text'] = LAN_PREFS;
-    $var['main']['link'] = e_SELF;
+	
+	if(getperms('0'))
+	{
+		 $var['main']['text'] = LAN_PREFS;
+   		 $var['main']['link'] = e_SELF;
 
-    if(isset($pref['multilanguage']) && $pref['multilanguage']){
-        $var['db']['text'] = LANG_LAN_03;
-        $var['db']['link'] = e_SELF."?db";
-    }
+	    if(isset($pref['multilanguage']) && $pref['multilanguage'])
+	    {
+	        $var['db']['text'] = LANG_LAN_03;
+	        $var['db']['link'] = e_SELF."?db";
+	    }	
+	}
+
+	
+	if(varsettrue($_GET['f']))
+	{
+		$action = 'tools';	
+	}
 	
 
     $lcnt = explode(",",e_LANLIST);
diff -x .svn -aruN 1.0.0.src/e107_admin/modcomment.php 1.0.2.src/e107_admin/modcomment.php
--- 1.0.0.src/e107_admin/modcomment.php	2012-10-30 15:39:55.471444772 +0000
+++ 1.0.2.src/e107_admin/modcomment.php	2012-10-30 15:40:38.292444417 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/modcomment.php $
-|     $Revision: 11678 $
-|     $Id: modcomment.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12910 $
+|     $Id: modcomment.php 12910 2012-07-24 09:34:58Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -39,6 +39,8 @@
 $id		= intval($tmp[1]);
 $editid	= intval($tmp[2]);
 $type	= $cobj -> getCommentType($table);
+$amount = 15;
+$from 	= intval(varset($_GET['frm']));
 
 if (isset($_POST['moderate'])) 
 {
@@ -58,16 +60,33 @@
 	{
 		$sql->db_Update('comments', "comment_lock='0' WHERE `comment_item_id`=".$id." AND `comment_type`='".$tp -> toDB($type, true)."' ");
 	}
-	if (is_array($_POST['comment_blocked'])) {
-		while (list ($key, $cid) = each ($_POST['comment_blocked'])) {
+	
+	if (is_array($_POST['comment_approve'])) 
+	{
+		while (list ($key, $cid) = each ($_POST['comment_approve'])) 
+		{
+			$sql->db_Update("comments", "comment_blocked='0' WHERE comment_id='$cid' ");
+		}
+	}	
+	
+	
+	if (is_array($_POST['comment_blocked'])) 
+	{
+		while (list ($key, $cid) = each ($_POST['comment_blocked'])) 
+		{
 			$sql->db_Update("comments", "comment_blocked='1' WHERE comment_id='$cid' ");
 		}
 	}
-	if (is_array($_POST['comment_unblocked'])) {
-		while (list ($key, $cid) = each ($_POST['comment_unblocked'])) {
+	
+	
+	if (is_array($_POST['comment_unblocked'])) 
+	{
+		while (list ($key, $cid) = each ($_POST['comment_unblocked'])) 
+		{
 			$sql->db_Update("comments", "comment_blocked='0' WHERE comment_id='$cid' ");
 		}
 	}
+	
 	if (is_array($_POST['comment_delete'])) 
 	{
 		while (list ($key, $cid) = each ($_POST['comment_delete'])) 
@@ -92,7 +111,6 @@
 $text = "
 <div style='text-align:center'>
 <form method='post' action='".e_SELF."?".e_QUERY."'>
-<input type='hidden' name='e-token' value='".e_TOKEN."' />
 <table class='fborder' style='".ADMIN_WIDTH."'>";
 
 if ($editid)
@@ -104,7 +122,7 @@
 	{
 		$row = $sql->db_Fetch();
 		$text .= "<tr><td><textarea class='tbox' name='comment_comment' cols='1' rows='15' style='width:100%;'>".$row['comment_comment']."</textarea></td></tr>";
-		$text .= "<tr><td colspan='5' class='forumheader' style='text-align:center'><input class='button' type='submit' name='moderate' value='".MDCLAN_8."' />
+		$text .= "<tr><td colspan='6' class='forumheader' style='text-align:center'><input class='button' type='submit' name='moderate' value='".MDCLAN_8."' />
 		</td></tr>";
 	}
 
@@ -113,12 +131,30 @@
 	require_once("footer.php"); exit;
 }
 
-if (!$sql->db_Select("comments", "*", "(comment_type='".$type."' OR comment_type='".$table."') AND comment_item_id={$id} ORDER BY `comment_datestamp` ")) 
+if($type && $table && $id)
+{
+	$query = "SELECT * FROM #comments WHERE (comment_type='".$type."' OR comment_type='".$table."') AND comment_item_id={$id} ORDER BY `comment_datestamp` ";
+	$noresult = MDCLAN_2;
+}
+elseif(varsettrue($_GET['mode'])=='all')
 {
-	$text .= "<tr><td class='forumheader3' style='text-align:center'>".MDCLAN_2.".</td></tr>";
+	$totalCom = $sql->db_Select_gen("SELECT comment_id FROM #comments ORDER BY comment_datestamp");	
+	$query = "SELECT * FROM #comments ORDER BY comment_datestamp DESC LIMIT {$from},{$amount}";	
+	$noresult = MDCLAN_17;
+}
+else {
+	$totalCom = $sql->db_Select_gen("SELECT comment_id FROM #comments WHERE comment_blocked = 2 ORDER BY comment_datestamp");
+	$query = "SELECT * FROM #comments WHERE comment_blocked = 2 ORDER BY comment_datestamp DESC ";	
+	$noresult = MDCLAN_17;
+}
+
+if (!$sql->db_Select_gen($query)) 
+{
+	$text .= "<tr><td class='forumheader3' style='text-align:center'>".$noresult.".</td></tr>";
 } 
 else 
 {
+
 	$con = new convert;
 
 	$commentArray = $sql -> db_getList();
@@ -127,60 +163,142 @@
 	$comments = "";
 	foreach($commentArray as $row)
 	{
-		$comment_lock = $row['comment_lock'];
-		$total_blocked += $row['comment_blocked'];
-		$datestamp = $con->convert_date($row['comment_datestamp'], "short");
-		$comment_author_id = substr($row['comment_author'], 0, strpos($row['comment_author'], "."));
-		if ($comment_author_id) {
+		$comment_lock 			= $row['comment_lock'];
+		$total_blocked 			+= $row['comment_blocked'];
+		$datestamp 				= $con->convert_date($row['comment_datestamp'], "short");
+		$comment_author_id 		= substr($row['comment_author'], 0, strpos($row['comment_author'], "."));
+		
+		if ($comment_author_id) 
+		{
 			$sql->db_Select("user", "*", "user_id='$comment_author_id' ");
-			$rowu = $sql->db_Fetch();
-			$comment_nick = "<a href='".e_BASE."user.php?id.".$rowu['user_id']."'>".$rowu['user_name']."</a>";
-			$comment_str = MDCLAN_3." #".$rowu['user_id'];
-		} else {
+			
+			$rowu 				= $sql->db_Fetch();
+			$comment_nick 		= "<a href='".e_BASE."user.php?id.".$rowu['user_id']."'>".$rowu['user_name']."</a>";
+			$comment_str 		= MDCLAN_3." #".$rowu['user_id'];
+		}
+		else 
+		{
 			$comment_str = MDCLAN_4;
 			$comment_nick = preg_replace("#[0-9]+\.#", "", $row['comment_author']);
 		}
+		
 		$row['comment_comment'] = $tp->toHTML($row['comment_comment'], TRUE, "");
+		
+		$row['comment_type'] = $cobj->getTable($row['comment_type']);
 
 		$comments .= "
 		<tr>
-			<td class='forumheader3' style='width:5%; text-align:center;'>".($row['comment_blocked'] ? "<img src='".e_IMAGE."admin_images/blocked.png' />" : "&nbsp;")."</td>
-			<td class='forumheader3' style='width:15%;'>".$datestamp."</td>
-			<td class='forumheader3' style='width:15%;'><b>".$comment_nick."</b><br />".$comment_str."</td>
+			<td class='forumheader3' style='width:5%; text-align:center;'>".statusIcon($row['comment_blocked']) ."</td>
+			<td class='forumheader3' style='width:auto'>".$row['comment_type']."</td>
+			<td class='forumheader3' style='width:auto'>".$datestamp."</td>
+			<td class='forumheader3' style='width:auto'><b>".$comment_nick."</b><br />".$comment_str."</td>
 			<td class='forumheader3' style='width:40%;'>".$row['comment_comment']."</td>
 			<td class='forumheader3' style='width:25%;'>
 				<a href='".e_ADMIN."modcomment.php?{$table}.{$id}.".$row['comment_id']."'><img src='".e_IMAGE."admin_images/edit_16.png' alt='".LAN_EDIT."' title='".LAN_EDIT."' style='border:none' /></a>"
-				."&nbsp;".($row['comment_blocked'] ? "<input type='checkbox' name='comment_unblocked[]' value='".$row['comment_id']."' /> ".MDCLAN_5."" : "<input type='checkbox' name='comment_blocked[]' value='".$row['comment_id']."' /> ".MDCLAN_6."")
-				."&nbsp;<input type='checkbox' name='comment_delete[]' value='".$row['comment_id']."' /> ".LAN_DELETE."
+				.commentOptions($row)."
 			</td>
 		</tr>";
 	}
-	$text .= "
-	<tr><td colspan='5' class='fcaption'>".MDCLAN_10."</td></tr>
+	
+	
+	$lockoptions = "<tr><td colspan='6' class='fcaption'>".MDCLAN_10."</td></tr>
 	<tr>
-	<td class='forumheader3' style='text-align:right' colspan='4'>".MDCLAN_14.":</td>
+	<td class='forumheader3' style='text-align:right' colspan='5'>".MDCLAN_14.":</td>
 	<td style='width:25%;' class='forumheader3'>
 	<input type='radio' name='comment_lock' value='0' ".(!$comment_lock ? " checked='checked'" : "")." /> ".MDCLAN_15." 
 	<input type='radio' name='comment_lock' value='1' ".($comment_lock ? " checked='checked'" : "")." /> ".MDCLAN_16."
 	<input type='hidden' name='current_lock' value='".$comment_lock."' />
 	</td>
-	</tr>
-	<tr><td colspan='5' class='fcaption'>".MDCLAN_12." (".$total_comments." ".($total_comments == "1" ? MDCLAN_11 : MDCLAN_12).", ".$total_blocked." ".MDCLAN_13.")</td></tr>
+	</tr>";
+	
+	if($type && $table && $id)
+	{
+		$text .= $lockoptions;
+	}
+	
+	$caption = MDCLAN_12;
+	
+	$caption .=" (".$total_comments." ".($total_comments == "1" ? MDCLAN_11 : MDCLAN_12);
+	
+	if(varset($_GET['mode']) !='pending')
+	{
+		$caption .= ", ".$total_blocked." ".MDCLAN_13;	
+	}
+
+	$caption .= ")";
+	
+	$text .= "<tr><td colspan='6' class='fcaption'>".$caption."</td></tr>
 	".$comments."
-	<tr><td colspan='5' class='forumheader' style='text-align:center'>".MDCLAN_9."</td></tr>
-	<tr><td colspan='5' class='forumheader' style='text-align:center'><input class='button' type='submit' name='moderate' value='".MDCLAN_8."' /></td></tr>
+	<tr><td colspan='6' class='forumheader' style='text-align:center'>".MDCLAN_9."</td></tr>
+	<tr><td colspan='6' class='forumheader' style='text-align:center'><input class='button' type='submit' name='moderate' value='".MDCLAN_8."' /></td></tr>
 	";
 }
-$text .= "</table></form></div>";
+$text .= "</table>
+<div><input type='hidden' name='e-token' value='".e_TOKEN."' /></div>
+</form>
+
+</div>";
+
+if($totalCom > $amount)
+{
+	$parms = $totalCom.",".$amount.",".$from.",".e_SELF.'?mode='.$_GET['mode'].'&amp;frm=[FROM]';
+	$text .= "<div style='text-align:center;margin-top:10px'>".$tp->parseTemplate("{NEXTPREV=$parms}",TRUE)."</div>";
+}
 
 $ns->tablerender(MDCLAN_8, $text);
 
 require_once("footer.php");
 
+//v1.0.2
+function commentOptions($row)
+{
+	$text = "<div style='margin-left:8px;display:inline-block;width:110px'>";
+	
+	switch ($row['comment_blocked']) 
+	{		
+		case 2:
+			$text .= "<input type='checkbox' name='comment_approve[]' value='".$row['comment_id']."' /> ".MDCLAN_7;		
+		break;			
+		
+		case 1:
+			$text .= "<input type='checkbox' name='comment_unblocked[]' value='".$row['comment_id']."' /> ".MDCLAN_5;
+		break;
+		
+		default:
+			$text .= "<input type='checkbox' name='comment_blocked[]' value='".$row['comment_id']."' /> ".MDCLAN_6;
+		break;
+	}
+	
+	$text .= "</div><div style='display:inline-block;width:100px'>
+	<input type='checkbox' name='comment_delete[]' value='".$row['comment_id']."' /> ".LAN_DELETE;
+	$text .= "</div>";
+	
+	return $text;			
+}
 
 
+function statusIcon($val)
+{
+	switch ($val) 
+	{		
+		case 2:
+			return "<img src='".e_IMAGE."admin_images/nopreview.png' style='width:22px;height:22px' alt='' />";	
+		break;			
+		
+		case 1:
+			return "<img src='".e_IMAGE."admin_images/blocked.png' alt='' />";	
+		break;
+		
+		default:
+			return "&nbsp;";	
+		break;
+	}
+	
+}
+
 function delete_children($row, $cid) 
 {
+	
 	global $sql, $sql2, $table;
 
 	$tmp = explode(".", $row['comment_author']);
@@ -207,4 +325,19 @@
 	}
 }
 
+function modcomment_adminmenu() 
+{
+	include_lan(e_LANGUAGEDIR.e_LANGUAGE."/lan_comment.php");
+	
+	$act = varset($_GET['mode'],'pending');
+	
+	$var['pending']['text'] = COMLAN_331; // "Pending Approval";
+	$var['pending']['link'] = e_SELF."?mode=pending";
+
+	$var['all']['text'] = ADLAN_117; // "All entries";
+	$var['all']['link'] = e_SELF."?mode=all";
+
+	show_admin_menu(MDCLAN_8, $act, $var);
+}
+
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_admin/newspost.php 1.0.2.src/e107_admin/newspost.php
--- 1.0.0.src/e107_admin/newspost.php	2012-10-30 15:39:55.469449648 +0000
+++ 1.0.2.src/e107_admin/newspost.php	2012-10-30 15:40:38.293442063 +0000
@@ -10,11 +10,19 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/newspost.php $
-|     $Revision: 12383 $
-|     $Id: newspost.php 12383 2011-11-18 22:06:21Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12992 $
+|     $Id: newspost.php 12992 2012-10-16 07:07:39Z secretr $
+|     $Author: secretr $
 +----------------------------------------------------------------------------+
 */
+
+// e-token check
+if(!empty($_POST) && !isset($_POST['e-token']))
+{
+	// set e-token so it can be processed by class2
+	$_POST['e-token'] = '';
+}
+
 require_once('../class2.php');
 
 if (!getperms('H')) 
@@ -143,6 +151,7 @@
 		$newspost->show_message(NWSLAN_33.' #'.$del_id.' '.NWSLAN_32);
 		unset($delete, $del_id);
 	}
+	unset($_SESSION['news_categories']);
 }
 
 if($delete == 'sn' && $del_id)
@@ -220,6 +229,7 @@
 		$_POST['category_name'] = $tp->toDB($_POST['category_name']);
 		$sql->db_Insert('news_category', "'0', '".$_POST['category_name']."', '".$_POST['category_button']."'");
 		$newspost->show_message(NWSLAN_35);
+		unset($_SESSION['news_categories']);
 	}
 }
 
@@ -235,6 +245,7 @@
 	$e107cache->clear('news.php');
 	$e107cache->clear('othernews');
 	$e107cache->clear('othernews2');
+	unset($_SESSION['news_categories']);
 }
 
 if (isset($_POST['save_prefs'])) 
@@ -353,8 +364,10 @@
 			<tr>
 			<td style='width:5%' class='fcaption'><a href='".e_SELF."?main.news_id.{$sort_link}.{$from}'>".LAN_NEWS_45."</a></td>
 			<td style='width:55%' class='fcaption'><a href='".e_SELF."?main.news_title.{$sort_link}.{$from}'>".NWSLAN_40."</a></td>
+			<td style='width:15%' class='fcaption'><a href='".e_SELF."?main.news_category.{$sort_link}.{$from}'>".NWSLAN_6."</a></td>
 			<td style='width:15%' class='fcaption'>".LAN_NEWS_49."</td>
-			<td style='width:15%' class='fcaption'>".LAN_OPTIONS."</td>
+			
+			<td style='width:10%' class='fcaption'>".LAN_OPTIONS."<input type='hidden' name='e-token' value='".e_TOKEN."' /></td>
 			</tr>";
 			$ren_type = array('default','title','other-news','other-news 2');
 			foreach($newsarray as $row)
@@ -365,7 +378,9 @@
 				$text .= "<tr>
 				<td style='width:5%' class='forumheader3'>{$news_id}</td>
 				<td style='width:55%' class='forumheader3'><a href='".e_BASE."news.php?item.{$news_id}.{$news_category}'>".($news_title ? $tp->toHTML($news_title,"","no_hook,emotes_off,no_make_clickable") : "[".NWSLAN_42."]")."</a></td>
-				<td style='20%' class='forumheader3'>";
+				
+				<td style='15%' class='forumheader3' >".$this->show_category($news_category)."</td>
+				<td style='15%' class='forumheader3'>";
 				$text .= $ren_type[$news_render_type];
 				if($news_sticky)
 				{
@@ -375,7 +390,7 @@
 				$text .= "
 				</td>
 
-				<td style='width:15%; text-align:center' class='forumheader3'>
+				<td style='width:10%; text-align:center' class='forumheader3'>
 				<a href='".e_SELF."?create.edit.{$news_id}'>".ADMIN_EDIT_ICON."</a>
 				<input type='image' title='".LAN_DELETE."' name='delete[main_{$news_id}]' src='".ADMIN_DELETE_ICON_PATH."' onclick=\"return jsconfirm('".NWSLAN_39." [ID: $news_id ]')\"/>
 				</td>
@@ -394,9 +409,41 @@
 			$parms = $newsposts.','.$amount.','.$from.','.e_SELF.'?'.(e_QUERY ? "{$action}.{$sub_action}.{$sort_order}." : "main.news_datestamp.desc.")."[FROM]";
 			$text .= '<br />'.$tp->parseTemplate("{NEXTPREV={$parms}}");
 		}
-		$text .= "<br /><form method='post' action='".e_SELF."'>\n<p>\n<input class='tbox' type='text' name='searchquery' size='20' value='' maxlength='50' />\n<input class='button' type='submit' name='searchsubmit' value='".NWSLAN_63."' />\n</p>\n</form>\n</div>";
+		$text .= "<br /><form method='post' action='".e_SELF."'><input type='hidden' name='e-token' value='".e_TOKEN."' />\n<p>\n<input class='tbox' type='text' name='searchquery' size='20' value='' maxlength='50' />\n<input class='button' type='submit' name='searchsubmit' value='".NWSLAN_63."' />\n</p>\n</form>\n</div>";
 		$ns->tablerender(NWSLAN_4, $text);
 	}
+	
+	function show_category($id)
+	{
+		global $sql2,$tp;	
+		
+		if(!$_SESSION['news_categories'])
+		{
+			if ($sql2->db_Select('news_category', '*'))
+			{
+				while($row = $sql2->db_Fetch(MYSQL_ASSOC))
+				{
+					$_SESSION['news_categories'][$row['category_id']] = $row['category_name'];	
+				}				
+			}
+			else
+			{
+				$_SESSION['news_categories'] = array();		
+			}	
+		}		
+			
+		if(isset($_SESSION['news_categories'][$id]))
+		{
+			return $tp->toHtml($_SESSION['news_categories'][$id],FALSE,"defs");	
+		}
+		else
+		{
+			return "";
+		}
+		
+	}
+	
+	
 
 	function show_options($action) 
 	{
@@ -612,6 +659,7 @@
 		$parms .= '&height=100px';
 		$parms .= '&multiple=TRUE';
 		$parms .= '&label=-- '.LAN_NEWS_48.' --';
+		$parms .= '&subdirs=4';
 
         $text .= $tp->parseTemplate("{IMAGESELECTOR={$parms}}");
 
@@ -790,10 +838,11 @@
 
 		$text .= "<tr style='vertical-align: top;'>
 		<td colspan='2'  style='text-align:center' class='forumheader'>".
-
+		
 		(isset($_POST['preview']) ? "<input class='button' type='submit' name='preview' value='".NWSLAN_24."' /> " : "<input class='button' type='submit' name='preview' value='".NWSLAN_27."' /> ").
 		($id && $sub_action != 'sn' && $sub_action != 'upload' ? "<input class='button' type='submit' name='submit_news' value='".NWSLAN_25."' /> " : "<input class='button' type='submit' name='submit_news' value='".NWSLAN_26."' /> ")."
-
+		
+		<input type='hidden' name='e-token' value='".e_TOKEN."' />
 		<input type='hidden' name='news_id' value='{$news_id}' />  \n</td>
 		</tr>
 		</table>
@@ -976,7 +1025,8 @@
 		$text .= "</div></td>
 		</tr>
 
-		<tr><td colspan='2' style='text-align:center' class='forumheader'>";
+		<tr><td colspan='2' style='text-align:center' class='forumheader'>
+		<input type='hidden' name='e-token' value='".e_TOKEN."' />";
 		if ($id) 
 		{
 			$text .= "<input class='button' type='submit' name='update_category' value='".NWSLAN_55."' />
@@ -1005,7 +1055,7 @@
 			<td style='width:5%' class='fcaption'>".LAN_NEWS_45."</td>
 			<td style='width:5%' class='fcaption'>&nbsp;</td>
 			<td style='width:70%' class='fcaption'>".NWSLAN_6."</td>
-			<td style='width:20%; text-align:center' class='fcaption'>".LAN_OPTIONS."</td>
+			<td style='width:20%; text-align:center' class='fcaption'>".LAN_OPTIONS."<input type='hidden' name='e-token' value='".e_TOKEN."' /></td>
 			</tr>";
 			while ($row = $sql->db_Fetch())
 			{
@@ -1152,7 +1202,7 @@
 		</tr>
 
 		<tr><td colspan='2' style='text-align:center' class='forumheader'>";
-		$text .= "<input class='button' type='submit' name='save_prefs' value='".NWSLAN_89."' /></td></tr>";
+		$text .= "<input type='hidden' name='e-token' value='".e_TOKEN."' /><input class='button' type='submit' name='save_prefs' value='".NWSLAN_89."' /></td></tr>";
 
 		$text .= "</table>
 		".$rs->form_close()."
@@ -1168,7 +1218,7 @@
 		".$rs->form_open('post', e_SELF.'?maint', 'dataform')."
 		<table class='fborder' style='".ADMIN_WIDTH."'>
 		<tr><td class='forumheader3'>".LAN_NEWS_51."</td><td class='forumheader3'><input type='checkbox' name='newsdeletecomments' value='1'>".LAN_NEWS_61."</td><td style='text-align:center;' class='forumheader3'>";
-		$text .= "<input class='button' type='submit' name='news_comments_recalc' value='".LAN_NEWS_52."' /></td></tr>";
+		$text .= "<input type='hidden' name='e-token' value='".e_TOKEN."' /><input class='button' type='submit' name='news_comments_recalc' value='".LAN_NEWS_52."' /></td></tr>";
 		$text .= "</table>
 		".$rs->form_close()."
 		</div>";
@@ -1244,6 +1294,7 @@
 				."<div style='white-space:nowrap'>".
 				$rs->form_button('button', 'category_view_'.$submitnews_id, NWSLAN_27, "onclick=\"expandit('submitted_".$submitnews_id."')\"").
 				$rs->form_button('button', 'category_edit_'.$submitnews_id, $buttext, "onclick=\"document.location='".e_SELF."?create.sn.{$submitnews_id}'\"")."
+				<input type='hidden' name='e-token' value='".e_TOKEN."' />
 				<input type='submit' class='button' name='delete[sn_".$submitnews_id."]' value=\"".LAN_DELETE."\" />
 				</div>".$rs->form_close()."
 				</td>
diff -x .svn -aruN 1.0.0.src/e107_admin/notify.php 1.0.2.src/e107_admin/notify.php
--- 1.0.0.src/e107_admin/notify.php	2012-10-30 15:39:55.470445525 +0000
+++ 1.0.2.src/e107_admin/notify.php	2012-10-30 15:40:38.293442063 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/notify.php $
-|     $Revision: 11695 $
-|     $Id: notify.php 11695 2010-08-23 18:12:30Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12892 $
+|     $Id: notify.php 12892 2012-07-21 03:20:42Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 require_once('../class2.php');
@@ -47,24 +47,26 @@
 
 		$recalibrate = FALSE;
 		// load every e_notify.php file.
-        foreach($pref['e_notify_list'] as $val)
+		if(is_array($pref['e_notify_list']))
 		{
-				if (!isset($this -> notify_prefs['plugins'][$val]))
-				{
-					$this -> notify_prefs['plugins'][$val] = TRUE;
-					if (is_readable(e_PLUGIN.$val."/e_notify.php"))
+	        foreach($pref['e_notify_list'] as $val)
+			{
+					if (!isset($this -> notify_prefs['plugins'][$val]))
 					{
-						require_once(e_PLUGIN.$val.'/e_notify.php');
-						foreach ($config_events as $event_id => $event_text)
-				   		{
-							$this -> notify_prefs['event'][$event_id] = array('type' => 'off', 'class' => '254', 'email' => '');
+						$this -> notify_prefs['plugins'][$val] = TRUE;
+						if (is_readable(e_PLUGIN.$val."/e_notify.php"))
+						{
+							require_once(e_PLUGIN.$val.'/e_notify.php');
+							foreach ($config_events as $event_id => $event_text)
+					   		{
+								$this -> notify_prefs['event'][$event_id] = array('type' => 'off', 'class' => '254', 'email' => '');
+							}
+							$recalibrate = true;
 						}
-						$recalibrate = true;
 					}
-				}
+			}
 		}
 
-
 		if ($recalibrate) {
 			$s_prefs = $tp -> toDB($this -> notify_prefs);
 			$s_prefs = $eArrayStorage -> WriteArray($s_prefs);
@@ -112,20 +114,30 @@
 		</tr>";
 
 		$text .= $this -> render_event('fileupload', NF_LAN_2);
+		
+		$text .= "<tr>
+		<td colspan='2' class='forumheader'>".CM_LAN_1."</td>
+		</tr>";
 
-		foreach ($this -> notify_prefs['plugins'] as $plugin_id => $plugin_settings) {
-            if(is_readable(e_PLUGIN.$plugin_id.'/e_notify.php'))
-			{
-				require(e_PLUGIN.$plugin_id.'/e_notify.php');
-				$text .= "<tr>
-				<td colspan='2' class='forumheader'>".$config_category."</td>
-				</tr>";
-				foreach ($config_events as $event_id => $event_text) {
-					$text .= $this -> render_event($event_id, $event_text);
+		$text .= $this -> render_event('commentpending', CM_LAN_2);
+		
+
+		if(is_array($this -> notify_prefs['plugins']))
+		{
+			foreach ($this -> notify_prefs['plugins'] as $plugin_id => $plugin_settings) {
+	            if(is_readable(e_PLUGIN.$plugin_id.'/e_notify.php'))
+				{
+					require(e_PLUGIN.$plugin_id.'/e_notify.php');
+					$text .= "<tr>
+					<td colspan='2' class='forumheader'>".$config_category."</td>
+					</tr>";
+					foreach ($config_events as $event_id => $event_text) {
+						$text .= $this -> render_event($event_id, $event_text);
+					}
 				}
 			}
 		}
-
+		
 		$text .= "<tr>
 		<td colspan='2' style='text-align:center' class='forumheader'>".$rs -> form_button('submit', 'update', LAN_UPDATE)."</td>
 		</tr>
diff -x .svn -aruN 1.0.0.src/e107_admin/prefs.php 1.0.2.src/e107_admin/prefs.php
--- 1.0.0.src/e107_admin/prefs.php	2012-10-30 15:39:55.470445525 +0000
+++ 1.0.2.src/e107_admin/prefs.php	2012-10-30 15:40:38.294444583 +0000
@@ -10,8 +10,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/prefs.php $
-|     $Revision: 12295 $
-|     $Id: prefs.php 12295 2011-06-29 04:21:07Z e107coders $
+|     $Revision: 12892 $
+|     $Id: prefs.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -981,6 +981,18 @@
 	<input type='radio' name='comments_emoticons' value='0'".(!$pref['comments_emoticons'] ? " checked='checked'" : "")." /> ".PRFLAN_113."
 	</td>
 	</tr>
+	
+		<tr>
+	<td style='width:50%' class='forumheader3'>".PRFLAN_222.": <br />
+	<div class='smalltext'>".PRFLAN_223."</div></td>
+	<td style='width:50%; text-align:right' class='forumheader3'>
+	".r_userclass('comments_moderate',varset($pref['comments_moderate'],e_UC_NOBODY),'off','guest,new,admin,main,public,member,classes')."
+	</td>
+	</tr>
+	
+	
+	
+
 
 	<tr>
 	<td class='fcaption' style='text-align:left;' colspan='2'>".PRFLAN_209."</td>
diff -x .svn -aruN 1.0.0.src/e107_admin/update_routines.php 1.0.2.src/e107_admin/update_routines.php
--- 1.0.0.src/e107_admin/update_routines.php	2012-10-30 15:39:55.468444500 +0000
+++ 1.0.2.src/e107_admin/update_routines.php	2012-10-30 15:40:38.296444712 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/update_routines.php $
-|     $Revision: 12178 $
-|     $Id: update_routines.php 12178 2011-05-02 20:45:40Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12714 $
+|     $Id: update_routines.php 12714 2012-05-12 01:52:52Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 
@@ -129,14 +129,21 @@
 		}
 	}
 
-	foreach($dbupdatep as $func => $rmks) {
-		if (function_exists("update_".$func)) {
-			if (!call_user_func("update_".$func, FALSE)) {
-				$update_needed = TRUE;
-				continue;
+	if(is_array($dbupdatep))
+	{
+		foreach($dbupdatep as $func => $rmks)
+		{
+			if (function_exists("update_".$func))
+			{
+				if (!call_user_func("update_".$func, FALSE))
+				{
+					$update_needed = TRUE;
+					continue;
+				}
 			}
-		}
+		}	
 	}
+
   	$e107cache->set("nq_admin_updatecheck", time().','.($update_needed ? '2,' : '1,').$e107info['e107_version'], TRUE);
   }
   else  
diff -x .svn -aruN 1.0.0.src/e107_admin/users.php 1.0.2.src/e107_admin/users.php
--- 1.0.0.src/e107_admin/users.php	2012-10-30 15:39:55.470445525 +0000
+++ 1.0.2.src/e107_admin/users.php	2012-10-30 15:40:38.298444182 +0000
@@ -10,8 +10,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/users.php $
-|     $Revision: 12422 $
-|     $Id: users.php 12422 2011-11-29 23:36:57Z e107coders $
+|     $Revision: 12892 $
+|     $Id: users.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -163,6 +163,9 @@
 	$pref['track_online'] = $_POST['track_online'];
 	$pref['force_userupdate'] = $_POST['force_userupdate'];
 	$pref['memberlist_access'] = $_POST['memberlist_access'];
+	$pref['signature_access']	= $_POST['signature_access'];
+	$pref['user_new_period']	= $_POST['user_new_period'];
+
 	save_prefs();
 	$user->show_message(USRLAN_1);
 }
@@ -1028,6 +1031,20 @@
 			<td style='width:50%' class='forumheader3'>".r_userclass("memberlist_access",$pref['memberlist_access'], "off", "public,member,guest,admin,main,classes,nobody")."
 			</td>
 			</tr>
+			
+			<tr>
+			<td style='width:50%' class='forumheader3'>".USRLAN_194.":</td>
+			<td style='width:50%' class='forumheader3'>". 
+				r_userclass('signature_access',$pref['signature_access'],'off',"member,admin,main,classes,nobody")
+				."</td>
+			</tr>
+	
+			<tr>
+			<td style='width:50%' class='forumheader3'>".USRLAN_190.":<div class='smalltext field-help'>".USRLAN_191."</div></td>
+			<td style='width:50%' class='forumheader3'>
+			<input class='tbox' type='text' name='user_new_period' size='10' value='".varset($pref['user_new_period'],0)."' maxlength='5' /> ".LANDT_04s."
+			
+			</td></tr>
 
 			<tr>
 			<td colspan='2' style='text-align:center' class='forumheader'>
diff -x .svn -aruN 1.0.0.src/e107_admin/ver.php 1.0.2.src/e107_admin/ver.php
--- 1.0.0.src/e107_admin/ver.php	2012-10-30 15:39:55.472444665 +0000
+++ 1.0.2.src/e107_admin/ver.php	2012-10-30 15:40:38.298444182 +0000
@@ -1,13 +1,13 @@
 <?php
 /*
-* Copyright (c) 2011 e107 Inc e107.org, Licensed under GNU GPL (http://www.gnu.org/licenses/gpl.txt)
+* Copyright (c) 2012 e107 Inc e107.org, Licensed under GNU GPL (http://www.gnu.org/licenses/gpl.txt)
 * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_admin/ver.php $
-* $Id: ver.php 12480 2011-12-28 07:43:18Z e107coders $
+* $Id: ver.php 12998 2012-10-22 20:56:44Z e107coders $
 *
 * Version file
 */
 
 if (!defined('e107_INIT')) { exit; }
 
-$e107info['e107_version'] = "1.0.0";
+$e107info['e107_version'] = "1.0.2";
 ?>
diff -x .svn -aruN 1.0.0.src/e107_files/bbcode/bb_youtube.php 1.0.2.src/e107_files/bbcode/bb_youtube.php
--- 1.0.0.src/e107_files/bbcode/bb_youtube.php	2012-10-30 15:39:55.425443784 +0000
+++ 1.0.2.src/e107_files/bbcode/bb_youtube.php	2012-10-30 15:40:38.304444598 +0000
@@ -216,6 +216,9 @@
 
 		list($dimensions,$tmp) = explode('|', $parm, 2);
 		
+		
+		$code_text = str_replace("&amp;","&",$code_text); // Quick Fix. 
+		
 		if($tmp)
 		{
 			parse_str(varset($tmp, ''), $bbparm);
@@ -234,8 +237,13 @@
 		$code_text = $parms[0];
 			
 		parse_str(varset($parms[1], ''), $params);
+		/*
+				if(getperms('0'))
+				{
+					print_a($parms);	
+				}
+		*/
 		
-	//	print_a($params);
 
 		if(empty($dimensions)) $dimensions = 'medium'; // (default as per YouTube spec)
 		// formula: width x (height+25px)
@@ -284,12 +292,12 @@
 		$url = isset($bbparm['privacy']) ? 'http://www.youtube-nocookie.com/v/' : 'http://www.youtube.com/v/';
 		$url .= $yID.'?';
 
-		if(isset($params['nofull']) || !varset($params['fs'])) 
+		if(isset($params['nofull']) || varset($params['fs'])=='0') 
 		{
 			$fscr = 'false';
 			$url = $url.'fs='.intval($params['fs']);
 		} 
-		else 
+		else // fullscreen option enabled is the default. 
 		{
 			$fscr = 'true';
 			$url = $url.'fs=1';
@@ -341,19 +349,23 @@
 		{
 			$url .= "&amp;autoplay=".intval($params['autoplay']);
 		}
+
+		// Show Info by default. 
+		$url .= (isset($params['showinfo'])) ? "&amp;showinfo=".intval($params['showinfo']) : "&amp;showinfo=1";
+		
 		
 		$ret = '
 		
 <!-- Start YouTube --> 
 		
-		<object width="'.$params['w'].'" height="'.$params['h'].'" >
+		<object class="bbcode youtube" width="'.$params['w'].'" height="'.$params['h'].'" >
 			<param name="movie" value="'.$url.'"></param>
 			<param name="allowFullScreen" value="'.$fscr.'"></param>
 			<param name="allowscriptaccess" value="always"></param>
 			<param name="wmode" value="transparent"></param>
 		';		
 	// Not XHTML - but needed for compatibility. 
-		$ret .= '<embed src="'.$url.'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="'.$fscr.'" wmode="transparent" width="'.$params['w'].'" height="'.$params['h'].'"></embed>';
+		$ret .= '<embed class="bbcode youtube" src="'.$url.'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="'.$fscr.'" wmode="transparent" width="'.$params['w'].'" height="'.$params['h'].'"></embed>';
 		$ret .= '</object>';
 		$ret .= '
 <!-- End YouTube -->
diff -x .svn -aruN 1.0.0.src/e107_files/bbcode/blockquote.bb 1.0.2.src/e107_files/bbcode/blockquote.bb
--- 1.0.0.src/e107_files/bbcode/blockquote.bb	2012-10-30 15:39:55.424445397 +0000
+++ 1.0.2.src/e107_files/bbcode/blockquote.bb	2012-10-30 15:40:38.304444598 +0000
@@ -1 +1 @@
-return "<div class='indent'>{$code_text}</div>";
\ No newline at end of file
+return "<div class='indent bbcode-blockquote'>{$code_text}</div>";
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_files/bbcode/list.bb 1.0.2.src/e107_files/bbcode/list.bb
--- 1.0.0.src/e107_files/bbcode/list.bb	2012-10-30 15:39:55.425443784 +0000
+++ 1.0.2.src/e107_files/bbcode/list.bb	2012-10-30 15:40:38.306444397 +0000
@@ -1,3 +1,4 @@
+//<?
 /* Tag: unordered list [list][*]line 1[*]line2[*]line 3[*]line 4[*]line5 etc[/list]  - preferred */
 /* Tag: ordered list [list=<list type>][*]line 1[*]line2[*]line 3[*]line 4[*]line5 etc[/list]  - preferred */
 /* Tag: unordered list [list]*line 1*line2*line 3*line 4*line5 etc[/list]  - legacy*/
@@ -30,14 +31,14 @@
 else
 {
   $type = $tp -> toAttribute($parm);
-  $listtext = "\n<ol class='bbcode' style='list-style-type: $type'>";
+  $listtext = "\n<ol class='bbcode ".$type."' style='list-style-type: $type'>";
   $trailer = "</ol>";
 }
 foreach($listitems as $item)
 {
   if($item && $item != E_NL)
   {
-	$listtext .= "<li class='bbcode'>$item</li>";
+	$listtext .= "<li class='bbcode ".$type."'>$item</li>";
   }
 }
 return $listtext.$trailer;
diff -x .svn -aruN 1.0.0.src/e107_files/def_e107_prefs.php 1.0.2.src/e107_files/def_e107_prefs.php
--- 1.0.0.src/e107_files/def_e107_prefs.php	2012-10-30 15:39:55.426445082 +0000
+++ 1.0.2.src/e107_files/def_e107_prefs.php	2012-10-30 15:40:38.308444392 +0000
@@ -8,7 +8,7 @@
  * GNU General Public License (http://gnu.org).
  * 
  * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_files/def_e107_prefs.php $
- * $Id: def_e107_prefs.php 12477 2011-12-28 03:12:22Z e107coders $
+ * $Id: def_e107_prefs.php 12892 2012-07-21 03:20:42Z e107coders $
  */
 
 
@@ -166,7 +166,9 @@
   'check_updates' => '1',
   'user_tracking' => 'cookie',
   'cookie_name' => 'e107cookie',
-  'email_item_class' => '253'			// Members only
+  'email_item_class' => '253',			// Members only
+  'signature_access' => '253',
+  'user_new_period'	=> 3,
 );
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_files/e107.js 1.0.2.src/e107_files/e107.js
--- 1.0.0.src/e107_files/e107.js	2012-10-30 15:39:55.428444823 +0000
+++ 1.0.2.src/e107_files/e107.js	2012-10-30 15:40:38.309442248 +0000
@@ -4,8 +4,8 @@
 |	e107 website system - Javascript File.
 |
 |	$URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_files/e107.js $
-|	$Revision: 12346 $
-|	$Id: e107.js 12346 2011-09-02 13:20:04Z secretr $
+|	$Revision: 12549 $
+|	$Id: e107.js 12549 2012-01-13 06:55:24Z e107coders $
 +----------------------------------------------------------------------------+
 */
 
@@ -30,21 +30,22 @@
  * The value calculated in SyncWithServerTime is not known until after the
  * entire page has been processed.
  */
-function SyncWithServerTime(serverTime)
+function SyncWithServerTime(serverTime,domain)
 {
 	if (serverTime) 
 	{
 	  	/* update time difference cookie */
 		var serverDelta=Math.floor(localTime-serverTime);
-	  	document.cookie = 'e107_tdOffset='+serverDelta+'; path=/';
-	  	document.cookie = 'e107_tdSetTime='+(localTime-serverDelta)+'; path=/'; /* server time when set */
+		
+	  	document.cookie = 'e107_tdOffset='+serverDelta+'; path=/; domain= .'+domain;
+	  	document.cookie = 'e107_tdSetTime='+(localTime-serverDelta)+'; path=/; domain=.'+domain; /* server time when set */
 	}
 
 	var tzCookie = 'e107_tzOffset=';
 //	if (document.cookie.indexOf(tzCookie) < 0) {
 		/* set if not already set */
 		var timezoneOffset = nowLocal.getTimezoneOffset(); /* client-to-GMT in minutes */
-		document.cookie = tzCookie + timezoneOffset+'; path=/';
+		document.cookie = tzCookie + timezoneOffset+'; path=/; domain=.'+domain;
 //	}
 }
 var ns6=0;
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/admin_credits.sc 1.0.2.src/e107_files/shortcode/admin_credits.sc
--- 1.0.0.src/e107_files/shortcode/admin_credits.sc	2012-10-30 15:39:55.436444511 +0000
+++ 1.0.2.src/e107_files/shortcode/admin_credits.sc	2012-10-30 15:40:38.319444772 +0000
@@ -1,5 +1,5 @@
 if (ADMIN) {
 	return "<div style='text-align: center'>
-			<a class='credits' href='".e_ADMIN_ABS."credits.php' title='".LAN_CREDITS."' target='_blank'>".LAN_CREDITS."</a>
+			<a class='credits' href='".e_ADMIN_ABS."credits.php' title='".LAN_CREDITS."' rel='external'>".LAN_CREDITS."</a>
 			</div>";
 }
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/admin_menu.sc 1.0.2.src/e107_files/shortcode/admin_menu.sc
--- 1.0.0.src/e107_files/shortcode/admin_menu.sc	2012-10-30 15:39:55.433443670 +0000
+++ 1.0.2.src/e107_files/shortcode/admin_menu.sc	2012-10-30 15:40:38.321488267 +0000
@@ -18,7 +18,8 @@
 		}
 	}
 	$plugindir = (str_replace("/","",str_replace("..","",e_PLUGIN))."/");
-	$plugpath = e_PLUGIN.str_replace(basename(e_SELF),"",str_replace($plugindir,"",strstr(e_SELF,$plugindir)))."admin_menu.php";
+	$plugpath = e_PLUGIN.str_replace(basename(e_SELF),"",str_replace("/".$plugindir,"","/".strstr(e_SELF,$plugindir)))."admin_menu.php";
+	
 	if(file_exists($plugpath)){
 		if (!$parm) {
 			@require_once($plugpath);
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/admin_update.sc 1.0.2.src/e107_files/shortcode/admin_update.sc
--- 1.0.0.src/e107_files/shortcode/admin_update.sc	2012-10-30 15:39:55.434445086 +0000
+++ 1.0.2.src/e107_files/shortcode/admin_update.sc	2012-10-30 15:40:38.322444447 +0000
@@ -1,4 +1,4 @@
-// $Id: admin_update.sc 12135 2011-04-13 19:45:31Z e107steved $
+// $Id: admin_update.sc 12523 2012-01-09 01:51:55Z e107coders $
 //<?
 
 	if (!ADMIN) return "";
@@ -7,11 +7,13 @@
 	
   	if (!varset($pref['check_updates'], FALSE)) return "";
 	
-	if($parm == "adminpanel" && (strpos(e_SELF,e_ADMIN_ABS."admin.php")===FALSE))
+	list($when,$parm) = explode("|",$parm);
+	
+	if($when == "adminpanel" && (strpos(e_SELF,e_ADMIN_ABS."admin.php")===FALSE))
 	{ 
 		return;
 	}
-	if(($parm == "notadminpanel") && (strpos(e_SELF,e_ADMIN_ABS."admin.php")!==FALSE))
+	if(($when == "notadminpanel" || $when == '') && (strpos(e_SELF,e_ADMIN_ABS."admin.php")!==FALSE))
 	{
 		return;
 	}
@@ -28,11 +30,21 @@
 
 	$cacheData = $e107cache->retrieve("releasecheck",3600, TRUE);
 	
+	
     if($cacheData)
     {
-		if ($cacheData == 'up-to-date') return '';
-		$tmp = explode('|', $cacheData);
-   	  	return $ns -> tablerender($tmp[0], $tmp[1],'admin_update');
+    	list($caption,$ftext) = explode('|', $cacheData);
+		if ($cacheData == 'up-to-date') return '';		
+		
+    	if($parm == 'text')
+		{
+			return "<div id='new-version'><div id='new-version-caption'>".$caption."</div><div id='new-version-diz'>".$ftext."</div></div>" ;	
+		}
+		else
+		{
+   	  		return $ns -> tablerender($caption, $ftext,'admin_update');	
+		}
+		
     }
 	
 	// Keep commented out to be sure it continues to work under all circumstances.
@@ -85,7 +97,7 @@
 	if($ftext)
 	{
 		$e107cache->set("releasecheck", $caption.'|'.$ftext, TRUE);
-		return $ns -> tablerender($caption, $ftext,'admin_update');
+		return ($parm == 'text') ? "<div id='new-version'><div id='new-version-caption'>".$caption."</div><div id='new-version-diz'>".$ftext."</div></div>" : $ns -> tablerender($caption, $ftext,'admin_update');
 	}
 	else
 	{
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/batch/comment_shortcodes.php 1.0.2.src/e107_files/shortcode/batch/comment_shortcodes.php
--- 1.0.0.src/e107_files/shortcode/batch/comment_shortcodes.php	2012-10-30 15:39:55.435444212 +0000
+++ 1.0.2.src/e107_files/shortcode/batch/comment_shortcodes.php	2012-10-30 15:40:38.323444698 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_files/shortcode/batch/comment_shortcodes.php $
-|     $Revision: 11678 $
-|     $Id: comment_shortcodes.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: comment_shortcodes.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -56,7 +56,7 @@
 SC_BEGIN REPLY
 global $REPLY, $comrow, $action, $pref, $table, $id, $thisaction, $thistable, $thisid;
 $REPLY = '';
-if($comrow['comment_lock'] != "1"){
+if($comrow['comment_lock'] != "1" && $comrow['comment_blocked'] != "2"){
 	if ($thisaction == "comment" && $pref['nested_comments']) {
 		$REPLY = "<a href='".SITEURL."comment.php?reply.".$thistable.".".$comrow['comment_id'].".".$thisid."'>".COMLAN_326."</a>";
 	}
@@ -97,6 +97,10 @@
 
 SC_BEGIN COMMENT
 global $COMMENT, $comrow, $tp, $pref;
+if(varset($comrow['comment_blocked'])==2)
+{
+ 	return "[".COMLAN_331."]"; // Pending Approval
+}
 return (isset($comrow['comment_blocked']) && $comrow['comment_blocked'] ? COMLAN_0 : $tp->toHTML($comrow['comment_comment'], TRUE, FALSE, $comrow['user_id']));
 SC_END
 
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/batch/contact_shortcodes.php 1.0.2.src/e107_files/shortcode/batch/contact_shortcodes.php
--- 1.0.0.src/e107_files/shortcode/batch/contact_shortcodes.php	2012-10-30 15:39:55.435444212 +0000
+++ 1.0.2.src/e107_files/shortcode/batch/contact_shortcodes.php	2012-10-30 15:40:38.323444698 +0000
@@ -10,8 +10,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_files/shortcode/batch/contact_shortcodes.php $
-|     $Revision: 11678 $
-|     $Id: contact_shortcodes.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12850 $
+|     $Id: contact_shortcodes.php 12850 2012-06-30 08:58:35Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -39,11 +39,12 @@
 }
 
 $text = "<select name='contact_person' class='tbox contact_person'>\n";
-$count = $sql -> db_Select("user", "user_id,user_name", $query . " ORDER BY user_name");
+$count = $sql -> db_Select("user", "user_id,user_name,user_customtitle", $query . " ORDER BY user_customtitle,user_name");
 if($count > 1){
     while($row = $sql-> db_Fetch())
 	{
-    	$text .= "<option value='".$row['user_id']."'>".$row['user_name']."</option>\n";
+ 		$name = ($row['user_customtitle'] !='') ? $row['user_customtitle'] : $row['user_name'];
+    	$text .= "<option value='".$row['user_id']."'>".$name."</option>\n";
     }
 }else{
 	return;
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/batch/usersettings_shortcodes.php 1.0.2.src/e107_files/shortcode/batch/usersettings_shortcodes.php
--- 1.0.0.src/e107_files/shortcode/batch/usersettings_shortcodes.php	2012-10-30 15:39:55.435444212 +0000
+++ 1.0.2.src/e107_files/shortcode/batch/usersettings_shortcodes.php	2012-10-30 15:40:38.325482812 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_files/shortcode/batch/usersettings_shortcodes.php $
-|     $Revision: 11678 $
-|     $Id: usersettings_shortcodes.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12891 $
+|     $Id: usersettings_shortcodes.php 12891 2012-07-20 20:46:04Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -133,7 +133,11 @@
 SC_END
 
 SC_BEGIN SIGNATURE
-global $curVal;
+global $curVal,$pref;
+if(!check_class($pref['signature_access']))
+{
+	return;
+}
 parse_str($parm);
 $cols = (isset($cols) ? $cols : 58);
 $rows = (isset($rows) ? $rows : 4);
@@ -141,6 +145,11 @@
 SC_END
 
 SC_BEGIN SIGNATURE_HELP
+global $pref;
+if(!check_class($pref['signature_access']))
+{
+	return;
+}
 return display_help("", 2);
 SC_END
 
diff -x .svn -aruN 1.0.0.src/e107_files/shortcode/menu.sc 1.0.2.src/e107_files/shortcode/menu.sc
--- 1.0.0.src/e107_files/shortcode/menu.sc	2012-10-30 15:39:55.433443670 +0000
+++ 1.0.2.src/e107_files/shortcode/menu.sc	2012-10-30 15:40:38.327444105 +0000
@@ -1,4 +1,4 @@
-/* $Id: menu.sc 11346 2010-02-17 18:56:14Z secretr $ */
+/* $Id: menu.sc 12496 2011-12-31 19:07:40Z e107steved $ */
 global $sql;
 global $ns;
 global $eMenuList;
@@ -77,8 +77,9 @@
 			global $tp;
 			$sql -> db_Select("page", "*", "page_id='".$row['menu_path']."' ");
 			$page  = $sql -> db_Fetch();
-			$caption = $tp -> toHTML($page['page_title'], TRUE, 'parse_sc, constants');
-			$text = $tp -> toHTML($page['page_text'], TRUE, 'parse_sc, constants');
+			$caption = $tp -> toHTML($page['page_title'], TRUE, 'title');
+			//$text = $tp -> toHTML($page['page_text'], TRUE, 'parse_sc, constants');
+			$text = $tp -> toHTML($page['page_text'], TRUE, 'body');
 			$ns -> tablerender($caption, $text, "custom_menu");
 		}
 		else
diff -x .svn -aruN 1.0.0.src/e107_handlers/comment_class.php 1.0.2.src/e107_handlers/comment_class.php
--- 1.0.0.src/e107_handlers/comment_class.php	2012-10-30 15:39:55.570443248 +0000
+++ 1.0.2.src/e107_handlers/comment_class.php	2012-10-30 15:40:38.335444662 +0000
@@ -12,9 +12,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/comment_class.php $
-|     $Revision: 12377 $
-|     $Id: comment_class.php 12377 2011-10-21 21:32:24Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12974 $
+|     $Id: comment_class.php 12974 2012-08-23 14:02:02Z secretr $
+|     $Author: secretr $
 +----------------------------------------------------------------------------+
 */
 
@@ -43,6 +43,28 @@
 	 * @param unknown_type $rating
 	 * @return unknown
 	 */
+	 
+	var $known_types = array(
+			0	=> "news",
+			1	=> 'content',
+			2	=> 'download',
+			3	=> 'faq',
+			4	=> 'poll',
+			5	=> 'docs',
+			6	=> 'bugtrack'
+	);
+	 	 
+	var $moderator = false;
+	
+	function comment() // __construct
+	{
+		if ((ADMIN && getperms("B")) || getperms('0')) // moderator perms. 
+		{
+			$this->moderator = true;	
+		}	
+		
+	}
+	 
 	function form_comment($action, $table, $id, $subject, $content_type, $return = FALSE, $rating = FALSE, $tablerender = TRUE)
 	{
 		//rating	: boolean, to show rating system in comment
@@ -298,6 +320,12 @@
 			{
 			  while ($row1 = $sql_nc->db_Fetch()) 
 			  {
+			  	if($this->isPending($row1))
+				{
+					$sub_total = $sub_total - 1;
+					continue;	
+				}	
+				
 				if ($pref['nested_comments']) 
 				{
 				  $width = min($width + 3, 80);
@@ -326,7 +354,7 @@
 	function enter_comment($author_name, $comment, $table, $id, $pid, $subject, $rateindex = FALSE)
 	{
 		//rateindex	: the posted value from the rateselect box (without the urljump) (see function rateselect())
-		global $sql, $sql2, $tp, $e107cache, $e_event, $e107, $rater;
+		global $sql, $sql2, $tp, $e107cache, $e_event, $e107, $rater, $pref;
 
 
 		if ($this->getCommentPermissions() != 'rw') return;
@@ -407,8 +435,10 @@
 						$e107cache->clear("comment");
 						return;
 					}
-
-					if (!$sql->db_Insert("comments", "0, '".intval($pid)."', '".intval($id)."', '$subject', '$nick', '', '".$_t."', '$comment', '0', '$ip', '".$tp -> toDB($type, true)."', '0' "))
+					
+					$moderate = ($this->moderateComment($pref['comments_moderate'])) ? 2 : '0';
+					
+					if (!$sql->db_Insert("comments", "0, '".intval($pid)."', '".intval($id)."', '$subject', '$nick', '', '".$_t."', '$comment', $moderate, '$ip', '".$tp -> toDB($type, true)."', '0' "))
 					{
 						echo "<b>".COMLAN_323."</b> ".COMLAN_11;
 					}
@@ -419,7 +449,16 @@
 							$sql -> db_Update("user", "user_comments=user_comments+1, user_lastpost='".time()."' WHERE user_id='".USERID."' ");
 						}
 						$edata_li = array("comment_type" => $type, "comment_subject" => $subject, "comment_item_id" => $id, "comment_nick" => $nick, "comment_time" => $_t, "comment_comment" => $comment);
-						$e_event->trigger("postcomment", $edata_li);
+						
+						if($moderate == 2)
+						{
+							$e_event->trigger("commentpending", $edata_li);	
+						}
+						else
+						{
+							$e_event->trigger("postcomment", $edata_li);		
+						}
+											
 						$e107cache->clear("comment");
 						if(!$type || $type == "news")
 						{
@@ -444,6 +483,33 @@
 		}
 	}
 
+	/** Check if comment should be moderated
+	 * 
+	 * @param $var = pref value of userclass. 
+	 * @return boolean true if it should be moderated. 
+	 */	
+	function moderateComment($var)
+	{	
+		if ($var == e_UC_MEMBER) // different behavior to check_class();
+		{
+			return (USER == TRUE && ADMIN == FALSE) ? TRUE : FALSE;
+		}
+		
+		return check_class($var);
+	}	
+	
+	function isPending($row)
+	{
+		list($comment_author_id,$comment_author_name) = explode(".", $row['comment_author'],2);	
+		
+		if($row['comment_blocked'] > 0 && ($comment_author_id != USERID ) && $this->moderator == false)
+		{
+			return true;
+		}
+		
+		return false;		
+	}
+	
 	/**
 	 * Enter description here...
 	 *
@@ -473,6 +539,27 @@
 		}
 		return $type;
 	}
+	
+	
+	/**
+	 * Convert type number to (core) table string
+	 * @param integer|string $type
+	 * @return string
+	 */
+	public function getTable($type)
+	{
+		if (!is_numeric($type))
+		{
+			return $type;
+		}
+		else
+		{
+			if(varset($this->known_types[$type]))
+			{
+				return $this->known_types[$type];
+			}
+		}
+	}
 
 	/**
 	 * Enter description here...
@@ -567,19 +654,27 @@
 			$width = 0;
 			while ($row = $sql->db_Fetch())
 			{
+				if($this->isPending($row))
+				{
+					$comment_total = $comment_total - 1;
+					continue;	
+				}	
 				$lock = $row['comment_lock'];
 				// $subject = $tp->toHTML($subject);
-				if ($pref['nested_comments'])
+				if($action != "reply") 
 				{
-					$text .= $this->render_comment($row, $table , $action, $id, $width, $tp->toHTML($subject), $rate);
-				}
-				else
-				{
-					$text .= $this->render_comment($row, $table , $action, $id, $width, $tp->toHTML($subject), $rate);
+					if ($pref['nested_comments'])
+					{
+						$text .= $this->render_comment($row, $table , $action, $id, $width, $tp->toHTML($subject), $rate);
+					}
+					else
+					{
+						$text .= $this->render_comment($row, $table , $action, $id, $width, $tp->toHTML($subject), $rate);
+					}
 				}
 			}
 
-			if ($tablerender)
+			if ($tablerender && !empty($text))
 			{
 				$text = $ns->tablerender(COMLAN_99, $text, '', TRUE);
 			}
@@ -593,13 +688,13 @@
 				$ret['comment'] = $text;
 			}
 
-			if (ADMIN && getperms("B"))
+			if (ADMIN && getperms("B") && !empty($text))
 			{
 				$modcomment = "<div style='text-align:right'><a href='".e_ADMIN_ABS."modcomment.php?$table.$id'>".COMLAN_314."</a></div><br />";
 			}
 		}
-
-		if (($lock != '1') && ($this->getCommentPermissions() === 'rw'))
+		
+		if ($lock != '1')
 		{
 			$comment = $this->form_comment($action, $table, $id, $subject, "", TRUE, $rate, $tablerender);
 		}
@@ -882,12 +977,15 @@
 							$qryp = str_replace("{NID}", $row['comment_item_id'], $var['qry']);
 							if($sql2 -> db_Select_gen($qryp))
 							{
+								// SecretR - comment_itemurl, comment_category options added, see list_new/sections/list_comment.php 
 								$row2 = $sql2 -> db_Fetch();
 								$ret['comment_type']				= $var['plugin_name'];
 								$ret['comment_title']				= $tp -> toHTML($row2[$var['db_title']], TRUE,'emotes_off, no_make_clickable');
-								$ret['comment_url']					= str_replace("{NID}", $row['comment_item_id'], $var['reply_location']);
+								$ret['comment_itemurl']				= varset($var['comment_location']) ? str_replace(array('{NID}', '{TTL}'), array($row['comment_item_id'], rawurlencode($row2[$var['db_title']])), $var['comment_location']) : str_replace(array('{NID}', '{TTL}'), array($row['comment_item_id'], rawurlencode($row2[$var['db_title']])), $var['reply_location']);
+								$ret['comment_url']					= str_replace(array('{NID}', '{TTL}'), array($row['comment_item_id'], rawurlencode($row2[$var['db_title']])), $var['reply_location']);
 								$ret['comment_category_heading']	= $var['plugin_name'];
-								$ret['comment_category_url']		= e_PLUGIN_ABS.$var['plugin_name'].'/'.$var['plugin_name'].'.php';
+								$ret['comment_category_url']		= varset($var['comment_category']) ? $var['comment_category'] : e_PLUGIN_ABS.$var['plugin_name'].'/'.$var['plugin_name'].'.php';
+
 							}
 						}
 					//old method
diff -x .svn -aruN 1.0.0.src/e107_handlers/db_debug_class.php 1.0.2.src/e107_handlers/db_debug_class.php
--- 1.0.0.src/e107_handlers/db_debug_class.php	2012-10-30 15:39:55.577443448 +0000
+++ 1.0.2.src/e107_handlers/db_debug_class.php	2012-10-30 15:40:38.336444528 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/db_debug_class.php $
-|     $Revision: 12463 $
-|     $Id: db_debug_class.php 12463 2011-12-17 04:14:49Z e107coders $
+|     $Revision: 12892 $
+|     $Id: db_debug_class.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -203,7 +203,7 @@
 		}
 
 		if ($badCount) {
-			$text .= "\n<table class='fborder'>\n";
+			$text .= "\n<table class='fborder debug-footer'>\n";
 			$text .= "<tr><td class='fcaption' colspan='2'><b>$badCount Query Errors!</b></td></tr>\n";
 			$text .= "<tr><td class='fcaption'><b>Index</b></td><td class='fcaption'><b>Query / Error</b></td></tr>\n";
 
@@ -220,7 +220,7 @@
 		// Optionally list good queries
 		//
 		if ($okCount && E107_DBG_SQLDETAILS) {
-			$text .= "\n<table class='fborder'>\n";
+			$text .= "\n<table class='fborder debug-footer'>\n";
 			$text .= "<tr><td class='fcaption' colspan='3'><b>{$okCount[TRUE]} Good Queries</b></td></tr>\n";
 			$text .= "<tr><td class='fcaption'><b>Index</b></td><td class='fcaption'><b>Qtime</b></td><td class='fcaption'><b>Query</b></td></tr>\n
 				 <tr><td class='fcaption'>&nbsp;</td><td class='fcaption'><b>(msec)</b></td><td class='fcaption'>&nbsp;</td></tr>\n
@@ -241,7 +241,7 @@
 		//
 		if (E107_DBG_SQLDETAILS) {
 			foreach ($this->aSQLdetails as $idx => $cQuery) {
-				$text .= "\n<table class='fborder' style='width: 100%;'>\n";
+				$text .= "\n<table class='fborder debug-footer' style='width: 100%;'>\n";
 				$text .= "<tr><td class='forumheader3' colspan='".$cQuery['nFields']."'><b>".$idx.") Query:</b> [".$cQuery['marker']." - ".$cQuery['caller']."]<br />".$cQuery['query']."</td></tr>\n";
 				if (isset($cQuery['explain'])) {
 					$text .= $cQuery['explain'];
@@ -348,7 +348,7 @@
 		// Stats by Table
 		//
 
-		$text .= "\n<table class='fborder'>\n";
+		$text .= "\n<table class='fborder debug-footer'>\n";
 
 		$bRowHeaders=FALSE;
 		$aSum=$this->aDBbyTable['core']; // create a template from the 'real' array
@@ -426,7 +426,7 @@
 		{
 			return FALSE;
 		}
-		$text = "<table class='fborder' style='width: 100%'>
+		$text = "<table class='fborder debug-footer' style='width: 100%'>
 			<tr><td class='fcaption' colspan='4'><b>Shortcode / BBCode</b></td></tr>
 			<tr>
 			<td class='fcaption' style='width: 10%;'>Type</td>
@@ -454,27 +454,61 @@
 		{
 			return FALSE;
 		}
-		global $e107;
-		$text = "<table class='fborder' style='width: 100%'>
-			<tr><td class='fcaption' colspan='4'><b>Paths</b></td></tr>
+		global $e107,$sql;
+		$text = "<table class='fborder debug-footer' style='width: 100%'>
+			<tr><td class='fcaption debug-footer-caption' colspan='4'><b>Paths &amp; Variables</b></td></tr>
 			<tr>
 			<td class='forumheader3'>\n";
-
+			
+		$text .= "e_DOMAIN: '".e_DOMAIN."'<br />";
+		$text .= "e_SUBDOMAIN: '".e_SUBDOMAIN."'<br />";
 		$text .= "e_HTTP: '".e_HTTP."'<br />";
 		$text .= "e_BASE: '".e_BASE."'<br />";
 		$text .= "e_PLUGIN: '".e_PLUGIN."'<br />";
 		$text .= "e_THEME: '".e_THEME."'<br />";
 		$text .= "e_MENU: '".e_MENU."'<br />";
 		$text .= "THEME: '".THEME."'<br />";
+		$text .= "THEME_LAYOUT: '".THEME_LAYOUT."'<br />";
+			
+		$text .= "<br />";
+		$text .= "e_LANGUAGE: '".e_LANGUAGE."'<br />";
+		$text .= "e_LAN: '".e_LAN."'<br />";
+		$text .= "e_LOCALE: '".e_LOCALE."'<br />";
+		
+		$text .= "<br />";
+		$text .= "META_OG: '".META_OG."'<br />";
+		$text .= "META_DESCRIPTION: '".META_DESCRIPTION."'<br />";
+		$text .= "<br />";
+		
+		$text .= "USERID: '".USERID."'<br />";
+		$text .= "USERNAME: '".USERNAME."'<br />";
+		$text .= "USERURL: '".USERURL."'<br />";
+		$text .= "USEREMAIL: '".USEREMAIL."'<br />";
+		$text .= "USERCLASS: '".USERCLASS."'<br />";
+		$text .= "USERREALM: '".USERREALM."'<br />";
+		$text .= "USERVIEWED: '".USERVIEWED."'<br />";
+		$text .= "USERVISITS: '".USERVISITS."'<br />";		
+		$text .= "USERIMAGE: '".USERIMAGE."'<br />";	
+		$text .= "USERSESS: '".USERSESS."'<br />";		
+		$text .= "USERJOINED: '".USERJOINED."'<br />";									
+	
+		$text .= "<br />";
+		
+		
+		$text .= "SQL Language: '".$sql->mySQLlanguage."'<br />";
+		$text .= "<br />";					
 		$text .= "\$_SERVER['PHP_SELF']: '".$_SERVER['PHP_SELF']."'<br />";
 		$text .= "\$_SERVER['DOCUMENT_ROOT']: '".$_SERVER['DOCUMENT_ROOT']."'<br />";
 		$text .= "\$_SERVER['HTTP_HOST']: '".$_SERVER['HTTP_HOST']."'<br />";
 		$text .= "\$_SERVER['REQUEST_URI']: '".$_SERVER['REQUEST_URI']."'<br />";
-
-
-  	  	$text .= "<pre>";
-        $text .= htmlspecialchars(print_r($e107,TRUE));
-	  	$text .= "</pre>";
+		$text .= "</td></tr>
+		<tr><td class='forumheader3'>\n";
+			
+  	  	$text .= "<pre>".htmlspecialchars(print_r($e107,TRUE))."</pre>";
+  	  	$text .= "</td></tr>\n";
+		$text .= "<tr><td class='fcaption' colspan='4'><b>Session</b></td></tr>
+					<tr><td class='forumheader3'>\n";
+  	  	$text .= "<pre>".htmlspecialchars(print_r($_SESSION,TRUE))."</pre>";
 
 		$text .= "</td></tr></table>";
 		return $text;
@@ -485,7 +519,7 @@
 		if (!E107_DBG_DEPRECATED){
 			return FALSE;
 		} else {
-			$text = "<table class='fborder' style='width: 100%'>
+			$text = "<table class='fborder debug-footer' style='width: 100%'>
 			<tr><td class='fcaption' colspan='4'><b>The following deprecated functions were used:</b></td></tr>
 			<tr>
 			<td class='fcaption' style='width: 10%;'>Function</td>
@@ -543,7 +577,7 @@
 		// Dump the debug log
 		//
 
-		$text .= "\n<table class='fborder'>\n";
+		$text .= "\n<table class='fborder debug-footer'>\n";
 
 		$bRowHeaders=FALSE;
 		
@@ -567,7 +601,7 @@
 		if (!E107_DBG_INCLUDES) return FALSE;
 
 		$aIncList = get_included_files();
-		$text = "<table class='fborder'>\n";
+		$text = "<table class='fborder debug-footer'>\n";
 		$text .= "<tr><td class='forumheader3'>".
 							implode("&nbsp;</td></tr>\n<tr><td class='forumheader3'>", $aIncList).
 							"&nbsp;</td></tr>\n";
diff -x .svn -aruN 1.0.0.src/e107_handlers/debug_handler.php 1.0.2.src/e107_handlers/debug_handler.php
--- 1.0.0.src/e107_handlers/debug_handler.php	2012-10-30 15:39:55.570443248 +0000
+++ 1.0.2.src/e107_handlers/debug_handler.php	2012-10-30 15:40:38.336444528 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/debug_handler.php $
-|     $Revision: 12463 $
-|     $Id: debug_handler.php 12463 2011-12-17 04:14:49Z e107coders $
+|     $Revision: 12549 $
+|     $Id: debug_handler.php 12549 2012-01-13 06:55:24Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -149,11 +149,11 @@
 			{
 				if ($debug_param[3] == '+' || $debug_param[3] == 'stick')
 				{
-					cookie('e107_debug_level', 'level='.$dVal, time() + 86400);
+					cookie('e107_debug_level', 'level='.$dVal, time() + 86400,e_HTTP,e_DOMAIN);
 				}
 				if ($debug_param[3] == '-' || $debug_param[3] == 'unstick')
 				{
-					cookie('e107_debug_level', '', time() - 3600);
+					cookie('e107_debug_level', '', time() - 3600,e_HTTP,e_DOMAIN);
 				}
 			}
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/e_parse_class.php 1.0.2.src/e107_handlers/e_parse_class.php
--- 1.0.0.src/e107_handlers/e_parse_class.php	2012-10-30 15:39:55.571444487 +0000
+++ 1.0.2.src/e107_handlers/e_parse_class.php	2012-10-30 15:40:38.337479178 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/e_parse_class.php $
-|     $Revision: 12467 $
-|     $Id: e_parse_class.php 12467 2011-12-22 14:03:34Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12910 $
+|     $Id: e_parse_class.php 12910 2012-07-24 09:34:58Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 if (!defined('e107_INIT')) { exit; }
@@ -217,15 +217,14 @@
 		{
 			$checkTags = explode(',', $tagList);
 		}
-		$data = preg_replace('#\[code.*?\[\/code\]#i', '', $data);		// Ignore code blocks
+		$data = strtolower(preg_replace('#\[code.*?\[\/code\]#i', '', $data));		// Ignore code blocks. All lower case simplifies subsequent processing
 		foreach ($checkTags as $tag)
 		{
-			if (($pos = stripos($data, '</'.$tag)) !== FALSE)
+			$aCount = substr_count($data,  '<'.$tag);			// Count opening tags
+			$bCount = substr_count($data,  '</'.$tag);			// Count closing tags
+			if ($aCount != $bCount)
 			{
-				if ((($bPos = stripos($data, '<'.$tag )) === FALSE) || ($bPos > $pos))
-				{
-					return TRUE;		// Potentially abusive HTML found
-				}
+				return TRUE;		// Potentially abusive HTML found - tags don't balance
 			}
 		}
 		return FALSE;		// Nothing detected
@@ -235,7 +234,7 @@
 	/*
 	 * Filter User Input
 	*/
-	function dataFilter($data,$mode='bbcode')
+	function dataFilter($data, $mode='bbcode')
 	{
 		$ans = '';
 		$vetWords = array('<applet', '<body', '<embed', '<frame', '<script','%3Cscript',
@@ -1171,7 +1170,10 @@
 		return trim($text);
 	}
 
-
+	/**
+	 * Parse string into a format which is compatible with an html tag attribute. eg. name='$string' 
+	 * @param string $text 
+	 */
 	function toAttribute($text) {
 		$text = str_replace("&amp;","&",$text); // URLs posted without HTML access may have an &amp; in them.
 		$text = htmlspecialchars($text, ENT_QUOTES, CHARSET); // Xhtml compliance.
@@ -1184,6 +1186,9 @@
 		}
 	}
 
+	/**
+	 * Parse string into a JS compatible format. 
+	 */
 	function toJS($stringarray) {
 		$search = array("\r\n","\r","<br />","'");
 		$replace = array("\\n","","\\n","\'");
@@ -1196,6 +1201,11 @@
 		return strtr ($stringarray, $trans_tbl);
 	}
 
+	/**
+	 * Parse string to an RSS-compatible format
+	 * @param $text string 
+	 * @param $tags boolean - Set to TRUE to allow tags and bbcode in the result. 
+	 */
 	function toRss($text,$tags=FALSE)
 	{
 
@@ -1261,23 +1271,31 @@
 									SITEURL.$THEMES_DIRECTORY,
 									SITEURL.$DOWNLOADS_DIRECTORY);
 			$search = array("{e_BASE}","{e_IMAGE_ABS}","{e_THEME_ABS}","{e_IMAGE}","{e_PLUGIN}","{e_FILE}","{e_THEME}","{e_DOWNLOAD}");
-			if (ADMIN) {
+			if (defined('THEME'))
+			{
+				$search[] = '{THEME}';
+				$replace_relative[] = THEME;
+				$replace_absolute[] = SITEURL.THEME;
+			}
+			if (ADMIN) 
+			{
 				$replace_relative[] = $ADMIN_DIRECTORY;
 				$replace_absolute[] = SITEURL.$ADMIN_DIRECTORY;
 				$search[] = "{e_ADMIN}";
 			}
-			if ($all) {
-			  if (USER)
-			  {  // Can only replace with valid number for logged in users
-				$replace_relative[] = USERID;
-				$replace_absolute[] = USERID;
-			  }
-			  else
-			  {
-				$replace_relative[] = '';
-				$replace_absolute[] = '';
-			  }
-			  $search[] = "{USERID}";
+			if ($all) 
+			{
+				if (USER)
+				{  // Can only replace with valid number for logged in users
+					$replace_relative[] = USERID;
+					$replace_absolute[] = USERID;
+				}
+				else
+				{
+					$replace_relative[] = '';
+					$replace_absolute[] = '';
+				}
+				$search[] = "{USERID}";
 			}
 			$replace = ((string)$nonrelative == "full" ) ? $replace_absolute : $replace_relative;
 			return str_replace($search,$replace,$text);
diff -x .svn -aruN 1.0.0.src/e107_handlers/notify_class.php 1.0.2.src/e107_handlers/notify_class.php
--- 1.0.0.src/e107_handlers/notify_class.php	2012-10-30 15:39:55.577443448 +0000
+++ 1.0.2.src/e107_handlers/notify_class.php	2012-10-30 15:40:38.340444090 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/notify_class.php $
-|     $Revision: 12061 $
-|     $Id: notify_class.php 12061 2011-01-30 21:42:15Z e107coders $
+|     $Revision: 12892 $
+|     $Id: notify_class.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -207,11 +207,26 @@
 	{
 		return;
 	}
+	// Never use $tp->toDB() here. 
+	$message = '<b>'.$data['news_title'].'</b>';
+	$message .= (trim($data['news_summary'])!='') ? '<br /><br />'.trim($data['news_summary']) : "";
+	$message .= '<br /><br />'.trim($data['data']).'<br /><br />'.$data['news_extended'];
 	
-	$message = $tp->toDB('<b>'.$data['news_title'].'</b><br /><br />'.$data['news_summary'].'<br /><br />'.$data['data'].'<br /><br />'.$data['news_extended']);
 	$nt -> send('newspost', $data['news_title'], $message);
 }
 
+
+function notify_commentpending($data)
+{
+	global $nt, $tp;
+	foreach($data as $key=>$val)
+	{
+		$message .= "<br /><b>".$key.":</b> ".$val;
+	}	
+	$nt -> send('commentpending', NT_LAN_CM_1.': '.$data['comment_subject'], $message);
+}
+
+
 function notify_newsupd($data) {
 	global $nt, $tp;
 
@@ -219,8 +234,11 @@
 	{
 		return;
 	}
-
-	$message = $tp->toDB('<b>'.$data['news_title'].'</b><br /><br />'.$data['news_summary'].'<br /><br />'.$data['data'].'<br /><br />'.$data['news_extended']);
+	// Never use $tp->toDB() here. 
+	$message = '<b>'.$data['news_title'].'</b>';
+	$message .= (trim($data['news_summary'])!='') ? '<br /><br />'.trim($data['news_summary']) : "";
+	$message .= '<br /><br />'.trim($data['data']).'<br /><br />'.$data['news_extended'];
+	
 	$nt -> send('newsupd', NT_LAN_NU_1.': '.$data['news_title'], $message);
 }
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/ren_help.php 1.0.2.src/e107_handlers/ren_help.php
--- 1.0.0.src/e107_handlers/ren_help.php	2012-10-30 15:39:55.573442110 +0000
+++ 1.0.2.src/e107_handlers/ren_help.php	2012-10-30 15:40:38.348444322 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/ren_help.php $
-|     $Revision: 12055 $
-|     $Id: ren_help.php 12055 2011-01-22 02:14:27Z e107coders $
+|     $Revision: 12622 $
+|     $Id: ren_help.php 12622 2012-04-02 01:48:52Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -195,7 +195,7 @@
 		$fl = new e_file;
 	}
 
-	$imagelist = $fl->get_files($path,"",'standard',2);
+	$imagelist = $fl->get_files($path,"",'standard',4);
     sort($imagelist);
 
 	$text ="<!-- Start of PreImage selector -->
diff -x .svn -aruN 1.0.0.src/e107_handlers/sitelinks_class.php 1.0.2.src/e107_handlers/sitelinks_class.php
--- 1.0.0.src/e107_handlers/sitelinks_class.php	2012-10-30 15:39:55.575444610 +0000
+++ 1.0.2.src/e107_handlers/sitelinks_class.php	2012-10-30 15:43:29.205453993 +0000
@@ -12,9 +12,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/sitelinks_class.php $
-|     $Revision: 12129 $
-|     $Id: sitelinks_class.php 12129 2011-04-12 00:34:14Z e107coders $
-|     $Author: e107coders $
+|     $Revision: 12761 $
+|     $Id: sitelinks_class.php 12761 2012-05-28 13:42:49Z berckoff $
+|     $Author: berckoff $
 +---------------------------------------------------------------+
 */
 if (!defined('e107_INIT')) { exit; }
@@ -27,30 +27,30 @@
 
 class sitelinks
 {
-    var $eLinkList;
-	var $eSubLinkLevel=0;
+    var $eLinkList     = array();
+	var $eSubLinkLevel = 0;
 	
-    function getlinks($cat=1)
-    {
-        global $sql;
-        if ($sql->db_Select('links', '*', "link_category = ".intval($cat)." and link_class IN (".USERCLASS_LIST.") ORDER BY link_order ASC"))
+	function getlinks($cat=1)
+	{
+		$sql = new db();
+		if ($sql->db_Select('links', '*', 'link_category = '.intval($cat).' and link_class IN ('.USERCLASS_LIST.') ORDER BY link_order ASC'))
 		{
-            while ($row = $sql->db_Fetch())
-            {
+			while ($row = $sql->db_Fetch())
+			{
 				//  if (substr($row['link_name'], 0, 8) == 'submenu.'){
 				//      $tmp=explode('.', $row['link_name'], 3);
 				//     $this->eLinkList[$tmp[1]][]=$row;
 				if (isset($row['link_parent']) && $row['link_parent'] != 0)
 				{
-					$this->eLinkList['sub_'.$row['link_parent']][]=$row;
-                }
+					$this->eLinkList['sub_'.$row['link_parent']][] = $row;
+				}
 				else
 				{
-                    $this->eLinkList['head_menu'][] = $row;
-                }
-            }
-        }
-    }
+					$this->eLinkList['head_menu'][] = $row;
+				}
+			}
+		}
+	}
 
     function get($cat=1, $style='', $css_class = false)
     {
@@ -67,6 +67,8 @@
         }
         $this->getlinks($cat);
 		
+        if (empty($this->eLinkList))  { return ''; }
+        
         // are these defines used at all ?
 
         if(!defined('PRELINKTITLE'))
@@ -97,7 +99,7 @@
 		
 		if(!varset($style['linkseparator']))
 		{
-			$style['linkseparator'] = "";
+			$style['linkseparator'] = '';
 		}
 
 		// Sublink styles.- replacing the tree-menu.
@@ -114,9 +116,8 @@
 			$aSubStyle = $style;
         }
 
-
-        $text = "\n\n\n<!-- Sitelinks ($cat) -->\n\n\n".$style['prelink'];
-
+        $text = "\n<!-- BoF Sitelinks ({$cat}) -->\n{$style['prelink']}\n";
+		
         if ($style['linkdisplay'] != 3) 
 		{
             foreach ($this->eLinkList['head_menu'] as $key => $link)
@@ -162,7 +163,9 @@
                 $text .= $ns->tablerender($k, $mnu, 'sitelinks_sub', TRUE);
             }
         }
-        $text .= "\n\n\n<!-- end Site Links -->\n\n\n";
+        
+       	$text = $text ? "{$text}\n<!-- EoF Sitelinks ({$cat}) -->\n" : "\n<!-- Sitelinks ({$cat}) Empty -->";
+        
         if($usecache)
         {
             $e107cache->set('sitelinks_'.$cat.md5($linkstyle.e_PAGE.e_QUERY), $text);
@@ -481,4 +484,4 @@
         return FALSE;
     }
 }
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/langs/en.js 1.0.2.src/e107_handlers/tiny_mce/langs/en.js
--- 1.0.0.src/e107_handlers/tiny_mce/langs/en.js	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/langs/en.js	2012-10-30 15:40:38.353481682 +0000
@@ -1,222 +1 @@
-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:"{#field} is invalid",
-invalid_data_number:"{#field} must be a number",
-invalid_data_min:"{#field} must be a number greater than {#min}",
-invalid_data_size:"{#field} must be a number or percentage",
-more_colors:"More colors"
-},
-colors:{
-'000000':'Black',
-'993300':'Burnt orange',
-'333300':'Dark olive',
-'003300':'Dark green',
-'003366':'Dark azure',
-'000080':'Navy Blue',
-'333399':'Indigo',
-'333333':'Very dark gray',
-'800000':'Maroon',
-'FF6600':'Orange',
-'808000':'Olive',
-'008000':'Green',
-'008080':'Teal',
-'0000FF':'Blue',
-'666699':'Grayish blue',
-'808080':'Gray',
-'FF0000':'Red',
-'FF9900':'Amber',
-'99CC00':'Yellow green',
-'339966':'Sea green',
-'33CCCC':'Turquoise',
-'3366FF':'Royal blue',
-'800080':'Purple',
-'999999':'Medium gray',
-'FF00FF':'Magenta',
-'FFCC00':'Gold',
-'FFFF00':'Yellow',
-'00FF00':'Lime',
-'00FFFF':'Aqua',
-'00CCFF':'Sky blue',
-'993366':'Brown',
-'C0C0C0':'Silver',
-'FF99CC':'Pink',
-'FFCC99':'Peach',
-'FFFF99':'Light yellow',
-'CCFFCC':'Pale green',
-'CCFFFF':'Pale cyan',
-'99CCFF':'Light sky blue',
-'CC99FF':'Plum',
-'FFFFFF':'White'
-},
-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",
-plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",
-plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."
-},
-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.",
-restore_content:"Restore auto-saved content.",
-warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."
-},
-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."
-},
-advlist:{
-types:"Types",
-def:"Default",
-lower_alpha:"Lower alpha",
-lower_greek:"Lower greek",
-lower_roman:"Lower roman",
-upper_alpha:"Upper alpha",
-upper_roman:"Upper roman",
-circle:"Circle",
-disc:"Disc",
-square:"Square"
-},
-aria:{
-rich_text_area:"Rich Text Area"
-},
-wordcount:{
-words: 'Words: '
-}
-}});
\ No newline at end of file
+tinyMCE.addI18n({en:{common:{"more_colors":"More Colors...","invalid_data":"Error: Invalid values entered, these are marked in red.","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.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","not_set":"-- Not Set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert Time","insertdate_desc":"Insert Date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction Right to Left","ltr_desc":"Direction Left to Right"},layer:{content:"New layer...","absolute_desc":"Toggle Absolute Positioning","backward_desc":"Move Backward","forward_desc":"Move Forward","insertlayer_desc":"Insert New Layer"},save:{"save_desc":"Save","cancel_desc":"Cancel All Changes"},nonbreaking:{"nonbreaking_desc":"Insert Non-Breaking Space Character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Check Spelling"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Insert Horizontal Line"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/Edit Image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/Edit Link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode_stick":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete Table","copy_row_desc":"Copy Table Row","cut_row_desc":"Cut Table Row","paste_row_after_desc":"Paste Table Row After","paste_row_before_desc":"Paste Table Row Before","props_desc":"Table Properties","cell_desc":"Table Cell Properties","row_desc":"Table Row Properties","merge_cells_desc":"Merge Table Cells","split_cells_desc":"Split Merged Table Cells","delete_col_desc":"Delete Column","col_after_desc":"Insert Column After","col_before_desc":"Insert Column Before","delete_row_desc":"Delete Row","row_after_desc":"Insert Row After","row_before_desc":"Insert Row Before",desc:"Insert/Edit Table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle Full Screen Mode"},media:{"delta_height":"","delta_width":"",edit:"Edit Embedded Media",desc:"Insert/Edit Embedded Media"},fullpage:{desc:"Document Properties","delta_width":"","delta_height":""},template:{desc:"Insert Predefined Template Content"},visualchars:{desc:"Show/Hide Visual Control Characters"},spellchecker:{desc:"Toggle Spell Checker",menu:"Spell Checker 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.","learn_word":"Learn word"},pagebreak:{desc:"Insert Page Break for Printing"},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words:"}}});
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js 1.0.2.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js	2012-10-30 15:39:55.579444555 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js	2012-10-30 15:40:38.354444752 +0000
@@ -1 +1 @@
-(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,i,f,d;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if(k.ctrlKey&&!d){return}if(i){j.selection.setRng(i)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageX);a.add(j.getDoc(),"click",function(l){g(j,l)});a.cancel(k)});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=null;if(k&&k.button==2){i=j.selection.getRng();return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},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(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
+(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,f,d,i;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if((i!==0?i:k.ctrlKey)&&!d){return}a.cancel(k);if(k.target.nodeName=="IMG"){j.selection.select(k.target)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageY);a.add(j.getDoc(),"click",function(l){g(j,l)});j.nodeChanged()});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=0;if(k&&k.button==2){i=k.ctrlKey;return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},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(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js 1.0.2.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js	2012-10-30 15:39:55.580444372 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js	2012-10-30 15:40:38.355444692 +0000
@@ -27,7 +27,7 @@
 		 * @param {string} url Absolute URL to where the plugin is located.
 		 */
 		init : function(ed) {
-			var t = this, lastRng, showMenu, contextmenuNeverUseNative;
+			var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey;
 
 			t.editor = ed;
 
@@ -43,17 +43,22 @@
 			t.onContextMenu = new tinymce.util.Dispatcher(this);
 
 			showMenu = ed.onContextMenu.add(function(ed, e) {
-				if (e.ctrlKey && !contextmenuNeverUseNative) return;
+				// Block TinyMCE menu on ctrlKey and work around Safari issue
+				if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative)
+					return;
+
+				Event.cancel(e);
 
-				// Restore the last selection since it was removed
-				if (lastRng)
-					ed.selection.setRng(lastRng);
+				// Select the image if it's clicked. WebKit would other wise expand the selection
+				if (e.target.nodeName == 'IMG')
+					ed.selection.select(e.target);
 
-				t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageX);
+				t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY);
 				Event.add(ed.getDoc(), 'click', function(e) {
 					hide(ed, e);
 				});
-				Event.cancel(e);
+
+				ed.nodeChanged();
 			});
 
 			ed.onRemove.add(function() {
@@ -62,12 +67,12 @@
 			});
 
 			function hide(ed, e) {
-				lastRng = null;
+				realCtrlKey = 0;
 
 				// Since the contextmenu event moves
 				// the selection we need to store it away
 				if (e && e.button == 2) {
-					lastRng = ed.selection.getRng();
+					realCtrlKey = e.ctrlKey;
 					return;
 				}
 
@@ -106,19 +111,18 @@
 		},
 
 		_getMenu : function(ed) {
-			var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2;
+			var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p;
 
 			if (m) {
 				m.removeAll();
 				m.destroy();
 			}
 
-			p1 = DOM.getPos(ed.getContentAreaContainer());
-			p2 = DOM.getPos(ed.getContainer());
+			p = DOM.getPos(ed.getContentAreaContainer());
 
 			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),
+				offset_x : p.x + ed.getParam('contextmenu_offset_x', 0),
+				offset_y : p.y + ed.getParam('contextmenu_offset_y', 0),
 				constrain : 1,
 				keyboard_focus: true
 			});
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin.js 1.0.2.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin.js	1970-01-01 00:00:00.000000000 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin.js	2012-10-30 15:40:38.355444692 +0000
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},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(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})();
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin_src.js 1.0.2.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin_src.js	1970-01-01 00:00:00.000000000 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/directionality/editor_plugin_src.js	2012-10-30 15:40:38.355444692 +0000
@@ -0,0 +1,82 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(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);
+})();
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/media/editor_plugin.js 1.0.2.src/e107_handlers/tiny_mce/plugins/media/editor_plugin.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/media/editor_plugin.js	2012-10-30 15:39:55.581452807 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/media/editor_plugin.js	2012-10-30 15:40:38.359444107 +0000
@@ -1 +1 @@
-(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m<f.length;m++){k=f[m][0];q={name:k,clsids:tinymce.explode(f[m][1]||""),mimes:tinymce.explode(f[m][2]||""),codebase:f[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;a+=(a?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mp3,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});a=new RegExp("write("+a+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(i,s){if(s.name==="img"&&n.dom.hasClass(s.node,"mceItemMedia")){s.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(s,t,i){if(i.nodeName==="IMG"&&i.className.indexOf("mceItemMedia")!==-1){t.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var s,i;i=n.selection.getNode();if(o(i)){s=g.parse(n.dom.getAttrib(i,"data-mce-json"));tinymce.each(d,function(t){var u=n.dom.getAttrib(i,t);if(u){s[t]=u}});s.type=r.getType(i.className).name.toLowerCase()}if(!s){s={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:s})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(s,i,t){i.setActive("media",o(t))})},convertUrl:function(k,n){var j=this,m=j.editor,l=m.settings,o=l.url_converter,i=l.url_converter_scope||j;if(!k){return k}if(n){return m.documentBaseURI.toAbsolute(k)}return o.call(i,k,"src","object")},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}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||"320";n.height=m.height||"240";return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,E,j,s,F,w,D,u,k,C,r,p,y,B,m,v,l,z;function q(i,G){var K,J,L,I,H;H=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(H){K=o.documentBaseURI;D.params.src=H;if(o.getParam("flash_video_player_absvideourl",true)){i=K.toAbsolute(i||"",true);G=K.toAbsolute(G||"",true)}L="";J=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(J,function(N,M){N=N.replace(/\$url/,i||"");N=N.replace(/\$poster/,G||"");if(N.length>0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ ?/g,"")}if(G&&G.length>0){v.attr(i,G)}});for(F in D.params){v.attr(F,D.params[F])}v.attr({style:z,src:D.params.src});x.replace(v);return}if(this.editor.settings.media_use_script){v=new b("script",1).attr("type","text/javascript");w=new b("#text",3);w.value="write"+p.name+"("+g.serialize(tinymce.extend(D.params,{width:x.attr("width"),height:x.attr("height")}))+");";v.append(w);x.replace(v);return}if(p.name==="Video"&&D.video.sources[0]){A=new b("video",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},D.video.attrs));if(D.video.attrs){l=D.video.attrs.poster}k=D.video.sources=c(D.video.sources);for(y=0;y<k.length;y++){if(/\.mp4$/.test(k[y].src)){m=k[y].src}}if(!k[0].type){A.attr("src",k[0].src);k.splice(0,1)}for(y=0;y<k.length;y++){u=new b("source",1).attr(k[y]);u.shortEnded=true;A.append(u)}if(m){q(m,l);p=t.getType("flash")}else{D.params.src=""}}if(D.params.src){if(/\.flv$/i.test(D.params.src)){q(D.params.src,"")}if(n&&n.force_absolute){D.params.src=o.documentBaseURI.toAbsolute(D.params.src)}E=new b("object",1).attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z});tinymce.each(d,function(i){if(D[i]&&i!="type"){E.attr(i,D[i])}});for(F in D.params){r=new b("param",1);r.shortEnded=true;w=D.params[F];if(F==="src"&&p.name==="WindowsMedia"){F="url"}r.attr({name:F,value:w});E.append(r)}if(this.editor.getParam("media_strict",true)){E.attr({data:D.params.src,type:p.mimes[0]})}else{E.attr({classid:"clsid:"+p.clsids[0],codebase:p.codebase});j=new b("embed",1);j.shortEnded=true;j.attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z,type:p.mimes[0]});for(F in D.params){j.attr(F,D.params[F])}tinymce.each(d,function(i){if(D[i]&&i!="type"){j.attr(i,D[i])}});E.append(j)}if(D.object_html){w=new b("#text",3);w.raw=true;w.value=D.object_html;E.append(w)}if(A){A.append(E)}}if(A){if(D.video_html){w=new b("#text",3);w.raw=true;w.value=D.video_html;A.append(w)}}if(A||E){x.replace(A||E)}else{x.remove()}},objectToImg:function(y){var F,j,A,p,G,H,u,w,t,B,z,q,o,D,x,k,E,n,C=this.lookup,l,v,s=this.editor.settings.url_converter,m=this.editor.settings.url_converter_scope;function r(i){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(i)}if(!y.parent){return}if(y.name==="script"){if(y.firstChild){l=a.exec(y.firstChild.value)}if(!l){return}n=l[1];E={video:{},params:g.parse(l[2])};w=E.params.width;t=E.params.height}E=E||{video:{},params:{}};G=new b("img",1);G.attr({src:this.editor.theme.url+"/img/trans.gif"});H=y.name;if(H==="video"){A=y;F=y.getAll("object")[0];j=y.getAll("embed")[0];w=A.attr("width");t=A.attr("height");u=A.attr("id");E.video={attrs:{},sources:[]};v=E.video.attrs;for(H in A.attributes.map){v[H]=A.attributes.map[H]}x=y.attr("src");if(x){E.video.sources.push({src:s.call(m,x,"src","video")})}k=A.getAll("source");for(z=0;z<k.length;z++){x=k[z].remove();E.video.sources.push({src:s.call(m,x.attr("src"),"src","source"),type:x.attr("type"),media:x.attr("media")})}if(v.poster){v.poster=s.call(m,v.poster,"poster","video")}}if(y.name==="object"){F=y;j=y.getAll("embed")[0]}if(y.name==="embed"){j=y}if(y.name==="iframe"){p=y;n="Iframe"}if(F){w=w||F.attr("width");t=t||F.attr("height");B=B||F.attr("style");u=u||F.attr("id");D=F.getAll("param");for(z=0;z<D.length;z++){o=D[z];H=o.remove().attr("name");if(!h[H]){E.params[H]=o.attr("value")}}E.params.src=E.params.src||F.attr("data")}if(j){w=w||j.attr("width");t=t||j.attr("height");B=B||j.attr("style");u=u||j.attr("id");for(H in j.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=j.attributes.map[H]}}}if(p){w=p.attr("width");t=p.attr("height");B=B||p.attr("style");u=p.attr("id");tinymce.each(d,function(i){G.attr(i,p.attr(i))});for(H in p.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=p.attributes.map[H]}}}if(E.params.movie){E.params.src=E.params.src||E.params.movie;delete E.params.movie}if(E.params.src){E.params.src=s.call(m,E.params.src,"src","object")}if(A){n=C.video.name}if(F&&!n){n=(C[(F.attr("clsid")||"").toLowerCase()]||C[(F.attr("type")||"").toLowerCase()]||{}).name}if(j&&!n){n=(C[(j.attr("type")||"").toLowerCase()]||{}).name}y.replace(G);if(j){j.remove()}if(F){q=r(F.remove());if(q){E.object_html=q}}if(A){q=r(A.remove());if(q){E.video_html=q}}G.attr({id:u,"class":"mceItemMedia mceItem"+(n||"Flash"),style:B,width:w||"320",height:t||"240","data-mce-json":g.serialize(E,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
+(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["EmbeddedAudio"],["Audio"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m<f.length;m++){k=f[m][0];q={name:k,clsids:tinymce.explode(f[m][1]||""),mimes:tinymce.explode(f[m][2]||""),codebase:f[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;a+=(a?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar;audio=mp3,ogg").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});a=new RegExp("write("+a+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(i,s){if(s.name==="img"&&n.dom.hasClass(s.node,"mceItemMedia")){s.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(s,t,i){if(i.nodeName==="IMG"&&i.className.indexOf("mceItemMedia")!==-1){t.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var s,i;i=n.selection.getNode();if(o(i)){s=n.dom.getAttrib(i,"data-mce-json");if(s){s=g.parse(s);tinymce.each(d,function(t){var u=n.dom.getAttrib(i,t);if(u){s[t]=u}});s.type=r.getType(i.className).name.toLowerCase()}}if(!s){s={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:s})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(s,i,t){i.setActive("media",o(t))})},convertUrl:function(k,n){var j=this,m=j.editor,l=m.settings,o=l.url_converter,i=l.url_converter_scope||j;if(!k){return k}if(n){return m.documentBaseURI.toAbsolute(k)}return o.call(i,k,"src","object")},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}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,hspace:m.hspace,vspace:m.vspace,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||(m.type=="audio"?"300":"320");n.height=m.height||(m.type=="audio"?"32":"240");return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{forced_root_block:"",force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(z,o){var u=this,p=u.editor,C,H,j,t,I,y,G,w,k,E,s,q,A,D,m,x,l,B,F;function r(i,n){var M,L,N,K,J;J=p.getParam("flash_video_player_url",u.convertUrl(u.url+"/moxieplayer.swf"));if(J){M=p.documentBaseURI;G.params.src=J;if(p.getParam("flash_video_player_absvideourl",true)){i=M.toAbsolute(i||"",true);n=M.toAbsolute(n||"",true)}N="";L=p.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(L,function(P,O){P=P.replace(/\$url/,i||"");P=P.replace(/\$poster/,n||"");if(P.length>0){N+=(N?"&":"")+O+"="+escape(P)}});if(N.length){G.params.flashvars=N}K=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(K,function(P,O){G.params[O]=""+P})}}G=z.attr("data-mce-json");if(!G){return}G=g.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}if(q.name==="Iframe"){x=new b("iframe",1);tinymce.each(d,function(i){var n=z.attr(i);if(i=="class"&&n){n=n.replace(/mceItem.+ ?/g,"")}if(n&&n.length>0){x.attr(i,n)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new b("script",1).attr("type","text/javascript");y=new b("#text",3);y.value="write"+q.name+"("+g.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new b("video",1).attr(tinymce.extend({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A<k.length;A++){if(/\.mp4$/.test(k[A].src)){m=k[A].src}}if(!k[0].type){C.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new b("source",1).attr(k[A]);w.shortEnded=true;C.append(w)}if(m){r(m,l);q=u.getType("flash")}else{G.params.src=""}}if(q.name==="Audio"&&G.video.sources[0]){F=new b("audio",1).attr(tinymce.extend({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);if(!k[0].type){F.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new b("source",1).attr(k[A]);w.shortEnded=true;F.append(w)}G.params.src=""}if(q.name==="EmbeddedAudio"){j=new b("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B,type:z.attr("type")});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(d,function(i){if(G[i]&&i!="type"){j.attr(i,G[i])}});G.params.src=""}if(G.params.src){if(/\.flv$/i.test(G.params.src)){r(G.params.src,"")}if(o&&o.force_absolute){G.params.src=p.documentBaseURI.toAbsolute(G.params.src)}H=new b("object",1).attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B});tinymce.each(d,function(i){var n=G[i];if(i=="class"&&n){n=n.replace(/mceItem.+ ?/g,"")}if(n&&i!="type"){H.attr(i,n)}});for(I in G.params){s=new b("param",1);s.shortEnded=true;y=G.params[I];if(I==="src"&&q.name==="WindowsMedia"){I="url"}s.attr({name:I,value:y});H.append(s)}if(this.editor.getParam("media_strict",true)){H.attr({data:G.params.src,type:q.mimes[0]})}else{H.attr({classid:"clsid:"+q.clsids[0],codebase:q.codebase});j=new b("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B,type:q.mimes[0]});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(d,function(i){if(G[i]&&i!="type"){j.attr(i,G[i])}});H.append(j)}if(G.object_html){y=new b("#text",3);y.raw=true;y.value=G.object_html;H.append(y)}if(C){C.append(H)}}if(C){if(G.video_html){y=new b("#text",3);y.raw=true;y.value=G.video_html;C.append(y)}}if(F){if(G.video_html){y=new b("#text",3);y.raw=true;y.value=G.video_html;F.append(y)}}var v=C||F||H||j;if(v){z.replace(v)}else{z.remove()}},objectToImg:function(C){var L,k,F,s,M,N,y,A,x,G,E,t,q,I,B,l,K,o,H=this.lookup,m,z,v=this.editor.settings.url_converter,n=this.editor.settings.url_converter_scope,w,r,D,j;function u(i){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(i)}function J(O,i){return H[(O.attr(i)||"").toLowerCase()]}function p(O){var i=O.replace(/^.*\.([^.]+)$/,"$1");return H[i.toLowerCase()||""]}if(!C.parent){return}if(C.name==="script"){if(C.firstChild){m=a.exec(C.firstChild.value)}if(!m){return}o=m[1];K={video:{},params:g.parse(m[2])};A=K.params.width;x=K.params.height}K=K||{video:{},params:{}};M=new b("img",1);M.attr({src:this.editor.theme.url+"/img/trans.gif"});N=C.name;if(N==="video"||N=="audio"){F=C;L=C.getAll("object")[0];k=C.getAll("embed")[0];A=F.attr("width");x=F.attr("height");y=F.attr("id");K.video={attrs:{},sources:[]};z=K.video.attrs;for(N in F.attributes.map){z[N]=F.attributes.map[N]}B=C.attr("src");if(B){K.video.sources.push({src:v.call(n,B,"src",C.name)})}l=F.getAll("source");for(E=0;E<l.length;E++){B=l[E].remove();K.video.sources.push({src:v.call(n,B.attr("src"),"src","source"),type:B.attr("type"),media:B.attr("media")})}if(z.poster){z.poster=v.call(n,z.poster,"poster",C.name)}}if(C.name==="object"){L=C;k=C.getAll("embed")[0]}if(C.name==="embed"){k=C}if(C.name==="iframe"){s=C;o="Iframe"}if(L){A=A||L.attr("width");x=x||L.attr("height");G=G||L.attr("style");y=y||L.attr("id");w=w||L.attr("hspace");r=r||L.attr("vspace");D=D||L.attr("align");j=j||L.attr("bgcolor");K.name=L.attr("name");I=L.getAll("param");for(E=0;E<I.length;E++){q=I[E];N=q.remove().attr("name");if(!h[N]){K.params[N]=q.attr("value")}}K.params.src=K.params.src||L.attr("data")}if(k){A=A||k.attr("width");x=x||k.attr("height");G=G||k.attr("style");y=y||k.attr("id");w=w||k.attr("hspace");r=r||k.attr("vspace");D=D||k.attr("align");j=j||k.attr("bgcolor");for(N in k.attributes.map){if(!h[N]&&!K.params[N]){K.params[N]=k.attributes.map[N]}}}if(s){A=s.attr("width");x=s.attr("height");G=G||s.attr("style");y=s.attr("id");w=s.attr("hspace");r=s.attr("vspace");D=s.attr("align");j=s.attr("bgcolor");tinymce.each(d,function(i){M.attr(i,s.attr(i))});for(N in s.attributes.map){if(!h[N]&&!K.params[N]){K.params[N]=s.attributes.map[N]}}}if(K.params.movie){K.params.src=K.params.src||K.params.movie;delete K.params.movie}if(K.params.src){K.params.src=v.call(n,K.params.src,"src","object")}if(F){if(C.name==="video"){o=H.video.name}else{if(C.name==="audio"){o=H.audio.name}}}if(L&&!o){o=(J(L,"clsid")||J(L,"classid")||J(L,"type")||{}).name}if(k&&!o){o=(J(k,"type")||p(K.params.src)||{}).name}if(k&&o=="EmbeddedAudio"){K.params.type=k.attr("type")}C.replace(M);if(k){k.remove()}if(L){t=u(L.remove());if(t){K.object_html=t}}if(F){t=u(F.remove());if(t){K.video_html=t}}K.hspace=w;K.vspace=r;K.align=D;K.bgcolor=j;M.attr({id:y,"class":"mceItemMedia mceItem"+(o||"Flash"),style:G,width:A||(C.name=="audio"?"300":"320"),height:x||(C.name=="audio"?"32":"240"),hspace:w,vspace:r,align:D,bgcolor:j,"data-mce-json":g.serialize(K,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/media/editor_plugin_src.js 1.0.2.src/e107_handlers/tiny_mce/plugins/media/editor_plugin_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/media/editor_plugin_src.js	2012-10-30 15:39:55.583444652 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/media/editor_plugin_src.js	2012-10-30 15:40:38.360444332 +0000
@@ -23,7 +23,9 @@
 		["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],
 		["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"],
 		["Iframe"],
-		["Video"]
+		["Video"],
+		["EmbeddedAudio"],
+		["Audio"]
 	];
 
 	function toArray(obj) {
@@ -86,11 +88,12 @@
 				"silverlight=xap;" +
 				"flash=swf,flv;" +
 				"shockwave=dcr;" +
-				"quicktime=mov,qt,mpg,mp3,mpeg;" +
+				"quicktime=mov,qt,mpg,mpeg;" +
 				"shockwave=dcr;" +
 				"windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" +
 				"realmedia=rm,ra,ram;" +
-				"java=jar"
+				"java=jar;" +
+				"audio=mp3,ogg"
 			).split(';'), function(item) {
 				var i, extensions, type;
 
@@ -155,17 +158,20 @@
 
 				img = ed.selection.getNode();
 				if (isMediaImg(img)) {
-					data = JSON.parse(ed.dom.getAttrib(img, 'data-mce-json'));
+					data = ed.dom.getAttrib(img, 'data-mce-json');
+					if (data) {
+						data = JSON.parse(data);
+
+						// Add some extra properties to the data object
+						tinymce.each(rootAttributes, function(name) {
+							var value = ed.dom.getAttrib(img, name);
+
+							if (value)
+								data[name] = value;
+						});
 
-					// Add some extra properties to the data object
-					tinymce.each(rootAttributes, function(name) {
-						var value = ed.dom.getAttrib(img, name);
-
-						if (value)
-							data[name] = value;
-					});
-
-					data.type = self.getType(img.className).name.toLowerCase();
+						data.type = self.getType(img.className).name.toLowerCase();
+					}
 				}
 
 				if (!data) {
@@ -245,13 +251,15 @@
 				id : data.id,
 				style : data.style,
 				align : data.align,
+				hspace : data.hspace,
+				vspace : data.vspace,
 				src : self.editor.theme.url + '/img/trans.gif',
 				'class' : 'mceItemMedia mceItem' + self.getType(data.type).name,
 				'data-mce-json' : JSON.serialize(data, "'")
 			});
 
-			img.width = data.width || "320";
-			img.height = data.height || "240";
+			img.width = data.width || (data.type == 'audio' ? "300" : "320");
+			img.height = data.height || (data.type == 'audio' ? "32" : "240");
 
 			return img;
 		},
@@ -260,7 +268,7 @@
 		 * Converts the JSON data object to a HTML string.
 		 */
 		dataToHtml : function(data, force_absolute) {
-			return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {force_absolute : force_absolute});
+			return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute});
 		},
 
 		/**
@@ -320,7 +328,7 @@
 		imgToObject : function(node, args) {
 			var self = this, editor = self.editor, video, object, embed, iframe, name, value, data,
 				source, sources, params, param, typeItem, i, item, mp4Source, replacement,
-				posterSrc, style;
+				posterSrc, style, audio;
 
 			// Adds the flash player
 			function addPlayer(video_src, poster_src) {
@@ -363,7 +371,11 @@
 				}
 			};
 
-			data = JSON.parse(node.attr('data-mce-json'));
+			data = node.attr('data-mce-json');
+			if (!data)
+				return;
+
+			data = JSON.parse(data);
 			typeItem = this.getType(node.attr('class'));
 
 			style = node.attr('data-mce-style')
@@ -456,6 +468,57 @@
 					data.params.src = '';
 			}
 
+			// Add HTML5 audio element
+			if (typeItem.name === 'Audio' && data.video.sources[0]) {
+				// Create new object element
+				audio = new Node('audio', 1).attr(tinymce.extend({
+					id : node.attr('id'),
+					width: node.attr('width'),
+					height: node.attr('height'),
+					style : style
+				}, data.video.attrs));
+
+				// Get poster source and use that for flash fallback
+				if (data.video.attrs)
+					posterSrc = data.video.attrs.poster;
+
+				sources = data.video.sources = toArray(data.video.sources);
+				if (!sources[0].type) {
+					audio.attr('src', sources[0].src);
+					sources.splice(0, 1);
+				}
+
+				for (i = 0; i < sources.length; i++) {
+					source = new Node('source', 1).attr(sources[i]);
+					source.shortEnded = true;
+					audio.append(source);
+				}
+
+				data.params.src = '';
+			}
+
+			if (typeItem.name === 'EmbeddedAudio') {
+				embed = new Node('embed', 1);
+				embed.shortEnded = true;
+				embed.attr({
+					id: node.attr('id'),
+					width: node.attr('width'),
+					height: node.attr('height'),
+					style : style,
+					type: node.attr('type')
+				});
+
+				for (name in data.params)
+					embed.attr(name, data.params[name]);
+
+				tinymce.each(rootAttributes, function(name) {
+					if (data[name] && name != 'type')
+						embed.attr(name, data[name]);
+				});
+
+				data.params.src = '';
+			}
+
 			// Do we have a params src then we can generate object
 			if (data.params.src) {
 				// Is flv movie add player for it
@@ -474,8 +537,13 @@
 				});
 
 				tinymce.each(rootAttributes, function(name) {
-					if (data[name] && name != 'type')
-						object.attr(name, data[name]);
+					var value = data[name];
+
+					if (name == 'class' && value)
+						value = value.replace(/mceItem.+ ?/g, '');
+
+					if (value && name != 'type')
+						object.attr(name, value);
 				});
 
 				// Add params
@@ -548,8 +616,19 @@
 				}
 			}
 
-			if (video || object)
-				node.replace(video || object);
+			if (audio) {
+				// Insert raw HTML
+				if (data.video_html) {
+					value = new Node('#text', 3);
+					value.raw = true;
+					value.value = data.video_html;
+					audio.append(value);
+				}
+			}
+
+			var n = video || audio || object || embed;
+			if (n)
+				node.replace(n);
 			else
 				node.remove();
 		},
@@ -567,7 +646,8 @@
 			var object, embed, video, iframe, img, name, id, width, height, style, i, html,
 				param, params, source, sources, data, type, lookup = this.lookup,
 				matches, attrs, urlConverter = this.editor.settings.url_converter,
-				urlConverterScope = this.editor.settings.url_converter_scope;
+				urlConverterScope = this.editor.settings.url_converter_scope,
+				hspace, vspace, align, bgcolor;
 
 			function getInnerHTML(node) {
 				return new tinymce.html.Serializer({
@@ -576,6 +656,15 @@
 				}).serialize(node);
 			};
 
+			function lookupAttribute(o, attr) {
+				return lookup[(o.attr(attr) || '').toLowerCase()];
+			}
+
+			function lookupExtension(src) {
+				var ext = src.replace(/^.*\.([^.]+)$/, '$1');
+				return lookup[ext.toLowerCase() || ''];
+			}
+
 			// If node isn't in document
 			if (!node.parent)
 				return;
@@ -608,7 +697,7 @@
 
 			// Video element
 			name = node.name;
-			if (name === 'video') {
+			if (name === 'video' || name == 'audio') {
 				video = node;
 				object = node.getAll('object')[0];
 				embed = node.getAll('embed')[0];
@@ -624,7 +713,7 @@
 
 				source = node.attr('src');
 				if (source)
-					data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', 'video')});
+					data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
 
 				// Get all sources
 				sources = video.getAll("source");
@@ -640,7 +729,7 @@
 
 				// Convert the poster URL
 				if (attrs.poster)
-					attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', 'video');
+					attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
 			}
 
 			// Object element
@@ -665,6 +754,11 @@
 				height = height || object.attr('height');
 				style = style || object.attr('style');
 				id = id || object.attr('id');
+				hspace = hspace || object.attr('hspace');
+				vspace = vspace || object.attr('vspace');
+				align = align || object.attr('align');
+				bgcolor = bgcolor || object.attr('bgcolor');
+				data.name = object.attr('name');
 
 				// Get all object params
 				params = object.getAll("param");
@@ -685,6 +779,10 @@
 				height = height || embed.attr('height');
 				style = style || embed.attr('style');
 				id = id || embed.attr('id');
+				hspace = hspace || embed.attr('hspace');
+				vspace = vspace || embed.attr('vspace');
+				align = align || embed.attr('align');
+				bgcolor = bgcolor || embed.attr('bgcolor');
 
 				// Get all embed attributes
 				for (name in embed.attributes.map) {
@@ -699,6 +797,10 @@
 				height = iframe.attr('height');
 				style = style || iframe.attr('style');
 				id = iframe.attr('id');
+				hspace = iframe.attr('hspace');
+				vspace = iframe.attr('vspace');
+				align = iframe.attr('align');
+				bgcolor = iframe.attr('bgcolor');
 
 				tinymce.each(rootAttributes, function(name) {
 					img.attr(name, iframe.attr(name));
@@ -721,14 +823,23 @@
 			if (data.params.src)
 				data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
 
-			if (video)
-				type = lookup.video.name;
+			if (video) {
+				if (node.name === 'video')
+					type = lookup.video.name;
+				else if (node.name === 'audio')
+					type = lookup.audio.name;
+			}
 
 			if (object && !type)
-				type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name;
+				type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
 
 			if (embed && !type)
-				type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name;
+				type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
+
+			// for embedded audio we preserve the original specified type
+			if (embed && type == 'EmbeddedAudio') {
+				data.params.type = embed.attr('type');
+			}
 
 			// Replace the video/object/embed element with a placeholder image containing the data
 			node.replace(img);
@@ -753,13 +864,22 @@
 					data.video_html = html;
 			}
 
+			data.hspace = hspace;
+			data.vspace = vspace;
+			data.align = align;
+			data.bgcolor = bgcolor;
+
 			// Set width/height of placeholder
 			img.attr({
 				id : id,
 				'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
 				style : style,
-				width : width || "320",
-				height : height || "240",
+				width : width || (node.name == 'audio' ? "300" : "320"),
+				height : height || (node.name == 'audio' ? "32" : "240"),
+				hspace : hspace,
+				vspace : vspace,
+				align : align,
+				bgcolor : bgcolor,
 				"data-mce-json" : JSON.serialize(data, "'")
 			});
 		}
@@ -767,4 +887,4 @@
 
 	// Register plugin
 	tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
-})();
\ No newline at end of file
+})();
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/media/js/media.js 1.0.2.src/e107_handlers/tiny_mce/plugins/media/js/media.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/media/js/media.js	2012-10-30 15:39:55.583444652 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/media/js/media.js	2012-10-30 15:40:38.362444470 +0000
@@ -8,6 +8,33 @@
 		return document.getElementById(id);
 	}
 
+	function clone(obj) {
+		var i, len, copy, attr;
+
+		if (null == obj || "object" != typeof obj)
+			return obj;
+
+		// Handle Array
+		if ('length' in obj) {
+			copy = [];
+
+			for (i = 0, len = obj.length; i < len; ++i) {
+				copy[i] = clone(obj[i]);
+			}
+
+			return copy;
+		}
+
+		// Handle Object
+		copy = {};
+		for (attr in obj) {
+			if (obj.hasOwnProperty(attr))
+				copy[attr] = clone(obj[attr]);
+		}
+
+		return copy;
+	}
+
 	function getVal(id) {
 		var elm = get(id);
 
@@ -20,17 +47,18 @@
 		return elm.value;
 	}
 
-	function setVal(id, value) {
+	function setVal(id, value, name) {
 		if (typeof(value) != 'undefined') {
 			var elm = get(id);
 
 			if (elm.nodeName == "SELECT")
 				selectByValue(document.forms[0], id, value);
 			else if (elm.type == "checkbox") {
-				if (typeof(value) == 'string')
-					elm.checked = value.toLowerCase() === 'true' ? true : false;
-				else
-					elm.checked = !!value;
+				if (typeof(value) == 'string') {
+					value = value.toLowerCase();
+					value = (!name && value === 'true') || (name && value === name.toLowerCase());
+				}
+				elm.checked = !!value;
 			} else
 				elm.value = value;
 		}
@@ -38,19 +66,21 @@
 
 	window.Media = {
 		init : function() {
-			var html, editor;
+			var html, editor, self = this;
 
-			this.editor = editor = tinyMCEPopup.editor;
+			self.editor = editor = tinyMCEPopup.editor;
 
 			// Setup file browsers and color pickers
 			get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
 			get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media');
 			get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
-			get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media');
-			get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media');
+			get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media');
+			get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media');
+			get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media');
+			get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media');
 			get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image');
 
-			html = this.getMediaListHTML('medialist', 'src', 'media', 'media');
+			html = self.getMediaListHTML('medialist', 'src', 'media', 'media');
 			if (html == "")
 				get("linklistrow").style.display = 'none';
 			else
@@ -59,18 +89,29 @@
 			if (isVisible('filebrowser'))
 				get('src').style.width = '230px';
 
-			if (isVisible('filebrowser_altsource1'))
+			if (isVisible('video_filebrowser_altsource1'))
 				get('video_altsource1').style.width = '220px';
 
-			if (isVisible('filebrowser_altsource2'))
+			if (isVisible('video_filebrowser_altsource2'))
 				get('video_altsource2').style.width = '220px';
 
+			if (isVisible('audio_filebrowser_altsource1'))
+				get('audio_altsource1').style.width = '220px';
+
+			if (isVisible('audio_filebrowser_altsource2'))
+				get('audio_altsource2').style.width = '220px';
+
 			if (isVisible('filebrowser_poster'))
 				get('video_poster').style.width = '220px';
 
-			this.data = tinyMCEPopup.getWindowArg('data');
-			this.dataToForm();
-			this.preview();
+			editor.dom.setOuterHTML(get('media_type'), self.getMediaTypeHTML(editor));
+
+			self.setDefaultDialogSettings(editor);
+			self.data = clone(tinyMCEPopup.getWindowArg('data'));
+			self.dataToForm();
+			self.preview();
+
+			updateColor('bgcolor_pick', 'bgcolor');
 		},
 
 		insert : function() {
@@ -88,7 +129,7 @@
 		},
 
 		moveStates : function(to_form, field) {
-			var data = this.data, editor = this.editor, data = this.data,
+			var data = this.data, editor = this.editor,
 				mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src;
 
 			defaultStates = {
@@ -136,7 +177,7 @@
 
 						if (type == 'global')
 							list = data;
-						else if (type == 'video') {
+						else if (type == 'video' || type == 'audio') {
 							list = data.video.attrs;
 
 							if (!list && !to_form)
@@ -146,12 +187,12 @@
 
 						if (list) {
 							if (to_form) {
-								setVal(formItemName, list[name]);
+								setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : '');
 							} else {
 								delete list[name];
 
 								value = getVal(formItemName);
-								if (type == 'video' && value === true)
+								if ((type == 'video' || type == 'audio') && value === true)
 									value = name;
 
 								if (defaultStates[formItemName]) {
@@ -184,7 +225,7 @@
 					setVal('media_type', data.type);
 				}
 
-				if (data.type == "video") {
+				if (data.type == "video" || data.type == "audio") {
 					if (!data.video.sources)
 						data.video.sources = [];
 
@@ -194,11 +235,13 @@
 
 			// Hide all fieldsets and show the one active
 			get('video_options').style.display = 'none';
+			get('audio_options').style.display = 'none';
 			get('flash_options').style.display = 'none';
 			get('quicktime_options').style.display = 'none';
 			get('shockwave_options').style.display = 'none';
 			get('windowsmedia_options').style.display = 'none';
 			get('realmedia_options').style.display = 'none';
+			get('embeddedaudio_options').style.display = 'none';
 
 			if (get(data.type + '_options'))
 				get(data.type + '_options').style.display = 'block';
@@ -210,7 +253,9 @@
 			setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign');
 			setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume');
 			setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks');
-			setOptions('video', 'poster,autoplay,loop,preload,controls');
+			setOptions('video', 'poster,autoplay,loop,muted,preload,controls');
+			setOptions('audio', 'autoplay,loop,preload,controls');
+			setOptions('embeddedaudio', 'autoplay,loop,controls');
 			setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height');
 
 			if (to_form) {
@@ -225,12 +270,23 @@
 					src = data.video.sources[2];
 					if (src)
 						setVal('video_altsource2', src.src);
+                } else if (data.type == 'audio') {
+                    if (data.video.sources[0])
+                        setVal('src', data.video.sources[0].src);
+                    
+                    src = data.video.sources[1];
+                    if (src)
+                        setVal('audio_altsource1', src.src);
+                    
+                    src = data.video.sources[2];
+                    if (src)
+                        setVal('audio_altsource2', src.src);
 				} else {
 					// Check flash vars
 					if (data.type == 'flash') {
 						tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) {
 							if (value == '$url')
-								data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src;
+								data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src || '';
 						});
 					}
 
@@ -238,7 +294,18 @@
 				}
 			} else {
 				src = getVal("src");
-	
+
+				// YouTube *NEW*
+				if (src.match(/youtu.be\/[a-z1-9.-_]+/)) {
+					data.width = 425;
+					data.height = 350;
+					data.params.frameborder = '0';
+					data.type = 'iframe';
+					src = 'http://www.youtube.com/embed/' + src.match(/youtu.be\/([a-z1-9.-_]+)/)[1];
+					setVal('src', src);
+					setVal('media_type', data.type);
+				}
+
 				// YouTube
 				if (src.match(/youtube.com(.+)v=([^&]+)/)) {
 					data.width = 425;
@@ -273,12 +340,25 @@
 					src = getVal("video_altsource2");
 					if (src)
 						data.video.sources[2] = {src : src};
+                } else if (data.type == 'audio') {
+                    if (!data.video.sources)
+                        data.video.sources = [];
+                    
+                    data.video.sources[0] = {src : src};
+                    
+                    src = getVal("audio_altsource1");
+                    if (src)
+                        data.video.sources[1] = {src : src};
+                    
+                    src = getVal("audio_altsource2");
+                    if (src)
+                        data.video.sources[2] = {src : src};
 				} else
 					data.params.src = src;
 
 				// Set default size
-				setVal('width', data.width || 320);
-				setVal('height', data.height || 240);
+                setVal('width', data.width || (data.type == 'audio' ? 300 : 320));
+                setVal('height', data.height || (data.type == 'audio' ? 32 : 240));
 			}
 		},
 
@@ -296,7 +376,7 @@
 				this.panel = 'source';
 			} else {
 				if (this.panel == 'source') {
-					this.data = this.editor.plugins.media.htmlToData(getVal('source'));
+					this.data = clone(this.editor.plugins.media.htmlToData(getVal('source')));
 					this.dataToForm();
 					this.panel = '';
 				}
@@ -307,16 +387,16 @@
 		},
 
 		beforeResize : function() {
-			this.width = parseInt(getVal('width') || "320", 10);
-			this.height = parseInt(getVal('height') || "240", 10);
+            this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+            this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
 		},
 
 		changeSize : function(type) {
 			var width, height, scale, size;
 
 			if (get('constrain').checked) {
-				width = parseInt(getVal('width') || "320", 10);
-				height = parseInt(getVal('height') || "240", 10);
+                width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+                height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
 
 				if (type == 'width') {
 					this.height = Math.round((width / this.width) * height);
@@ -344,6 +424,36 @@
 			}
 
 			return "";
+		},
+
+		getMediaTypeHTML : function(editor) {
+			function option(media_type){
+				return '<option value="'+media_type+'">'+tinyMCEPopup.editor.translate("media_dlg."+media_type)+'</option>'
+			}
+			var html = "";
+			html += '<select id="media_type" name="media_type" onchange="Media.formToData(\'type\');">';
+			html += option("video");
+			html += option("audio");
+			html += option("flash");
+			html += option("quicktime");
+			html += option("shockwave");
+			html += option("windowsmedia");
+			html += option("realmedia");
+			html += option("iframe");
+
+			if (editor.getParam('media_embedded_audio', false)) {
+				html += option('embeddedaudio');
+			}
+			
+			html += '</select>';
+			return html;
+		},
+
+		setDefaultDialogSettings : function(editor) {
+			var defaultDialogSettings = editor.getParam("media_dialog_defaults", {});
+			tinymce.each(defaultDialogSettings, function(v, k) {
+				setVal(k, v);
+			});
 		}
 	};
 
@@ -351,4 +461,4 @@
 	tinyMCEPopup.onInit.add(function() {
 		Media.init();
 	});
-})();
\ No newline at end of file
+})();
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/media/langs/en_dlg.js 1.0.2.src/e107_handlers/tiny_mce/plugins/media/langs/en_dlg.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/media/langs/en_dlg.js	2012-10-30 15:39:55.582445182 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/media/langs/en_dlg.js	2012-10-30 15:40:38.363444665 +0000
@@ -1,109 +1 @@
-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_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",
-html5_video_options:"HTML5 Video Options",
-altsource1:"Alternative source 1",
-altsource2:"Alternative source 2",
-preload:"Preload",
-poster:"Poster",
-
-source:"Source"
-});
\ No newline at end of file
+tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" }); 
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/media/media.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/media/media.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/media/media.htm	2012-10-30 15:39:55.583444652 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/media/media.htm	2012-10-30 15:40:38.363444665 +0000
@@ -29,15 +29,7 @@
 							<tr>
 								<td><label for="media_type">{#media_dlg.type}</label></td>
 								<td>
-									<select id="media_type" name="media_type" onchange="Media.formToData('type');">
-										<option value="video">HTML5 Video</option>
-										<option value="flash">Flash</option>
-										<option value="quicktime">QuickTime</option>
-										<option value="shockwave">Shockwave</option>
-										<option value="windowsmedia">Windows Media</option>
-										<option value="realmedia">Real Media</option>
-										<option value="iframe">Iframe</option>
-									</select>
+									<select id="media_type"></select>
 								</td>
 							</tr>
 							<tr>
@@ -159,6 +151,17 @@
 								</table>
 							</td>
 						</tr>
+
+						<tr>
+							<td><label for="video_preload">{#media_dlg.preload}</label></td>
+							<td>
+								<select id="video_preload" name="video_preload" onchange="Media.formToData();">
+									<option value="none">{#media_dlg.preload_none}</option> 
+									<option value="metadata">{#media_dlg.preload_metadata}</option>
+									<option value="auto">{#media_dlg.preload_auto}</option>
+								</select>
+							</td>
+						</tr>
 					</table>
 
 					<table role="presentation" border="0" cellpadding="4" cellspacing="0">
@@ -175,26 +178,133 @@
 							<td>
 								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
 									<tr>
-										<td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td>
-										<td><label for="video_loop">{#media_dlg.loop}</label></td>
+										<td><input type="checkbox" class="checkbox" id="video_muted" name="video_muted" onchange="Media.formToData();" /></td>
+										<td><label for="video_muted">{#media_dlg.mute}</label></td>
 									</tr>
 								</table>
 							</td>
 
 							<td>
+									<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+											<tr>
+													<td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td>
+													<td><label for="video_loop">{#media_dlg.loop}</label></td>
+											</tr>
+									</table>
+							</td>
+
+							<td>
 								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
 									<tr>
-										<td><input type="checkbox" class="checkbox" id="video_preload" name="video_preload" onchange="Media.formToData();" /></td>
-										<td><label for="video_preload">{#media_dlg.preload}</label></td>
+										<td><input type="checkbox" class="checkbox" id="video_controls" name="video_controls" onchange="Media.formToData();" /></td>
+										<td><label for="video_controls">{#media_dlg.controls}</label></td>
 									</tr>
 								</table>
 							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="embeddedaudio_options">
+					<legend>{#media_dlg.embedded_audio_options}</legend>
 
+					<table role="presentation" border="0" cellpadding="4" cellspacing="0">
+						<tr>
 							<td>
 								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
 									<tr>
-										<td><input type="checkbox" class="checkbox" id="video_controls" name="video_controls" onchange="Media.formToData();" /></td>
-										<td><label for="video_controls">{#media_dlg.controls}</label></td>
+										<td><input type="checkbox" class="checkbox" id="embeddedaudio_autoplay" name="audio_autoplay" onchange="Media.formToData();" /></td>
+										<td><label for="audio_autoplay">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td>
+								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="embeddedaudio_loop" name="audio_loop" onchange="Media.formToData();" /></td>
+										<td><label for="audio_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td>
+								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="embeddedaudio_controls" name="audio_controls" onchange="Media.formToData();" /></td>
+										<td><label for="audio_controls">{#media_dlg.controls}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="audio_options">
+					<legend>{#media_dlg.html5_audio_options}</legend>
+
+					<table role="presentation">
+						<tr>
+							<td><label for="audio_altsource1">{#media_dlg.altsource1}</label></td>
+							<td>
+								<table role="presentation" border="0" cellspacing="0" cellpadding="0">
+									<tr>
+										<td><input type="text" id="audio_altsource1" name="audio_altsource1" onchange="Media.formToData();" style="width: 240px" /></td>
+										<td id="audio_altsource1_filebrowser">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="audio_altsource2">{#media_dlg.altsource2}</label></td>
+							<td>
+								<table role="presentation" border="0" cellspacing="0" cellpadding="0">
+									<tr>
+										<td><input type="text" id="audio_altsource2" name="audio_altsource2" onchange="Media.formToData();" style="width: 240px" /></td>
+										<td id="audio_altsource2_filebrowser">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="audio_preload">{#media_dlg.preload}</label></td>
+							<td>
+								<select id="audio_preload" name="audio_preload" onchange="Media.formToData();">
+									<option value="none">{#media_dlg.preload_none}</option>
+									<option value="metadata">{#media_dlg.preload_metadata}</option>
+									<option value="auto">{#media_dlg.preload_auto}</option>
+								</select>
+							</td>
+						</tr>
+					</table>
+
+					<table role="presentation" border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td>
+								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="audio_autoplay" name="audio_autoplay" onchange="Media.formToData();" /></td>
+										<td><label for="audio_autoplay">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td>
+								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="audio_loop" name="audio_loop" onchange="Media.formToData();" /></td>
+										<td><label for="audio_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td>
+								<table role="presentation" border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="audio_controls" name="audio_controls" onchange="Media.formToData();" /></td>
+										<td><label for="audio_controls">{#media_dlg.controls}</label></td>
 									</tr>
 								</table>
 							</td>
@@ -798,7 +908,7 @@
 			<div id="source_panel" class="panel">
 				<fieldset>
 					<legend>{#media_dlg.source}</legend>
-					<textarea id="source" style="width: 100%; height: 390px"></textarea>
+					<textarea id="source" style="width: 99%; height: 390px"></textarea>
 				</fieldset>
 			</div>
 		</div>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin.js 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin.js	2012-10-30 15:40:38.364444543 +0000
@@ -1 +1 @@
-(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=false;function h(m,k){var l=d.dom,i,j;f.onPreProcess.dispatch(f,m);m.node=l.create("div",0,m.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){j=l.select("p,h1,h2,h3,h4,h5,h6,pre",m.node);if(j.length==1&&m.content.indexOf("__MCE_ITEM__")===-1){l.remove(j.reverse(),true)}}}f.onPostProcess.dispatch(f,m);m.content=d.serializer.serialize(m.node,{getInner:1});if((!k)&&(d.pasteAsPlainText)){f._insertPlainText(d,l,m.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(m.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:r.replace(/\r?\n/g,"<br />")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},'\uFEFF\uFEFF<br data-mce-bogus="1">');if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort().y}o.setStyles(l,{position:"absolute",left:-10000,top:i,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,1);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="<pre>"+o.encode(r).replace(/\r?\n/g,"<br />")+"</pre>"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}if(b(d,"paste_block_drop")){d.onInit.add(function(){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})})}f._legacySupport()},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}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/&quot;/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l<d.length;l++){o=d[l];j=h.getStyle(m,o);if(j){n[o]=j;k++}}}h.setAttrib(m,"style","");if(d&&k>0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f<d){n=tinymce.inArray(m,f);o=i.getParents(h.parentNode,s);h=o[o.length-1-n]||h}}}c(i.select("span",t),function(v){var p=v.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(d){c(d,function(h){if(h.constructor==RegExp){v=v.replace(h,"")}else{v=v.replace(h[0],h[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.decode(tinymce.html.Entities.encodeRaw(v));if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker">&nbsp;</span>');window.setTimeout(function(){var d=x.get("_plain_text_marker"),A,h,w,i;s.select(d,false);z.execCommand("Delete",false,null);d=null;A=s.getStart();h=x.getViewPort(n);w=x.getPos(A).y;i=A.clientHeight;if((w<h.y)||(w+i>h.y+h.h)){z.body.scrollTop=w<h.y?w:w-h.h+25}},0)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
+(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"combined",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:o.encode(r).replace(/\r?\n/g,"<br />")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="<p>"+o.encode(r).replace(/\r?\n\r?\n/g,"</p><p>").replace(/\r?\n/g,"<br />")+"</p>"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},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}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]]);d([[/<br><br>/g,"<BR><BR>"],[/<br>/g," "],[/<BR><BR>/g,"<br>"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/&quot;/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l<d.length;l++){o=d[l];j=h.getStyle(m,o);if(j){n[o]=j;k++}}}h.setAttrib(m,"style","");if(d&&k>0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f<d){n=tinymce.inArray(m,f);o=i.getParents(h.parentNode,s);h=o[o.length-1-n]||h}}}c(i.select("span",t),function(v){var p=v.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(g){var d=this.editor,e=b(d,"paste_text_linebreaktype"),i=b(d,"paste_text_replacements"),f=tinymce.is;function h(j){c(j,function(k){if(k.constructor==RegExp){g=g.replace(k,"")}else{g=g.replace(k[0],k[1])}})}if((typeof(g)==="string")&&(g.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(g)){h([/[\n\r]+/g])}else{h([/\r+/g])}h([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"]]);g=d.dom.decode(tinymce.html.Entities.encodeRaw(g));if(f(i,"array")){h(i)}else{if(f(i,"string")){h(new RegExp(i,"gi"))}}if(e=="none"){h([[/\n+/g," "]])}else{if(e=="br"){h([[/\n/g,"<br />"]])}else{if(e=="p"){h([[/\n+/g,"</p><p>"],[/^(.*<\/p>)(<p>)$/,"<p>$1"]])}else{h([[/\n\n/g,"</p><p>"],[/^(.*<\/p>)(<p>)$/,"<p>$1"],[/\n/g,"<br />"]])}}}d.execCommand("mceInsertContent",false,g)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin_src.js 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin_src.js	2012-10-30 15:39:55.587444392 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/editor_plugin_src.js	2012-10-30 15:40:38.364444543 +0000
@@ -25,8 +25,9 @@
 			paste_dialog_height : "400",
 			paste_text_use_dialog : false,
 			paste_text_sticky : false,
+			paste_text_sticky_default : false,
 			paste_text_notifyalways : false,
-			paste_text_linebreaktype : "p",
+			paste_text_linebreaktype : "combined",
 			paste_text_replacements : [
 				[/\u2026/g, "..."],
 				[/[\x93\x94\u201c\u201d]/g, '"'],
@@ -70,12 +71,12 @@
 			});
 
 			// Initialize plain text flag
-			ed.pasteAsPlainText = false;
+			ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default');
 
 			// This function executes the process handlers and inserts the contents
 			// force_rich overrides plain text mode set by user, important for pasting with execCommand
 			function process(o, force_rich) {
-				var dom = ed.dom, rng, nodes;
+				var dom = ed.dom, rng;
 
 				// Execute pre process handlers
 				t.onPreProcess.dispatch(t, o);
@@ -88,11 +89,9 @@
 				if (tinymce.isGecko) {
 					rng = ed.selection.getRng(true);
 					if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) {
-						nodes = dom.select('p,h1,h2,h3,h4,h5,h6,pre', o.node);
-
 						// Is only one block node and it doesn't contain word stuff
-						if (nodes.length == 1 && o.content.indexOf('__MCE_ITEM__') === -1)
-							dom.remove(nodes.reverse(), true);
+						if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1)
+							dom.remove(o.node.firstChild, true);
 					}
 				}
 
@@ -100,11 +99,11 @@
 				t.onPostProcess.dispatch(t, o);
 
 				// Serialize content
-				o.content = ed.serializer.serialize(o.node, {getInner : 1});
+				o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''});
 
 				// Plain text option active?
 				if ((!force_rich) && (ed.pasteAsPlainText)) {
-					t._insertPlainText(ed, dom, o.content);
+					t._insertPlainText(o.content);
 
 					if (!getParam(ed, "paste_text_sticky")) {
 						ed.pasteAsPlainText = false;
@@ -131,7 +130,7 @@
 						if (getParam(ed, "paste_text_sticky")) {
 							ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
 						} else {
-							ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
+							ed.windowManager.alert(ed.translate('paste.plaintext_mode'));
 						}
 
 						if (!getParam(ed, "paste_text_notifyalways")) {
@@ -156,7 +155,7 @@
 
 					if (ed.pasteAsPlainText) {
 						e.preventDefault();
-						process({content : textContent.replace(/\r?\n/g, '<br />')});
+						process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
 						return;
 					}
 				}
@@ -165,19 +164,20 @@
 					return;
 
 				// Create container to paste into
-				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF<br data-mce-bogus="1">');
+				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
 
 				// If contentEditable mode we need to find out the position of the closest element
 				if (body != ed.getDoc().body)
 					posY = dom.getPos(ed.selection.getStart(), body).y;
 				else
-					posY = body.scrollTop + dom.getViewPort().y;
+					posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
 
 				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
+				// If also needs to be in view on IE or the paste would fail
 				dom.setStyles(n, {
 					position : 'absolute',
-					left : -10000,
-					top : posY,
+					left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
+					top : posY - 25,
 					width : 1,
 					height : 1,
 					overflow : 'hidden'
@@ -197,7 +197,7 @@
 
 					// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
 					// to IE security settings so we pass the junk though better than nothing right
-					if (n.innerHTML === '\uFEFF') {
+					if (n.innerHTML === '\uFEFF\uFEFF') {
 						ed.execCommand('mcePasteWord');
 						e.preventDefault();
 						return;
@@ -228,11 +228,11 @@
 
 					or = ed.selection.getRng();
 
-					// Move caret into hidden div
+					// Move select contents inside DIV
 					n = n.firstChild;
 					rng = ed.getDoc().createRange();
 					rng.setStart(n, 0);
-					rng.setEnd(n, 1);
+					rng.setEnd(n, 2);
 					sel.setRng(rng);
 
 					// Wait a while and grab the pasted contents
@@ -267,8 +267,9 @@
 									h += n.innerHTML;
 							});
 						} else {
-							// Found WebKit weirdness so force the content into plain text mode
-							h = '<pre>' + dom.encode(textContent).replace(/\r?\n/g, '<br />') + '</pre>';
+							// Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
+							// So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
+							h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
 						}
 
 						// Remove the nodes
@@ -305,17 +306,19 @@
 				}
 			}
 
-			// Block all drag/drop events
-			if (getParam(ed, "paste_block_drop")) {
-				ed.onInit.add(function() {
+			ed.onInit.add(function() {
+				ed.controlManager.setActive("pastetext", ed.pasteAsPlainText);
+
+				// Block all drag/drop events
+				if (getParam(ed, "paste_block_drop")) {
 					ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {
 						e.preventDefault();
 						e.stopPropagation();
 
 						return false;
 					});
-				});
-			}
+				}
+			});
 
 			// Add legacy support
 			t._legacySupport();
@@ -356,9 +359,18 @@
 			}
 
 			// IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
-			if (tinymce.isIE && document.documentMode >= 9)
+			if (tinymce.isIE && document.documentMode >= 9) {
+				// IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
 				process([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, '$1']]);
 
+				// IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
+				process([
+					[/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact
+					[/<br>/g, ' '], // Replace single br elements with space since they are word wrap BR:s
+					[/<BR><BR>/g, '<br>'] // Replace back the double brs but into a single BR
+				]);
+			}
+
 			// Detect Word content and process it more aggressive
 			if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {
 				o.wordContent = true;			// Mark the pasted contents as word specific content
@@ -744,28 +756,24 @@
 		 * plugin, and requires minimal changes to add the new functionality.
 		 * Speednet - June 2009
 		 */
-		_insertPlainText : function(ed, dom, h) {
-			var i, len, pos, rpos, node, breakElms, before, after,
-				w = ed.getWin(),
-				d = ed.getDoc(),
-				sel = ed.selection,
-				is = tinymce.is,
-				inArray = tinymce.inArray,
+		_insertPlainText : function(content) {
+			var ed = this.editor,
 				linebr = getParam(ed, "paste_text_linebreaktype"),
-				rl = getParam(ed, "paste_text_replacements");
+				rl = getParam(ed, "paste_text_replacements"),
+				is = tinymce.is;
 
 			function process(items) {
 				each(items, function(v) {
 					if (v.constructor == RegExp)
-						h = h.replace(v, "");
+						content = content.replace(v, "");
 					else
-						h = h.replace(v[0], v[1]);
+						content = content.replace(v[0], v[1]);
 				});
 			};
 
-			if ((typeof(h) === "string") && (h.length > 0)) {
+			if ((typeof(content) === "string") && (content.length > 0)) {
 				// If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line
-				if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) {
+				if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) {
 					process([
 						/[\n\r]+/g
 					]);
@@ -782,114 +790,47 @@
 					[/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"],		// Table cells get tabs betweem them
 					/<[a-z!\/?][^>]*>/gi,						// Delete all remaining tags
 					[/&nbsp;/gi, " "],							// Convert non-break spaces to regular spaces (remember, *plain text*)
-					[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],	// Cool little RegExp deletes whitespace around linebreak chars.
-					[/\n{3,}/g, "\n\n"],							// Max. 2 consecutive linebreaks
-					/^\s+|\s+$/g									// Trim the front & back
+					[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],// Cool little RegExp deletes whitespace around linebreak chars.
+					[/\n{3,}/g, "\n\n"]							// Max. 2 consecutive linebreaks
 				]);
 
-				h = dom.decode(tinymce.html.Entities.encodeRaw(h));
-
-				// Delete any highlighted text before pasting
-				if (!sel.isCollapsed()) {
-					d.execCommand("Delete", false, null);
-				}
+				content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content));
 
 				// Perform default or custom replacements
-				if (is(rl, "array") || (is(rl, "array"))) {
+				if (is(rl, "array")) {
 					process(rl);
-				}
-				else if (is(rl, "string")) {
+				} else if (is(rl, "string")) {
 					process(new RegExp(rl, "gi"));
 				}
 
 				// Treat paragraphs as specified in the config
 				if (linebr == "none") {
+					// Convert all line breaks to space
 					process([
 						[/\n+/g, " "]
 					]);
-				}
-				else if (linebr == "br") {
+				} else if (linebr == "br") {
+					// Convert all line breaks to <br />
 					process([
 						[/\n/g, "<br />"]
 					]);
-				}
-				else {
+				} else if (linebr == "p") {
+					// Convert all line breaks to <p>...</p>
+					process([
+						[/\n+/g, "</p><p>"],
+						[/^(.*<\/p>)(<p>)$/, '<p>$1']
+					]);
+				} else {
+					// defaults to "combined"
+					// Convert single line breaks to <br /> and double line breaks to <p>...</p>
 					process([
-						/^\s+|\s+$/g,
 						[/\n\n/g, "</p><p>"],
+						[/^(.*<\/p>)(<p>)$/, '<p>$1'],
 						[/\n/g, "<br />"]
 					]);
 				}
 
-				// This next piece of code handles the situation where we're pasting more than one paragraph of plain
-				// text, and we are pasting the content into the middle of a block node in the editor.  The block
-				// node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining).
-				// The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the
-				// pasted text is prepended to "Para B".  Any other paragraphs of pasted text are placed between
-				// "Para A" and "Para B".  This code solves a host of problems with the original plain text plugin and
-				// now handles styles correctly.  (Pasting plain text into a styled paragraph is supposed to make the
-				// plain text take the same style as the existing paragraph.)
-				if ((pos = h.indexOf("</p><p>")) != -1) {
-					rpos = h.lastIndexOf("</p><p>");
-					node = sel.getNode(); 
-					breakElms = [];		// Get list of elements to break 
-
-					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);
-
-					// Are we in the middle of a block node?
-					if (breakElms.length > 0) {
-						before = h.substring(0, pos);
-						after = "";
-
-						for (i=0, len=breakElms.length; i<len; i++) {
-							before += "</" + breakElms[i].nodeName.toLowerCase() + ">";
-							after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">";
-						}
-
-						if (pos == rpos) {
-							h = before + after + h.substring(pos+7);
-						}
-						else {
-							h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7);
-						}
-					}
-				}
-
-				// Insert content at the caret, plus add a marker for repositioning the caret
-				ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>');
-
-				// Reposition the caret to the marker, which was placed immediately after the inserted content.
-				// Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers.
-				// The second part of the code scrolls the content up if the caret is positioned off-screen.
-				// This is only necessary for WebKit browsers, but it doesn't hurt to use for all.
-				window.setTimeout(function() {
-					var marker = dom.get('_plain_text_marker'),
-						elm, vp, y, elmHeight;
-
-					sel.select(marker, false);
-					d.execCommand("Delete", false, null);
-					marker = null;
-
-					// Get element, position and height
-					elm = sel.getStart();
-					vp = dom.getViewPort(w);
-					y = dom.getPos(elm).y;
-					elmHeight = elm.clientHeight;
-
-					// Is element within viewport if not then scroll it into view
-					if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) {
-						d.body.scrollTop = y < vp.y ? y : y - vp.h + 25;
-					}
-				}, 0);
+				ed.execCommand('mceInsertContent', false, content);
 			}
 		},
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/langs/en_dlg.js 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/langs/en_dlg.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/langs/en_dlg.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/langs/en_dlg.js	2012-10-30 15:40:38.365524013 +0000
@@ -1,5 +1 @@
-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."
-});
\ No newline at end of file
+tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/pastetext.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/pastetext.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/pastetext.htm	1970-01-01 00:00:00.000000000 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/pastetext.htm	2012-10-30 15:40:38.365524013 +0000
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#paste.paste_text_desc}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/pastetext.js"></script>
+</head>
+<body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="return PasteTextDialog.insert();" 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 id="content" name="content" 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">
+			<input type="submit" name="insert" value="{#insert}" id="insert" />
+			<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+		</div>
+	</form>
+</body> 
+</html>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/pasteword.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/pasteword.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/paste/pasteword.htm	1970-01-01 00:00:00.000000000 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/paste/pasteword.htm	2012-10-30 15:40:38.365524013 +0000
@@ -0,0 +1,21 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<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>
+</head>
+<body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="return PasteWordDialog.insert();" action="#">
+		<div class="title">{#paste.paste_word_desc}</div>
+
+		<div>{#paste_dlg.word_title}</div>
+
+		<div id="iframecontainer"></div>
+
+		<div class="mceActionPanel">
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</form>
+</body>
+</html>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/cell.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/table/cell.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/cell.htm	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/cell.htm	2012-10-30 15:40:38.366444573 +0000
@@ -5,6 +5,7 @@
 	<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/cell.js"></script>
 	<link href="css/cell.css" rel="stylesheet" type="text/css" />
@@ -70,10 +71,10 @@
 
 						<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><input id="width" name="width" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></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>
+							<td><input id="height" name="height" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>
 						</tr>
 
 						<tr id="styleSelectRow">
@@ -166,6 +167,7 @@
 				<select id="action" name="action">
 					<option value="cell">{#table_dlg.cell_cell}</option>
 					<option value="row">{#table_dlg.cell_row}</option>
+					<option value="col">{#table_dlg.cell_col}</option>
 					<option value="all">{#table_dlg.cell_all}</option>
 				</select>
 			</div>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/editor_plugin.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/editor_plugin.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/editor_plugin.js	2012-10-30 15:39:55.585478403 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/editor_plugin.js	2012-10-30 15:40:38.367444443 +0000
@@ -1 +1 @@
-(function(c){var d=c.each;function b(f,g){var h=g.ownerDocument,e=h.createRange(),j;e.setStartBefore(g);e.setEnd(f.endContainer,f.endOffset);j=h.createElement("body");j.appendChild(e.cloneContents());return j.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(H,G,K){var f,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;f=[];d(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);d(O,function(P,Q){Q+=M;d(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(f[Q]){while(f[Q][R]){R++}}U=h(W,"rowspan");V=h(W,"colspan");for(T=Q;T<Q+U;T++){if(!f[T]){f[T]=[]}for(S=R;S<R+V;S++){f[T][S]={part:N,real:T==Q&&S==R,elm:W,rowspan:U,colspan:V}}}})});M+=O.length})}function z(M,O){var N;N=f[O];if(N){return N[M]}}function h(N,M){return parseInt(N.getAttribute(M)||1)}function s(O,M,N){if(O){N=parseInt(N);if(N===1){O.removeAttribute(M,1)}else{O.setAttribute(M,N,1)}}}function j(M){return M&&(G.hasClass(M.elm,"mceSelected")||M==o)}function k(){var M=[];d(H.rows,function(N){d(N.cells,function(O){if(G.hasClass(O,"mceSelected")||O==o.elm){M.push(N);return false}})});return M}function r(){var M=G.createRng();M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H)}function e(M){var N;c.walk(M,function(P){var O;if(P.nodeType==3){d(G.getParents(P.parentNode,null,M).reverse(),function(Q){Q=A(Q,false);if(!N){N=O=Q}else{if(O){O.appendChild(Q)}}O=Q});if(O){O.innerHTML=c.isIE?"&nbsp;":'<br data-mce-bogus="1" />'}return false}},"childNodes");M=A(M,false);s(M,"rowspan",1);s(M,"colspan",1);if(N){M.appendChild(N)}else{if(!c.isIE){M.innerHTML='<br data-mce-bogus="1" />'}}return M}function q(){var M=G.createRng();d(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}d(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=f[Math.min(f.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=f[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=f[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(e(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(e(P.cells[0]),P.cells[0])}}}}}function C(){d(f,function(M,N){d(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=h(P,"colspan");R=h(P,"rowspan");if(S>1||R>1){s(P,"rowspan",1);s(P,"colspan",1);for(Q=0;Q<S-1;Q++){G.insertAfter(e(P),P)}u(O,N,R-1,S)}}})})}function p(V,S,Y){var P,O,X,W,U,R,T,M,V,N,Q;if(V){pos=F(V);P=pos.x;O=pos.y;X=P+(S-1);W=O+(Y-1)}else{P=L.x;O=L.y;X=D.x;W=D.y}T=z(P,O);M=z(X,W);if(T&&M&&T.part==M.part){C();t();T=z(P,O).elm;s(T,"colspan",(X-P)+1);s(T,"rowspan",(W-O)+1);for(R=O;R<=W;R++){for(U=P;U<=X;U++){if(!f[R]||!f[R][U]){continue}V=f[R][U].elm;if(V!=T){N=c.grep(V.childNodes);d(N,function(Z){T.appendChild(Z)});if(N.length){N=c.grep(T.childNodes);Q=0;d(N,function(Z){if(Z.nodeName=="BR"&&G.getAttrib(Z,"data-mce-bogus")&&Q++<N.length-1){T.removeChild(Z)}})}G.remove(V)}}}q()}}function l(Q){var M,S,P,R,T,U,N,V,O;d(f,function(W,X){d(W,function(Z,Y){if(j(Z)){Z=Z.elm;T=Z.parentNode;U=A(T,false);M=X;if(Q){return false}}});if(Q){return !M}});for(R=0;R<f[0].length;R++){if(!f[M][R]){continue}S=f[M][R].elm;if(S!=P){if(!Q){O=h(S,"rowspan");if(O>1){s(S,"rowspan",O+1);continue}}else{if(M>0&&f[M-1][R]){V=f[M-1][R].elm;O=h(V,"rowspan");if(O>1){s(V,"rowspan",O+1);continue}}}N=e(S);s(N,"colspan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function g(N){var O,M;d(f,function(P,Q){d(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});d(f,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=h(P,"colspan");Q=h(P,"rowspan");if(R==1){if(!N){G.insertAfter(e(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(e(P),P);u(O,T,Q-1,R)}}else{s(P,"colspan",P.colSpan+1)}M=P}})}function n(){var M=[];d(f,function(N,O){d(N,function(Q,P){if(j(Q)&&c.inArray(M,P)===-1){d(f,function(T){var R=T[P].elm,S;S=h(R,"colspan");if(S>1){s(R,"colspan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");d(Q.cells,function(S){var T=h(S,"rowspan");if(T>1){s(S,"rowspan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);d(f[R.y],function(S){var T;S=S.elm;if(S!=O){T=h(S,"rowspan");if(T<=1){G.remove(S)}else{s(S,"rowspan",T-1)}O=S}})}N=k();d(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();d(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;d(f,function(S){var R;Q=0;d(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}d(O,function(T){var S=T.cells.length,R;for(i=0;i<S;i++){R=T.cells[i];s(R,"colspan",1);s(R,"rowspan",1)}for(i=S;i<Q;i++){T.appendChild(e(T.cells[S-1]))}for(i=Q;i<S;i++){G.remove(T.cells[i])}if(N){M.parentNode.insertBefore(T,M)}else{G.insertAfter(T,M)}})}function F(M){var N;d(f,function(O,P){d(O,function(R,Q){if(R.elm==M){N={x:Q,y:P};return false}});return !N});return N}function w(M){L=F(M)}function I(){var O,N,M;N=M=0;d(f,function(P,Q){d(P,function(S,R){var U,T;if(j(S)){S=f[Q][R];if(R>N){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=f[y][P];if(!S.real){if(P-(S.colspan-1)<P){P-=S.colspan-1}}}for(x=P;x<=N;x++){S=f[O][x];if(!S.real){if(O-(S.rowspan-1)<O){O-=S.rowspan-1}}}for(y=O;y<=T;y++){for(x=P;x<=U;x++){S=f[y][x];if(S.real){Q=S.colspan-1;R=S.rowspan-1;if(Q){if(x+Q>N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(f[y][x]){G.addClass(f[y][x].elm,"mceSelected")}}}}}c.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:g,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}c.create("tinymce.plugins.TablePlugin",{init:function(f,g){var e,k;function j(n){var m=f.selection,l=f.dom.getParent(n||m.getNode(),"table");if(l){return new a(l,f.dom,m)}}function h(){f.getBody().style.webkitUserSelect="";f.dom.removeClass(f.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}d([["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(l){f.addButton(l[0],{title:l[1],cmd:l[2],ui:l[3]})});if(!c.isIE){f.onClick.add(function(l,m){m=m.target;if(m.nodeName==="TABLE"){l.selection.select(m);l.nodeChanged()}})}f.onPreProcess.add(function(m,n){var l,o,p,r=m.dom,q;l=r.select("table",n.node);o=l.length;while(o--){p=l[o];r.setAttrib(p,"data-mce-style","");if((q=r.getAttrib(p,"width"))){r.setStyle(p,"width",q);r.setAttrib(p,"width","")}if((q=r.getAttrib(p,"height"))){r.setStyle(p,"height",q);r.setAttrib(p,"height","")}}});f.onNodeChange.add(function(m,l,q){var o;q=m.selection.getStart();o=m.dom.getParent(q,"td,th,caption");l.setActive("table",q.nodeName==="TABLE"||!!o);if(o&&o.nodeName==="CAPTION"){o=0}l.setDisabled("delete_table",!o);l.setDisabled("delete_col",!o);l.setDisabled("delete_table",!o);l.setDisabled("delete_row",!o);l.setDisabled("col_after",!o);l.setDisabled("col_before",!o);l.setDisabled("row_after",!o);l.setDisabled("row_before",!o);l.setDisabled("row_props",!o);l.setDisabled("cell_props",!o);l.setDisabled("split_cells",!o);l.setDisabled("merge_cells",!o)});f.onInit.add(function(m){var l,p,q=m.dom,n;e=m.windowManager;m.onMouseDown.add(function(r,s){if(s.button!=2){h();p=q.getParent(s.target,"td,th");l=q.getParent(p,"table")}});q.bind(m.getDoc(),"mouseover",function(u){var s,r,t=u.target;if(p&&(n||t!=p)&&(t.nodeName=="TD"||t.nodeName=="TH")){r=q.getParent(t,"table");if(r==l){if(!n){n=j(r);n.setStartCell(p);m.getBody().style.webkitUserSelect="none"}n.setEndCell(t)}s=m.selection.getSel();if(s.removeAllRanges){s.removeAllRanges()}else{s.empty()}u.preventDefault()}});m.onMouseUp.add(function(A,B){var s,u=A.selection,C,D=u.getSel(),r,v,t,z;if(p){if(n){A.getBody().style.webkitUserSelect=""}function w(E,G){var F=new c.dom.TreeWalker(E,E);do{if(E.nodeType==3&&c.trim(E.nodeValue).length!=0){if(G){s.setStart(E,0)}else{s.setEnd(E,E.nodeValue.length)}return}if(E.nodeName=="BR"){if(G){s.setStartBefore(E)}else{s.setEndBefore(E)}return}}while(E=(G?F.next():F.prev()))}C=q.select("td.mceSelected,th.mceSelected");if(C.length>0){s=q.createRng();v=C[0];z=C[C.length-1];w(v,1);r=new c.dom.TreeWalker(v,q.getParent(C[0],"table"));do{if(v.nodeName=="TD"||v.nodeName=="TH"){if(!q.hasClass(v,"mceSelected")){break}t=v}}while(v=r.next());w(t);u.setRng(s)}A.nodeChanged();p=n=l=null}});m.onKeyUp.add(function(r,s){h()});if(m&&m.plugins.contextmenu){m.plugins.contextmenu.onContextMenu.add(function(t,r,v){var w,u=m.selection,s=u.getNode()||m.getBody();if(m.dom.getParent(v,"td")||m.dom.getParent(v,"th")||m.dom.select("td.mceSelected,th.mceSelected").length){r.removeAll();if(s.nodeName=="A"&&!m.dom.getAttrib(s,"name")){r.add({title:"advanced.link_desc",icon:"link",cmd:m.plugins.advlink?"mceAdvLink":"mceLink",ui:true});r.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});r.addSeparator()}if(s.nodeName=="IMG"&&s.className.indexOf("mceItem")==-1){r.add({title:"advanced.image_desc",icon:"image",cmd:m.plugins.advimage?"mceAdvImage":"mceImage",ui:true});r.addSeparator()}r.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});r.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});r.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});r.addSeparator();w=r.addMenu({title:"table.cell"});w.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});w.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});w.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});w=r.addMenu({title:"table.row"});w.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});w.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});w.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});w.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});w.addSeparator();w.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});w.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});w.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!k);w.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!k);w=r.addMenu({title:"table.col"});w.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});w.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});w.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{r.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!c.isIE){function o(){var r;for(r=m.getBody().lastChild;r&&r.nodeType==3&&!r.nodeValue.length;r=r.previousSibling){}if(r&&r.nodeName=="TABLE"){m.dom.add(m.getBody(),"p",null,'<br mce_bogus="1" />')}}if(c.isGecko){m.onKeyDown.add(function(s,u){var r,t,v=s.dom;if(u.keyCode==37||u.keyCode==38){r=s.selection.getRng();t=v.getParent(r.startContainer,"table");if(t&&s.getBody().firstChild==t){if(b(r,t)){r=v.createRng();r.setStartBefore(t);r.setEndBefore(t);s.selection.setRng(r);u.preventDefault()}}}})}m.onKeyUp.add(o);m.onSetContent.add(o);m.onVisualAid.add(o);m.onPreProcess.add(function(r,t){var s=t.node.lastChild;if(s&&s.childNodes.length==1&&s.firstChild.nodeName=="BR"){r.dom.remove(s)}});o()}});d({mceTableSplitCells:function(l){l.split()},mceTableMergeCells:function(m){var n,o,l;l=f.dom.getParent(f.selection.getNode(),"th,td");if(l){n=l.rowSpan;o=l.colSpan}if(!f.dom.select("td.mceSelected,th.mceSelected").length){e.open({url:g+"/merge_cells.htm",width:240+parseInt(f.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(f.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:n,cols:o,onaction:function(p){m.merge(l,p.cols,p.rows)},plugin_url:g})}else{m.merge()}},mceTableInsertRowBefore:function(l){l.insertRow(true)},mceTableInsertRowAfter:function(l){l.insertRow()},mceTableInsertColBefore:function(l){l.insertCol(true)},mceTableInsertColAfter:function(l){l.insertCol()},mceTableDeleteCol:function(l){l.deleteCols()},mceTableDeleteRow:function(l){l.deleteRows()},mceTableCutRow:function(l){k=l.cutRows()},mceTableCopyRow:function(l){k=l.copyRows()},mceTablePasteRowBefore:function(l){l.pasteRows(k,true)},mceTablePasteRowAfter:function(l){l.pasteRows(k)},mceTableDelete:function(l){l.deleteTable()}},function(m,l){f.addCommand(l,function(){var n=j();if(n){m(n);f.execCommand("mceRepaint");h()}})});d({mceInsertTable:function(l){e.open({url:g+"/table.htm",width:400+parseInt(f.getLang("table.table_delta_width",0)),height:320+parseInt(f.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:l?l.action:0})},mceTableRowProps:function(){e.open({url:g+"/row.htm",width:400+parseInt(f.getLang("table.rowprops_delta_width",0)),height:295+parseInt(f.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})},mceTableCellProps:function(){e.open({url:g+"/cell.htm",width:400+parseInt(f.getLang("table.cellprops_delta_width",0)),height:295+parseInt(f.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}},function(m,l){f.addCommand(l,function(n,o){m(o)})})}});c.PluginManager.add("table",c.plugins.TablePlugin)})(tinymce);
\ No newline at end of file
+(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T<Q+U;T++){if(!g[T]){g[T]=[]}for(S=R;S<R+V;S++){g[T][S]={part:N,real:T==Q&&S==R,elm:W,rowspan:U,colspan:V}}}})});M+=O.length})}function z(M,O){var N;N=g[O];if(N){return N[M]}}function s(O,M,N){if(O){N=parseInt(N);if(N===1){O.removeAttribute(M,1)}else{O.setAttribute(M,N,1)}}}function j(M){return M&&(G.hasClass(M.elm,"mceSelected")||M==o)}function k(){var M=[];e(H.rows,function(N){e(N.cells,function(O){if(G.hasClass(O,"mceSelected")||O==o.elm){M.push(N);return false}})});return M}function r(){var M=G.createRng();M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H)}function f(M){var N;d.walk(M,function(P){var O;if(P.nodeType==3){e(G.getParents(P.parentNode,null,M).reverse(),function(Q){Q=A(Q,false);if(!N){N=O=Q}else{if(O){O.appendChild(Q)}}O=Q});if(O){O.innerHTML=d.isIE?"&nbsp;":'<br data-mce-bogus="1" />'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE){M.innerHTML='<br data-mce-bogus="1" />'}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q<S-1;Q++){G.insertAfter(f(P),P)}u(O,N,R-1,S)}}})})}function p(V,S,Y){var P,O,X,W,U,R,T,M,V,N,Q;if(V){pos=F(V);P=pos.x;O=pos.y;X=P+(S-1);W=O+(Y-1)}else{P=L.x;O=L.y;X=D.x;W=D.y}T=z(P,O);M=z(X,W);if(T&&M&&T.part==M.part){C();t();T=z(P,O).elm;s(T,"colSpan",(X-P)+1);s(T,"rowSpan",(W-O)+1);for(R=O;R<=W;R++){for(U=P;U<=X;U++){if(!g[R]||!g[R][U]){continue}V=g[R][U].elm;if(V!=T){N=d.grep(V.childNodes);e(N,function(Z){T.appendChild(Z)});if(N.length){N=d.grep(T.childNodes);Q=0;e(N,function(Z){if(Z.nodeName=="BR"&&G.getAttrib(Z,"data-mce-bogus")&&Q++<N.length-1){T.removeChild(Z)}})}G.remove(V)}}}q()}}function l(Q){var M,S,P,R,T,U,N,V,O;e(g,function(W,X){e(W,function(Z,Y){if(j(Z)){Z=Z.elm;T=Z.parentNode;U=A(T,false);M=X;if(Q){return false}}});if(Q){return !M}});for(R=0;R<g[0].length;R++){if(!g[M][R]){continue}S=g[M][R].elm;if(S!=P){if(!Q){O=a(S,"rowspan");if(O>1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;i<S;i++){R=T.cells[i];s(R,"colSpan",1);s(R,"rowSpan",1)}for(i=S;i<Q;i++){T.appendChild(f(T.cells[S-1]))}for(i=Q;i<S;i++){G.remove(T.cells[i])}if(N){M.parentNode.insertBefore(T,M)}else{G.insertAfter(T,M)}})}function F(M){var N;e(g,function(O,P){e(O,function(R,Q){if(R.elm==M){N={x:Q,y:P};return false}});return !N});return N}function w(M){L=F(M)}function I(){var O,N,M;N=M=0;e(g,function(P,Q){e(P,function(S,R){var U,T;if(j(S)){S=g[Q][R];if(R>N){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)<P){P-=S.colspan-1}}}for(x=P;x<=N;x++){S=g[O][x];if(!S.real){if(O-(S.rowspan-1)<O){O-=S.rowspan-1}}}for(y=O;y<=T;y++){for(x=P;x<=U;x++){S=g[y][x];if(S.real){Q=S.colspan-1;R=S.rowspan-1;if(Q){if(x+Q>N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(g[y][x]){G.addClass(g[y][x].elm,"mceSelected")}}}}}d.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:h,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}d.create("tinymce.plugins.TablePlugin",{init:function(g,h){var f,m,j=true;function l(p){var o=g.selection,n=g.dom.getParent(p||o.getNode(),"table");if(n){return new b(n,g.dom,o)}}function k(){g.getBody().style.webkitUserSelect="";if(j){g.dom.removeClass(g.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");j=false}}e([["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(n){g.addButton(n[0],{title:n[1],cmd:n[2],ui:n[3]})});if(!d.isIE){g.onClick.add(function(n,o){o=o.target;if(o.nodeName==="TABLE"){n.selection.select(o);n.nodeChanged()}})}g.onPreProcess.add(function(o,p){var n,q,r,t=o.dom,s;n=t.select("table",p.node);q=n.length;while(q--){r=n[q];t.setAttrib(r,"data-mce-style","");if((s=t.getAttrib(r,"width"))){t.setStyle(r,"width",s);t.setAttrib(r,"width","")}if((s=t.getAttrib(r,"height"))){t.setStyle(r,"height",s);t.setAttrib(r,"height","")}}});g.onNodeChange.add(function(q,o,s){var r;s=q.selection.getStart();r=q.dom.getParent(s,"td,th,caption");o.setActive("table",s.nodeName==="TABLE"||!!r);if(r&&r.nodeName==="CAPTION"){r=0}o.setDisabled("delete_table",!r);o.setDisabled("delete_col",!r);o.setDisabled("delete_table",!r);o.setDisabled("delete_row",!r);o.setDisabled("col_after",!r);o.setDisabled("col_before",!r);o.setDisabled("row_after",!r);o.setDisabled("row_before",!r);o.setDisabled("row_props",!r);o.setDisabled("cell_props",!r);o.setDisabled("split_cells",!r);o.setDisabled("merge_cells",!r)});g.onInit.add(function(r){var p,t,q=r.dom,u;f=r.windowManager;r.onMouseDown.add(function(w,z){if(z.button!=2){k();t=q.getParent(z.target,"td,th");p=q.getParent(t,"table")}});q.bind(r.getDoc(),"mouseover",function(C){var A,z,B=C.target;if(t&&(u||B!=t)&&(B.nodeName=="TD"||B.nodeName=="TH")){z=q.getParent(B,"table");if(z==p){if(!u){u=l(z);u.setStartCell(t);r.getBody().style.webkitUserSelect="none"}u.setEndCell(B);j=true}A=r.selection.getSel();try{if(A.removeAllRanges){A.removeAllRanges()}else{A.empty()}}catch(w){}C.preventDefault()}});r.onMouseUp.add(function(F,G){var z,B=F.selection,H,I=B.getSel(),w,C,A,E;if(t){if(u){F.getBody().style.webkitUserSelect=""}function D(J,L){var K=new d.dom.TreeWalker(J,J);do{if(J.nodeType==3&&d.trim(J.nodeValue).length!=0){if(L){z.setStart(J,0)}else{z.setEnd(J,J.nodeValue.length)}return}if(J.nodeName=="BR"){if(L){z.setStartBefore(J)}else{z.setEndBefore(J)}return}}while(J=(L?K.next():K.prev()))}H=q.select("td.mceSelected,th.mceSelected");if(H.length>0){z=q.createRng();C=H[0];E=H[H.length-1];z.setStartBefore(C);z.setEndAfter(C);D(C,1);w=new d.dom.TreeWalker(C,q.getParent(H[0],"table"));do{if(C.nodeName=="TD"||C.nodeName=="TH"){if(!q.hasClass(C,"mceSelected")){break}A=C}}while(C=w.next());D(A);B.setRng(z)}F.nodeChanged();t=u=p=null}});r.onKeyUp.add(function(w,z){k()});r.onKeyDown.add(function(w,z){n(w)});r.onMouseDown.add(function(w,z){if(z.button!=2){n(w)}});function o(D,z,A,F){var B=3,G=D.dom.getParent(z.startContainer,"TABLE"),C,w,E;if(G){C=G.parentNode}w=z.startContainer.nodeType==B&&z.startOffset==0&&z.endOffset==0&&F&&(A.nodeName=="TR"||A==C);E=(A.nodeName=="TD"||A.nodeName=="TH")&&!F;return w||E}function n(A){if(!d.isWebKit){return}var z=A.selection.getRng();var C=A.selection.getNode();var B=A.dom.getParent(z.startContainer,"TD,TH");if(!o(A,z,C,B)){return}if(!B){B=C}var w=B.lastChild;while(w.lastChild){w=w.lastChild}z.setEnd(w,w.nodeValue.length);A.selection.setRng(z)}r.plugins.table.fixTableCellSelection=n;if(r&&r.plugins.contextmenu){r.plugins.contextmenu.onContextMenu.add(function(A,w,C){var D,B=r.selection,z=B.getNode()||r.getBody();if(r.dom.getParent(C,"td")||r.dom.getParent(C,"th")||r.dom.select("td.mceSelected,th.mceSelected").length){w.removeAll();if(z.nodeName=="A"&&!r.dom.getAttrib(z,"name")){w.add({title:"advanced.link_desc",icon:"link",cmd:r.plugins.advlink?"mceAdvLink":"mceLink",ui:true});w.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});w.addSeparator()}if(z.nodeName=="IMG"&&z.className.indexOf("mceItem")==-1){w.add({title:"advanced.image_desc",icon:"image",cmd:r.plugins.advimage?"mceAdvImage":"mceImage",ui:true});w.addSeparator()}w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});w.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});w.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});w.addSeparator();D=w.addMenu({title:"table.cell"});D.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});D.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});D.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});D=w.addMenu({title:"table.row"});D.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});D.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});D.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});D.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});D.addSeparator();D.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});D.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});D.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!m);D.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!m);D=w.addMenu({title:"table.col"});D.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});D.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});D.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(d.isWebKit){function v(C,N){var L=d.VK;var Q=N.keyCode;function O(Y,U,S){var T=Y?"previousSibling":"nextSibling";var Z=C.dom.getParent(U,"tr");var X=Z[T];if(X){z(C,U,X,Y);d.dom.Event.cancel(S);return true}else{var aa=C.dom.getParent(Z,"table");var W=Z.parentNode;var R=W.nodeName.toLowerCase();if(R==="tbody"||R===(Y?"tfoot":"thead")){var V=w(Y,aa,W,"tbody");if(V!==null){return K(Y,V,U,S)}}return M(Y,Z,T,aa,S)}}function w(V,T,U,X){var S=C.dom.select(">"+X,T);var R=S.indexOf(U);if(V&&R===0||!V&&R===S.length-1){return B(V,T)}else{if(R===-1){var W=U.tagName.toLowerCase()==="thead"?0:S.length-1;return S[W]}else{return S[R+(V?-1:1)]}}}function B(U,T){var S=U?"thead":"tfoot";var R=C.dom.select(">"+S,T);return R.length!==0?R[0]:null}function K(V,T,S,U){var R=J(T,V);R&&z(C,S,R,V);d.dom.Event.cancel(U);return true}function M(Y,U,R,X,W){var S=X[R];if(S){F(S);return true}else{var V=C.dom.getParent(X,"td,th");if(V){return O(Y,V,W)}else{var T=J(U,!Y);F(T);return d.dom.Event.cancel(W)}}}function J(S,R){return S&&S[R?"lastChild":"firstChild"]}function F(R){C.selection.setCursorLocation(R,0)}function A(){return Q==L.UP||Q==L.DOWN}function D(R){var T=R.selection.getNode();var S=R.dom.getParent(T,"tr");return S!==null}function P(S){var R=0;var T=S;while(T.previousSibling){T=T.previousSibling;R=R+a(T,"colspan")}return R}function E(T,R){var U=0;var S=0;e(T.children,function(V,W){U=U+a(V,"colspan");S=W;if(U>R){return false}});return S}function z(T,W,Y,V){var X=P(T.dom.getParent(W,"td,th"));var S=E(Y,X);var R=Y.childNodes[S];var U=J(R,V);F(U||R)}function H(R){var T=C.selection.getNode();var U=C.dom.getParent(T,"td,th");var S=C.dom.getParent(R,"td,th");return U&&U!==S&&I(U,S)}function I(S,R){return C.dom.getParent(S,"TABLE")===C.dom.getParent(R,"TABLE")}if(A()&&D(C)){var G=C.selection.getNode();setTimeout(function(){if(H(G)){O(!N.shiftKey&&Q===L.UP,G,N)}},0)}}r.onKeyDown.add(v)}if(!d.isIE){function s(){var w;for(w=r.getBody().lastChild;w&&w.nodeType==3&&!w.nodeValue.length;w=w.previousSibling){}if(w&&w.nodeName=="TABLE"){r.dom.add(r.getBody(),"p",null,'<br mce_bogus="1" />')}}if(d.isGecko){r.onKeyDown.add(function(z,B){var w,A,C=z.dom;if(B.keyCode==37||B.keyCode==38){w=z.selection.getRng();A=C.getParent(w.startContainer,"table");if(A&&z.getBody().firstChild==A){if(c(w,A)){w=C.createRng();w.setStartBefore(A);w.setEndBefore(A);z.selection.setRng(w);B.preventDefault()}}}})}r.onKeyUp.add(s);r.onSetContent.add(s);r.onVisualAid.add(s);r.onPreProcess.add(function(w,A){var z=A.node.lastChild;if(z&&z.childNodes.length==1&&z.firstChild.nodeName=="BR"){w.dom.remove(z)}});s();r.startContent=r.getContent({format:"raw"})}});e({mceTableSplitCells:function(n){n.split()},mceTableMergeCells:function(o){var p,q,n;n=g.dom.getParent(g.selection.getNode(),"th,td");if(n){p=n.rowSpan;q=n.colSpan}if(!g.dom.select("td.mceSelected,th.mceSelected").length){f.open({url:h+"/merge_cells.htm",width:240+parseInt(g.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(g.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:p,cols:q,onaction:function(r){o.merge(n,r.cols,r.rows)},plugin_url:h})}else{o.merge()}},mceTableInsertRowBefore:function(n){n.insertRow(true)},mceTableInsertRowAfter:function(n){n.insertRow()},mceTableInsertColBefore:function(n){n.insertCol(true)},mceTableInsertColAfter:function(n){n.insertCol()},mceTableDeleteCol:function(n){n.deleteCols()},mceTableDeleteRow:function(n){n.deleteRows()},mceTableCutRow:function(n){m=n.cutRows()},mceTableCopyRow:function(n){m=n.copyRows()},mceTablePasteRowBefore:function(n){n.pasteRows(m,true)},mceTablePasteRowAfter:function(n){n.pasteRows(m)},mceTableDelete:function(n){n.deleteTable()}},function(o,n){g.addCommand(n,function(){var p=l();if(p){o(p);g.execCommand("mceRepaint");k()}})});e({mceInsertTable:function(n){f.open({url:h+"/table.htm",width:400+parseInt(g.getLang("table.table_delta_width",0)),height:320+parseInt(g.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:n?n.action:0})},mceTableRowProps:function(){f.open({url:h+"/row.htm",width:400+parseInt(g.getLang("table.rowprops_delta_width",0)),height:295+parseInt(g.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})},mceTableCellProps:function(){f.open({url:h+"/cell.htm",width:400+parseInt(g.getLang("table.cellprops_delta_width",0)),height:295+parseInt(g.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}},function(o,n){g.addCommand(n,function(p,q){o(q)})})}});d.PluginManager.add("table",d.plugins.TablePlugin)})(tinymce);
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js	2012-10-30 15:40:38.367444443 +0000
@@ -1,1198 +1,1408 @@
-/**
- * editor_plugin_src.js
- *
- * Copyright 2009, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://tinymce.moxiecode.com/license
- * Contributing: http://tinymce.moxiecode.com/contributing
- */
-
-(function(tinymce) {
-	var each = tinymce.each;
-
-	// Checks if the selection/caret is at the start of the specified block element
-	function isAtStart(rng, par) {
-		var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
-
-		rng2.setStartBefore(par);
-		rng2.setEnd(rng.endContainer, rng.endOffset);
-
-		elm = doc.createElement('body');
-		elm.appendChild(rng2.cloneContents());
-
-		// Check for text characters of other elements that should be treated as content
-		return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
-	};
-
-	/**
-	 * Table Grid class.
-	 */
-	function TableGrid(table, dom, selection) {
-		var grid, startPos, endPos, selectedCell;
-
-		buildGrid();
-		selectedCell = dom.getParent(selection.getStart(), 'th,td');
-		if (selectedCell) {
-			startPos = getPos(selectedCell);
-			endPos = findEndPos();
-			selectedCell = getCell(startPos.x, startPos.y);
-		}
-
-		function cloneNode(node, children) {
-			node = node.cloneNode(children);
-			node.removeAttribute('id');
-
-			return node;
-		}
-
-		function buildGrid() {
-			var startY = 0;
-
-			grid = [];
-
-			each(['thead', 'tbody', 'tfoot'], function(part) {
-				var rows = dom.select('> ' + part + ' tr', table);
-
-				each(rows, function(tr, y) {
-					y += startY;
-
-					each(dom.select('> td, > th', tr), function(td, x) {
-						var x2, y2, rowspan, colspan;
-
-						// Skip over existing cells produced by rowspan
-						if (grid[y]) {
-							while (grid[y][x])
-								x++;
-						}
-
-						// Get col/rowspan from cell
-						rowspan = getSpanVal(td, 'rowspan');
-						colspan = getSpanVal(td, 'colspan');
-
-						// Fill out rowspan/colspan right and down
-						for (y2 = y; y2 < y + rowspan; y2++) {
-							if (!grid[y2])
-								grid[y2] = [];
-
-							for (x2 = x; x2 < x + colspan; x2++) {
-								grid[y2][x2] = {
-									part : part,
-									real : y2 == y && x2 == x,
-									elm : td,
-									rowspan : rowspan,
-									colspan : colspan
-								};
-							}
-						}
-					});
-				});
-
-				startY += rows.length;
-			});
-		};
-
-		function getCell(x, y) {
-			var row;
-
-			row = grid[y];
-			if (row)
-				return row[x];
-		};
-
-		function getSpanVal(td, name) {
-			return parseInt(td.getAttribute(name) || 1);
-		};
-
-		function setSpanVal(td, name, val) {
-			if (td) {
-				val = parseInt(val);
-
-				if (val === 1)
-					td.removeAttribute(name, 1);
-				else
-					td.setAttribute(name, val, 1);
-			}
-		}
-
-		function isCellSelected(cell) {
-			return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
-		};
-
-		function getSelectedRows() {
-			var rows = [];
-
-			each(table.rows, function(row) {
-				each(row.cells, function(cell) {
-					if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
-						rows.push(row);
-						return false;
-					}
-				});
-			});
-
-			return rows;
-		};
-
-		function deleteTable() {
-			var rng = dom.createRng();
-
-			rng.setStartAfter(table);
-			rng.setEndAfter(table);
-
-			selection.setRng(rng);
-
-			dom.remove(table);
-		};
-
-		function cloneCell(cell) {
-			var formatNode;
-
-			// Clone formats
-			tinymce.walk(cell, function(node) {
-				var curNode;
-
-				if (node.nodeType == 3) {
-					each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
-						node = cloneNode(node, false);
-
-						if (!formatNode)
-							formatNode = curNode = node;
-						else if (curNode)
-							curNode.appendChild(node);
-
-						curNode = node;
-					});
-
-					// Add something to the inner node
-					if (curNode)
-						curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br data-mce-bogus="1" />';
-
-					return false;
-				}
-			}, 'childNodes');
-
-			cell = cloneNode(cell, false);
-			setSpanVal(cell, 'rowspan', 1);
-			setSpanVal(cell, 'colspan', 1);
-
-			if (formatNode) {
-				cell.appendChild(formatNode);
-			} else {
-				if (!tinymce.isIE)
-					cell.innerHTML = '<br data-mce-bogus="1" />';
-			}
-
-			return cell;
-		};
-
-		function cleanup() {
-			var rng = dom.createRng();
-
-			// Empty rows
-			each(dom.select('tr', table), function(tr) {
-				if (tr.cells.length == 0)
-					dom.remove(tr);
-			});
-
-			// Empty table
-			if (dom.select('tr', table).length == 0) {
-				rng.setStartAfter(table);
-				rng.setEndAfter(table);
-				selection.setRng(rng);
-				dom.remove(table);
-				return;
-			}
-
-			// Empty header/body/footer
-			each(dom.select('thead,tbody,tfoot', table), function(part) {
-				if (part.rows.length == 0)
-					dom.remove(part);
-			});
-
-			// Restore selection to start position if it still exists
-			buildGrid();
-
-			// Restore the selection to the closest table position
-			row = grid[Math.min(grid.length - 1, startPos.y)];
-			if (row) {
-				selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
-				selection.collapse(true);
-			}
-		};
-
-		function fillLeftDown(x, y, rows, cols) {
-			var tr, x2, r, c, cell;
-
-			tr = grid[y][x].elm.parentNode;
-			for (r = 1; r <= rows; r++) {
-				tr = dom.getNext(tr, 'tr');
-
-				if (tr) {
-					// Loop left to find real cell
-					for (x2 = x; x2 >= 0; x2--) {
-						cell = grid[y + r][x2].elm;
-
-						if (cell.parentNode == tr) {
-							// Append clones after
-							for (c = 1; c <= cols; c++)
-								dom.insertAfter(cloneCell(cell), cell);
-
-							break;
-						}
-					}
-
-					if (x2 == -1) {
-						// Insert nodes before first cell
-						for (c = 1; c <= cols; c++)
-							tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
-					}
-				}
-			}
-		};
-
-		function split() {
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					var colSpan, rowSpan, newCell, i;
-
-					if (isCellSelected(cell)) {
-						cell = cell.elm;
-						colSpan = getSpanVal(cell, 'colspan');
-						rowSpan = getSpanVal(cell, 'rowspan');
-
-						if (colSpan > 1 || rowSpan > 1) {
-							setSpanVal(cell, 'rowspan', 1);
-							setSpanVal(cell, 'colspan', 1);
-
-							// Insert cells right
-							for (i = 0; i < colSpan - 1; i++)
-								dom.insertAfter(cloneCell(cell), cell);
-
-							fillLeftDown(x, y, rowSpan - 1, colSpan);
-						}
-					}
-				});
-			});
-		};
-
-		function merge(cell, cols, rows) {
-			var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
-
-			// Use specified cell and cols/rows
-			if (cell) {
-				pos = getPos(cell);
-				startX = pos.x;
-				startY = pos.y;
-				endX = startX + (cols - 1);
-				endY = startY + (rows - 1);
-			} else {
-				// Use selection
-				startX = startPos.x;
-				startY = startPos.y;
-				endX = endPos.x;
-				endY = endPos.y;
-			}
-
-			// Find start/end cells
-			startCell = getCell(startX, startY);
-			endCell = getCell(endX, endY);
-
-			// Check if the cells exists and if they are of the same part for example tbody = tbody
-			if (startCell && endCell && startCell.part == endCell.part) {
-				// Split and rebuild grid
-				split();
-				buildGrid();
-
-				// Set row/col span to start cell
-				startCell = getCell(startX, startY).elm;
-				setSpanVal(startCell, 'colspan', (endX - startX) + 1);
-				setSpanVal(startCell, 'rowspan', (endY - startY) + 1);
-
-				// Remove other cells and add it's contents to the start cell
-				for (y = startY; y <= endY; y++) {
-					for (x = startX; x <= endX; x++) {
-						if (!grid[y] || !grid[y][x])
-							continue;
-
-						cell = grid[y][x].elm;
-
-						if (cell != startCell) {
-							// Move children to startCell
-							children = tinymce.grep(cell.childNodes);
-							each(children, function(node) {
-								startCell.appendChild(node);
-							});
-
-							// Remove bogus nodes if there is children in the target cell
-							if (children.length) {
-								children = tinymce.grep(startCell.childNodes);
-								count = 0;
-								each(children, function(node) {
-									if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
-										startCell.removeChild(node);
-								});
-							}
-							
-							// Remove cell
-							dom.remove(cell);
-						}
-					}
-				}
-
-				// Remove empty rows etc and restore caret location
-				cleanup();
-			}
-		};
-
-		function insertRow(before) {
-			var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
-
-			// Find first/last row
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					if (isCellSelected(cell)) {
-						cell = cell.elm;
-						rowElm = cell.parentNode;
-						newRow = cloneNode(rowElm, false);
-						posY = y;
-
-						if (before)
-							return false;
-					}
-				});
-
-				if (before)
-					return !posY;
-			});
-
-			for (x = 0; x < grid[0].length; x++) {
-				// Cell not found could be because of an invalid table structure
-				if (!grid[posY][x])
-					continue;
-
-				cell = grid[posY][x].elm;
-
-				if (cell != lastCell) {
-					if (!before) {
-						rowSpan = getSpanVal(cell, 'rowspan');
-						if (rowSpan > 1) {
-							setSpanVal(cell, 'rowspan', rowSpan + 1);
-							continue;
-						}
-					} else {
-						// Check if cell above can be expanded
-						if (posY > 0 && grid[posY - 1][x]) {
-							otherCell = grid[posY - 1][x].elm;
-							rowSpan = getSpanVal(otherCell, 'rowspan');
-							if (rowSpan > 1) {
-								setSpanVal(otherCell, 'rowspan', rowSpan + 1);
-								continue;
-							}
-						}
-					}
-
-					// Insert new cell into new row
-					newCell = cloneCell(cell);
-					setSpanVal(newCell, 'colspan', cell.colSpan);
-
-					newRow.appendChild(newCell);
-
-					lastCell = cell;
-				}
-			}
-
-			if (newRow.hasChildNodes()) {
-				if (!before)
-					dom.insertAfter(newRow, rowElm);
-				else
-					rowElm.parentNode.insertBefore(newRow, rowElm);
-			}
-		};
-
-		function insertCol(before) {
-			var posX, lastCell;
-
-			// Find first/last column
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					if (isCellSelected(cell)) {
-						posX = x;
-
-						if (before)
-							return false;
-					}
-				});
-
-				if (before)
-					return !posX;
-			});
-
-			each(grid, function(row, y) {
-				var cell, rowSpan, colSpan;
-
-				if (!row[posX])
-					return;
-
-				cell = row[posX].elm;
-				if (cell != lastCell) {
-					colSpan = getSpanVal(cell, 'colspan');
-					rowSpan = getSpanVal(cell, 'rowspan');
-
-					if (colSpan == 1) {
-						if (!before) {
-							dom.insertAfter(cloneCell(cell), cell);
-							fillLeftDown(posX, y, rowSpan - 1, colSpan);
-						} else {
-							cell.parentNode.insertBefore(cloneCell(cell), cell);
-							fillLeftDown(posX, y, rowSpan - 1, colSpan);
-						}
-					} else
-						setSpanVal(cell, 'colspan', cell.colSpan + 1);
-
-					lastCell = cell;
-				}
-			});
-		};
-
-		function deleteCols() {
-			var cols = [];
-
-			// Get selected column indexes
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
-						each(grid, function(row) {
-							var cell = row[x].elm, colSpan;
-
-							colSpan = getSpanVal(cell, 'colspan');
-
-							if (colSpan > 1)
-								setSpanVal(cell, 'colspan', colSpan - 1);
-							else
-								dom.remove(cell);
-						});
-
-						cols.push(x);
-					}
-				});
-			});
-
-			cleanup();
-		};
-
-		function deleteRows() {
-			var rows;
-
-			function deleteRow(tr) {
-				var nextTr, pos, lastCell;
-
-				nextTr = dom.getNext(tr, 'tr');
-
-				// Move down row spanned cells
-				each(tr.cells, function(cell) {
-					var rowSpan = getSpanVal(cell, 'rowspan');
-
-					if (rowSpan > 1) {
-						setSpanVal(cell, 'rowspan', rowSpan - 1);
-						pos = getPos(cell);
-						fillLeftDown(pos.x, pos.y, 1, 1);
-					}
-				});
-
-				// Delete cells
-				pos = getPos(tr.cells[0]);
-				each(grid[pos.y], function(cell) {
-					var rowSpan;
-
-					cell = cell.elm;
-
-					if (cell != lastCell) {
-						rowSpan = getSpanVal(cell, 'rowspan');
-
-						if (rowSpan <= 1)
-							dom.remove(cell);
-						else
-							setSpanVal(cell, 'rowspan', rowSpan - 1);
-
-						lastCell = cell;
-					}
-				});
-			};
-
-			// Get selected rows and move selection out of scope
-			rows = getSelectedRows();
-
-			// Delete all selected rows
-			each(rows.reverse(), function(tr) {
-				deleteRow(tr);
-			});
-
-			cleanup();
-		};
-
-		function cutRows() {
-			var rows = getSelectedRows();
-
-			dom.remove(rows);
-			cleanup();
-
-			return rows;
-		};
-
-		function copyRows() {
-			var rows = getSelectedRows();
-
-			each(rows, function(row, i) {
-				rows[i] = cloneNode(row, true);
-			});
-
-			return rows;
-		};
-
-		function pasteRows(rows, before) {
-			var selectedRows = getSelectedRows(),
-				targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
-				targetCellCount = targetRow.cells.length;
-
-			// Calc target cell count
-			each(grid, function(row) {
-				var match;
-
-				targetCellCount = 0;
-				each(row, function(cell, x) {
-					if (cell.real)
-						targetCellCount += cell.colspan;
-
-					if (cell.elm.parentNode == targetRow)
-						match = 1;
-				});
-
-				if (match)
-					return false;
-			});
-
-			if (!before)
-				rows.reverse();
-
-			each(rows, function(row) {
-				var cellCount = row.cells.length, cell;
-
-				// Remove col/rowspans
-				for (i = 0; i < cellCount; i++) {
-					cell = row.cells[i];
-					setSpanVal(cell, 'colspan', 1);
-					setSpanVal(cell, 'rowspan', 1);
-				}
-
-				// Needs more cells
-				for (i = cellCount; i < targetCellCount; i++)
-					row.appendChild(cloneCell(row.cells[cellCount - 1]));
-
-				// Needs less cells
-				for (i = targetCellCount; i < cellCount; i++)
-					dom.remove(row.cells[i]);
-
-				// Add before/after
-				if (before)
-					targetRow.parentNode.insertBefore(row, targetRow);
-				else
-					dom.insertAfter(row, targetRow);
-			});
-		};
-
-		function getPos(target) {
-			var pos;
-
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					if (cell.elm == target) {
-						pos = {x : x, y : y};
-						return false;
-					}
-				});
-
-				return !pos;
-			});
-
-			return pos;
-		};
-
-		function setStartCell(cell) {
-			startPos = getPos(cell);
-		};
-
-		function findEndPos() {
-			var pos, maxX, maxY;
-
-			maxX = maxY = 0;
-
-			each(grid, function(row, y) {
-				each(row, function(cell, x) {
-					var colSpan, rowSpan;
-
-					if (isCellSelected(cell)) {
-						cell = grid[y][x];
-
-						if (x > maxX)
-							maxX = x;
-
-						if (y > maxY)
-							maxY = y;
-
-						if (cell.real) {
-							colSpan = cell.colspan - 1;
-							rowSpan = cell.rowspan - 1;
-
-							if (colSpan) {
-								if (x + colSpan > maxX)
-									maxX = x + colSpan;
-							}
-
-							if (rowSpan) {
-								if (y + rowSpan > maxY)
-									maxY = y + rowSpan;
-							}
-						}
-					}
-				});
-			});
-
-			return {x : maxX, y : maxY};
-		};
-
-		function setEndCell(cell) {
-			var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
-
-			endPos = getPos(cell);
-
-			if (startPos && endPos) {
-				// Get start/end positions
-				startX = Math.min(startPos.x, endPos.x);
-				startY = Math.min(startPos.y, endPos.y);
-				endX = Math.max(startPos.x, endPos.x);
-				endY = Math.max(startPos.y, endPos.y);
-
-				// Expand end positon to include spans
-				maxX = endX;
-				maxY = endY;
-
-				// Expand startX
-				for (y = startY; y <= maxY; y++) {
-					cell = grid[y][startX];
-
-					if (!cell.real) {
-						if (startX - (cell.colspan - 1) < startX)
-							startX -= cell.colspan - 1;
-					}
-				}
-
-				// Expand startY
-				for (x = startX; x <= maxX; x++) {
-					cell = grid[startY][x];
-
-					if (!cell.real) {
-						if (startY - (cell.rowspan - 1) < startY)
-							startY -= cell.rowspan - 1;
-					}
-				}
-
-				// Find max X, Y
-				for (y = startY; y <= endY; y++) {
-					for (x = startX; x <= endX; x++) {
-						cell = grid[y][x];
-
-						if (cell.real) {
-							colSpan = cell.colspan - 1;
-							rowSpan = cell.rowspan - 1;
-
-							if (colSpan) {
-								if (x + colSpan > maxX)
-									maxX = x + colSpan;
-							}
-
-							if (rowSpan) {
-								if (y + rowSpan > maxY)
-									maxY = y + rowSpan;
-							}
-						}
-					}
-				}
-
-				// Remove current selection
-				dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
-
-				// Add new selection
-				for (y = startY; y <= maxY; y++) {
-					for (x = startX; x <= maxX; x++) {
-						if (grid[y][x])
-							dom.addClass(grid[y][x].elm, 'mceSelected');
-					}
-				}
-			}
-		};
-
-		// Expose to public
-		tinymce.extend(this, {
-			deleteTable : deleteTable,
-			split : split,
-			merge : merge,
-			insertRow : insertRow,
-			insertCol : insertCol,
-			deleteCols : deleteCols,
-			deleteRows : deleteRows,
-			cutRows : cutRows,
-			copyRows : copyRows,
-			pasteRows : pasteRows,
-			getPos : getPos,
-			setStartCell : setStartCell,
-			setEndCell : setEndCell
-		});
-	};
-
-	tinymce.create('tinymce.plugins.TablePlugin', {
-		init : function(ed, url) {
-			var winMan, clipboardRows;
-
-			function createTableGrid(node) {
-				var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
-
-				if (tblElm)
-					return new TableGrid(tblElm, ed.dom, selection);
-			};
-
-			function cleanup() {
-				// Restore selection possibilities
-				ed.getBody().style.webkitUserSelect = '';
-				ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
-			};
-
-			// 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]});
-			});
-
-			// Select whole table is a table border is clicked
-			if (!tinymce.isIE) {
-				ed.onClick.add(function(ed, e) {
-					e = e.target;
-
-					if (e.nodeName === 'TABLE') {
-						ed.selection.select(e);
-						ed.nodeChanged();
-					}
-				});
-			}
-
-			ed.onPreProcess.add(function(ed, args) {
-				var nodes, i, node, dom = ed.dom, value;
-
-				nodes = dom.select('table', args.node);
-				i = nodes.length;
-				while (i--) {
-					node = nodes[i];
-					dom.setAttrib(node, 'data-mce-style', '');
-
-					if ((value = dom.getAttrib(node, 'width'))) {
-						dom.setStyle(node, 'width', value);
-						dom.setAttrib(node, 'width', '');
-					}
-
-					if ((value = dom.getAttrib(node, 'height'))) {
-						dom.setStyle(node, 'height', value);
-						dom.setAttrib(node, 'height', '');
-					}
-				}
-			});
-
-			// Handle node change updates
-			ed.onNodeChange.add(function(ed, cm, n) {
-				var p;
-
-				n = ed.selection.getStart();
-				p = ed.dom.getParent(n, 'td,th,caption');
-				cm.setActive('table', n.nodeName === 'TABLE' || !!p);
-
-				// Disable table tools if we are in caption
-				if (p && p.nodeName === 'CAPTION')
-					p = 0;
-
-				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);
-				cm.setDisabled('merge_cells', !p);
-			});
-
-			ed.onInit.add(function(ed) {
-				var startTable, startCell, dom = ed.dom, tableGrid;
-
-				winMan = ed.windowManager;
-
-				// Add cell selection logic
-				ed.onMouseDown.add(function(ed, e) {
-					if (e.button != 2) {
-						cleanup();
-
-						startCell = dom.getParent(e.target, 'td,th');
-						startTable = dom.getParent(startCell, 'table');
-					}
-				});
-
-				dom.bind(ed.getDoc(), 'mouseover', function(e) {
-					var sel, table, target = e.target;
-
-					if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
-						table = dom.getParent(target, 'table');
-						if (table == startTable) {
-							if (!tableGrid) {
-								tableGrid = createTableGrid(table);
-								tableGrid.setStartCell(startCell);
-
-								ed.getBody().style.webkitUserSelect = 'none';
-							}
-
-							tableGrid.setEndCell(target);
-						}
-
-						// Remove current selection
-						sel = ed.selection.getSel();
-
-						if (sel.removeAllRanges)
-							sel.removeAllRanges();
-						else
-							sel.empty();
-
-						e.preventDefault();
-					}
-				});
-
-				ed.onMouseUp.add(function(ed, e) {
-					var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
-
-					// Move selection to startCell
-					if (startCell) {
-						if (tableGrid)
-							ed.getBody().style.webkitUserSelect = '';
-
-						function setPoint(node, start) {
-							var walker = new tinymce.dom.TreeWalker(node, node);
-
-							do {
-								// Text node
-								if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
-									if (start)
-										rng.setStart(node, 0);
-									else
-										rng.setEnd(node, node.nodeValue.length);
-
-									return;
-								}
-
-								// BR element
-								if (node.nodeName == 'BR') {
-									if (start)
-										rng.setStartBefore(node);
-									else
-										rng.setEndBefore(node);
-
-									return;
-								}
-							} while (node = (start ? walker.next() : walker.prev()));
-						};
-
-						// Try to expand text selection as much as we can only Gecko supports cell selection
-						selectedCells = dom.select('td.mceSelected,th.mceSelected');
-						if (selectedCells.length > 0) {
-							rng = dom.createRng();
-							node = selectedCells[0];
-							endNode = selectedCells[selectedCells.length - 1];
-
-							setPoint(node, 1);
-							walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
-
-							do {
-								if (node.nodeName == 'TD' || node.nodeName == 'TH') {
-									if (!dom.hasClass(node, 'mceSelected'))
-										break;
-
-									lastNode = node;
-								}
-							} while (node = walker.next());
-
-							setPoint(lastNode);
-
-							sel.setRng(rng);
-						}
-
-						ed.nodeChanged();
-						startCell = tableGrid = startTable = null;
-					}
-				});
-
-				ed.onKeyUp.add(function(ed, e) {
-					cleanup();
-				});
-
-				// Add context menu
-				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') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
-							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', value : {action : 'insert'}});
-							m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
-							m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
-							m.addSeparator();
-
-							// Cell menu
-							sm = m.addMenu({title : 'table.cell'});
-							sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
-							sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
-							sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
-
-							// Row menu
-							sm = m.addMenu({title : 'table.row'});
-							sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
-							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'}).setDisabled(!clipboardRows);
-							sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
-
-							// 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'});
-					});
-				}
-
-				// Fixes an issue on Gecko where it's impossible to place the caret behind a table
-				// This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
-				if (!tinymce.isIE) {
-					function fixTableCaretPos() {
-						var last;
-
-						// Skip empty text nodes form the end
-						for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
-
-						if (last && last.nodeName == 'TABLE')
-							ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
-					};
-
-					// Fixes an bug where it's impossible to place the caret before a table in Gecko
-					// this fix solves it by detecting when the caret is at the beginning of such a table
-					// and then manually moves the caret infront of the table
-					if (tinymce.isGecko) {
-						ed.onKeyDown.add(function(ed, e) {
-							var rng, table, dom = ed.dom;
-
-							// On gecko it's not possible to place the caret before a table
-							if (e.keyCode == 37 || e.keyCode == 38) {
-								rng = ed.selection.getRng();
-								table = dom.getParent(rng.startContainer, 'table');
-
-								if (table && ed.getBody().firstChild == table) {
-									if (isAtStart(rng, table)) {
-										rng = dom.createRng();
-
-										rng.setStartBefore(table);
-										rng.setEndBefore(table);
-
-										ed.selection.setRng(rng);
-
-										e.preventDefault();
-									}
-								}
-							}
-						});
-					}
-
-					ed.onKeyUp.add(fixTableCaretPos);
-					ed.onSetContent.add(fixTableCaretPos);
-					ed.onVisualAid.add(fixTableCaretPos);
-
-					ed.onPreProcess.add(function(ed, o) {
-						var last = o.node.lastChild;
-
-						if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
-							ed.dom.remove(last);
-					});
-
-					fixTableCaretPos();
-				}
-			});
-
-			// Register action commands
-			each({
-				mceTableSplitCells : function(grid) {
-					grid.split();
-				},
-
-				mceTableMergeCells : function(grid) {
-					var rowSpan, colSpan, cell;
-
-					cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
-					if (cell) {
-						rowSpan = cell.rowSpan;
-						colSpan = cell.colSpan;
-					}
-
-					if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
-						winMan.open({
-							url : url + '/merge_cells.htm',
-							width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
-							height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
-							inline : 1
-						}, {
-							rows : rowSpan,
-							cols : colSpan,
-							onaction : function(data) {
-								grid.merge(cell, data.cols, data.rows);
-							},
-							plugin_url : url
-						});
-					} else
-						grid.merge();
-				},
-
-				mceTableInsertRowBefore : function(grid) {
-					grid.insertRow(true);
-				},
-
-				mceTableInsertRowAfter : function(grid) {
-					grid.insertRow();
-				},
-
-				mceTableInsertColBefore : function(grid) {
-					grid.insertCol(true);
-				},
-
-				mceTableInsertColAfter : function(grid) {
-					grid.insertCol();
-				},
-
-				mceTableDeleteCol : function(grid) {
-					grid.deleteCols();
-				},
-
-				mceTableDeleteRow : function(grid) {
-					grid.deleteRows();
-				},
-
-				mceTableCutRow : function(grid) {
-					clipboardRows = grid.cutRows();
-				},
-
-				mceTableCopyRow : function(grid) {
-					clipboardRows = grid.copyRows();
-				},
-
-				mceTablePasteRowBefore : function(grid) {
-					grid.pasteRows(clipboardRows, true);
-				},
-
-				mceTablePasteRowAfter : function(grid) {
-					grid.pasteRows(clipboardRows);
-				},
-
-				mceTableDelete : function(grid) {
-					grid.deleteTable();
-				}
-			}, function(func, name) {
-				ed.addCommand(name, function() {
-					var grid = createTableGrid();
-
-					if (grid) {
-						func(grid);
-						ed.execCommand('mceRepaint');
-						cleanup();
-					}
-				});
-			});
-
-			// Register dialog commands
-			each({
-				mceInsertTable : function(val) {
-					winMan.open({
-						url : url + '/table.htm',
-						width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
-						height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
-						inline : 1
-					}, {
-						plugin_url : url,
-						action : val ? val.action : 0
-					});
-				},
-
-				mceTableRowProps : function() {
-					winMan.open({
-						url : url + '/row.htm',
-						width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
-						height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
-						inline : 1
-					}, {
-						plugin_url : url
-					});
-				},
-
-				mceTableCellProps : function() {
-					winMan.open({
-						url : url + '/cell.htm',
-						width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
-						height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
-						inline : 1
-					}, {
-						plugin_url : url
-					});
-				}
-			}, function(func, name) {
-				ed.addCommand(name, function(ui, val) {
-					func(val);
-				});
-			});
-		}
-	});
-
-	// Register plugin
-	tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
-})(tinymce);
\ No newline at end of file
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function(tinymce) {
+	var each = tinymce.each;
+
+	// Checks if the selection/caret is at the start of the specified block element
+	function isAtStart(rng, par) {
+		var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
+
+		rng2.setStartBefore(par);
+		rng2.setEnd(rng.endContainer, rng.endOffset);
+
+		elm = doc.createElement('body');
+		elm.appendChild(rng2.cloneContents());
+
+		// Check for text characters of other elements that should be treated as content
+		return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
+	};
+
+	function getSpanVal(td, name) {
+		return parseInt(td.getAttribute(name) || 1);
+	}
+
+	/**
+	 * Table Grid class.
+	 */
+	function TableGrid(table, dom, selection) {
+		var grid, startPos, endPos, selectedCell;
+
+		buildGrid();
+		selectedCell = dom.getParent(selection.getStart(), 'th,td');
+		if (selectedCell) {
+			startPos = getPos(selectedCell);
+			endPos = findEndPos();
+			selectedCell = getCell(startPos.x, startPos.y);
+		}
+
+		function cloneNode(node, children) {
+			node = node.cloneNode(children);
+			node.removeAttribute('id');
+
+			return node;
+		}
+
+		function buildGrid() {
+			var startY = 0;
+
+			grid = [];
+
+			each(['thead', 'tbody', 'tfoot'], function(part) {
+				var rows = dom.select('> ' + part + ' tr', table);
+
+				each(rows, function(tr, y) {
+					y += startY;
+
+					each(dom.select('> td, > th', tr), function(td, x) {
+						var x2, y2, rowspan, colspan;
+
+						// Skip over existing cells produced by rowspan
+						if (grid[y]) {
+							while (grid[y][x])
+								x++;
+						}
+
+						// Get col/rowspan from cell
+						rowspan = getSpanVal(td, 'rowspan');
+						colspan = getSpanVal(td, 'colspan');
+
+						// Fill out rowspan/colspan right and down
+						for (y2 = y; y2 < y + rowspan; y2++) {
+							if (!grid[y2])
+								grid[y2] = [];
+
+							for (x2 = x; x2 < x + colspan; x2++) {
+								grid[y2][x2] = {
+									part : part,
+									real : y2 == y && x2 == x,
+									elm : td,
+									rowspan : rowspan,
+									colspan : colspan
+								};
+							}
+						}
+					});
+				});
+
+				startY += rows.length;
+			});
+		};
+
+		function getCell(x, y) {
+			var row;
+
+			row = grid[y];
+			if (row)
+				return row[x];
+		};
+
+		function setSpanVal(td, name, val) {
+			if (td) {
+				val = parseInt(val);
+
+				if (val === 1)
+					td.removeAttribute(name, 1);
+				else
+					td.setAttribute(name, val, 1);
+			}
+		}
+
+		function isCellSelected(cell) {
+			return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
+		};
+
+		function getSelectedRows() {
+			var rows = [];
+
+			each(table.rows, function(row) {
+				each(row.cells, function(cell) {
+					if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
+						rows.push(row);
+						return false;
+					}
+				});
+			});
+
+			return rows;
+		};
+
+		function deleteTable() {
+			var rng = dom.createRng();
+
+			rng.setStartAfter(table);
+			rng.setEndAfter(table);
+
+			selection.setRng(rng);
+
+			dom.remove(table);
+		};
+
+		function cloneCell(cell) {
+			var formatNode;
+
+			// Clone formats
+			tinymce.walk(cell, function(node) {
+				var curNode;
+
+				if (node.nodeType == 3) {
+					each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
+						node = cloneNode(node, false);
+
+						if (!formatNode)
+							formatNode = curNode = node;
+						else if (curNode)
+							curNode.appendChild(node);
+
+						curNode = node;
+					});
+
+					// Add something to the inner node
+					if (curNode)
+						curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br data-mce-bogus="1" />';
+
+					return false;
+				}
+			}, 'childNodes');
+
+			cell = cloneNode(cell, false);
+			setSpanVal(cell, 'rowSpan', 1);
+			setSpanVal(cell, 'colSpan', 1);
+
+			if (formatNode) {
+				cell.appendChild(formatNode);
+			} else {
+				if (!tinymce.isIE)
+					cell.innerHTML = '<br data-mce-bogus="1" />';
+			}
+
+			return cell;
+		};
+
+		function cleanup() {
+			var rng = dom.createRng();
+
+			// Empty rows
+			each(dom.select('tr', table), function(tr) {
+				if (tr.cells.length == 0)
+					dom.remove(tr);
+			});
+
+			// Empty table
+			if (dom.select('tr', table).length == 0) {
+				rng.setStartAfter(table);
+				rng.setEndAfter(table);
+				selection.setRng(rng);
+				dom.remove(table);
+				return;
+			}
+
+			// Empty header/body/footer
+			each(dom.select('thead,tbody,tfoot', table), function(part) {
+				if (part.rows.length == 0)
+					dom.remove(part);
+			});
+
+			// Restore selection to start position if it still exists
+			buildGrid();
+
+			// Restore the selection to the closest table position
+			row = grid[Math.min(grid.length - 1, startPos.y)];
+			if (row) {
+				selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
+				selection.collapse(true);
+			}
+		};
+
+		function fillLeftDown(x, y, rows, cols) {
+			var tr, x2, r, c, cell;
+
+			tr = grid[y][x].elm.parentNode;
+			for (r = 1; r <= rows; r++) {
+				tr = dom.getNext(tr, 'tr');
+
+				if (tr) {
+					// Loop left to find real cell
+					for (x2 = x; x2 >= 0; x2--) {
+						cell = grid[y + r][x2].elm;
+
+						if (cell.parentNode == tr) {
+							// Append clones after
+							for (c = 1; c <= cols; c++)
+								dom.insertAfter(cloneCell(cell), cell);
+
+							break;
+						}
+					}
+
+					if (x2 == -1) {
+						// Insert nodes before first cell
+						for (c = 1; c <= cols; c++)
+							tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
+					}
+				}
+			}
+		};
+
+		function split() {
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					var colSpan, rowSpan, newCell, i;
+
+					if (isCellSelected(cell)) {
+						cell = cell.elm;
+						colSpan = getSpanVal(cell, 'colspan');
+						rowSpan = getSpanVal(cell, 'rowspan');
+
+						if (colSpan > 1 || rowSpan > 1) {
+							setSpanVal(cell, 'rowSpan', 1);
+							setSpanVal(cell, 'colSpan', 1);
+
+							// Insert cells right
+							for (i = 0; i < colSpan - 1; i++)
+								dom.insertAfter(cloneCell(cell), cell);
+
+							fillLeftDown(x, y, rowSpan - 1, colSpan);
+						}
+					}
+				});
+			});
+		};
+
+		function merge(cell, cols, rows) {
+			var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
+
+			// Use specified cell and cols/rows
+			if (cell) {
+				pos = getPos(cell);
+				startX = pos.x;
+				startY = pos.y;
+				endX = startX + (cols - 1);
+				endY = startY + (rows - 1);
+			} else {
+				// Use selection
+				startX = startPos.x;
+				startY = startPos.y;
+				endX = endPos.x;
+				endY = endPos.y;
+			}
+
+			// Find start/end cells
+			startCell = getCell(startX, startY);
+			endCell = getCell(endX, endY);
+
+			// Check if the cells exists and if they are of the same part for example tbody = tbody
+			if (startCell && endCell && startCell.part == endCell.part) {
+				// Split and rebuild grid
+				split();
+				buildGrid();
+
+				// Set row/col span to start cell
+				startCell = getCell(startX, startY).elm;
+				setSpanVal(startCell, 'colSpan', (endX - startX) + 1);
+				setSpanVal(startCell, 'rowSpan', (endY - startY) + 1);
+
+				// Remove other cells and add it's contents to the start cell
+				for (y = startY; y <= endY; y++) {
+					for (x = startX; x <= endX; x++) {
+						if (!grid[y] || !grid[y][x])
+							continue;
+
+						cell = grid[y][x].elm;
+
+						if (cell != startCell) {
+							// Move children to startCell
+							children = tinymce.grep(cell.childNodes);
+							each(children, function(node) {
+								startCell.appendChild(node);
+							});
+
+							// Remove bogus nodes if there is children in the target cell
+							if (children.length) {
+								children = tinymce.grep(startCell.childNodes);
+								count = 0;
+								each(children, function(node) {
+									if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
+										startCell.removeChild(node);
+								});
+							}
+							
+							// Remove cell
+							dom.remove(cell);
+						}
+					}
+				}
+
+				// Remove empty rows etc and restore caret location
+				cleanup();
+			}
+		};
+
+		function insertRow(before) {
+			var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
+
+			// Find first/last row
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					if (isCellSelected(cell)) {
+						cell = cell.elm;
+						rowElm = cell.parentNode;
+						newRow = cloneNode(rowElm, false);
+						posY = y;
+
+						if (before)
+							return false;
+					}
+				});
+
+				if (before)
+					return !posY;
+			});
+
+			for (x = 0; x < grid[0].length; x++) {
+				// Cell not found could be because of an invalid table structure
+				if (!grid[posY][x])
+					continue;
+
+				cell = grid[posY][x].elm;
+
+				if (cell != lastCell) {
+					if (!before) {
+						rowSpan = getSpanVal(cell, 'rowspan');
+						if (rowSpan > 1) {
+							setSpanVal(cell, 'rowSpan', rowSpan + 1);
+							continue;
+						}
+					} else {
+						// Check if cell above can be expanded
+						if (posY > 0 && grid[posY - 1][x]) {
+							otherCell = grid[posY - 1][x].elm;
+							rowSpan = getSpanVal(otherCell, 'rowSpan');
+							if (rowSpan > 1) {
+								setSpanVal(otherCell, 'rowSpan', rowSpan + 1);
+								continue;
+							}
+						}
+					}
+
+					// Insert new cell into new row
+					newCell = cloneCell(cell);
+					setSpanVal(newCell, 'colSpan', cell.colSpan);
+
+					newRow.appendChild(newCell);
+
+					lastCell = cell;
+				}
+			}
+
+			if (newRow.hasChildNodes()) {
+				if (!before)
+					dom.insertAfter(newRow, rowElm);
+				else
+					rowElm.parentNode.insertBefore(newRow, rowElm);
+			}
+		};
+
+		function insertCol(before) {
+			var posX, lastCell;
+
+			// Find first/last column
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					if (isCellSelected(cell)) {
+						posX = x;
+
+						if (before)
+							return false;
+					}
+				});
+
+				if (before)
+					return !posX;
+			});
+
+			each(grid, function(row, y) {
+				var cell, rowSpan, colSpan;
+
+				if (!row[posX])
+					return;
+
+				cell = row[posX].elm;
+				if (cell != lastCell) {
+					colSpan = getSpanVal(cell, 'colspan');
+					rowSpan = getSpanVal(cell, 'rowspan');
+
+					if (colSpan == 1) {
+						if (!before) {
+							dom.insertAfter(cloneCell(cell), cell);
+							fillLeftDown(posX, y, rowSpan - 1, colSpan);
+						} else {
+							cell.parentNode.insertBefore(cloneCell(cell), cell);
+							fillLeftDown(posX, y, rowSpan - 1, colSpan);
+						}
+					} else
+						setSpanVal(cell, 'colSpan', cell.colSpan + 1);
+
+					lastCell = cell;
+				}
+			});
+		};
+
+		function deleteCols() {
+			var cols = [];
+
+			// Get selected column indexes
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
+						each(grid, function(row) {
+							var cell = row[x].elm, colSpan;
+
+							colSpan = getSpanVal(cell, 'colSpan');
+
+							if (colSpan > 1)
+								setSpanVal(cell, 'colSpan', colSpan - 1);
+							else
+								dom.remove(cell);
+						});
+
+						cols.push(x);
+					}
+				});
+			});
+
+			cleanup();
+		};
+
+		function deleteRows() {
+			var rows;
+
+			function deleteRow(tr) {
+				var nextTr, pos, lastCell;
+
+				nextTr = dom.getNext(tr, 'tr');
+
+				// Move down row spanned cells
+				each(tr.cells, function(cell) {
+					var rowSpan = getSpanVal(cell, 'rowSpan');
+
+					if (rowSpan > 1) {
+						setSpanVal(cell, 'rowSpan', rowSpan - 1);
+						pos = getPos(cell);
+						fillLeftDown(pos.x, pos.y, 1, 1);
+					}
+				});
+
+				// Delete cells
+				pos = getPos(tr.cells[0]);
+				each(grid[pos.y], function(cell) {
+					var rowSpan;
+
+					cell = cell.elm;
+
+					if (cell != lastCell) {
+						rowSpan = getSpanVal(cell, 'rowSpan');
+
+						if (rowSpan <= 1)
+							dom.remove(cell);
+						else
+							setSpanVal(cell, 'rowSpan', rowSpan - 1);
+
+						lastCell = cell;
+					}
+				});
+			};
+
+			// Get selected rows and move selection out of scope
+			rows = getSelectedRows();
+
+			// Delete all selected rows
+			each(rows.reverse(), function(tr) {
+				deleteRow(tr);
+			});
+
+			cleanup();
+		};
+
+		function cutRows() {
+			var rows = getSelectedRows();
+
+			dom.remove(rows);
+			cleanup();
+
+			return rows;
+		};
+
+		function copyRows() {
+			var rows = getSelectedRows();
+
+			each(rows, function(row, i) {
+				rows[i] = cloneNode(row, true);
+			});
+
+			return rows;
+		};
+
+		function pasteRows(rows, before) {
+			var selectedRows = getSelectedRows(),
+				targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
+				targetCellCount = targetRow.cells.length;
+
+			// Calc target cell count
+			each(grid, function(row) {
+				var match;
+
+				targetCellCount = 0;
+				each(row, function(cell, x) {
+					if (cell.real)
+						targetCellCount += cell.colspan;
+
+					if (cell.elm.parentNode == targetRow)
+						match = 1;
+				});
+
+				if (match)
+					return false;
+			});
+
+			if (!before)
+				rows.reverse();
+
+			each(rows, function(row) {
+				var cellCount = row.cells.length, cell;
+
+				// Remove col/rowspans
+				for (i = 0; i < cellCount; i++) {
+					cell = row.cells[i];
+					setSpanVal(cell, 'colSpan', 1);
+					setSpanVal(cell, 'rowSpan', 1);
+				}
+
+				// Needs more cells
+				for (i = cellCount; i < targetCellCount; i++)
+					row.appendChild(cloneCell(row.cells[cellCount - 1]));
+
+				// Needs less cells
+				for (i = targetCellCount; i < cellCount; i++)
+					dom.remove(row.cells[i]);
+
+				// Add before/after
+				if (before)
+					targetRow.parentNode.insertBefore(row, targetRow);
+				else
+					dom.insertAfter(row, targetRow);
+			});
+		};
+
+		function getPos(target) {
+			var pos;
+
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					if (cell.elm == target) {
+						pos = {x : x, y : y};
+						return false;
+					}
+				});
+
+				return !pos;
+			});
+
+			return pos;
+		};
+
+		function setStartCell(cell) {
+			startPos = getPos(cell);
+		};
+
+		function findEndPos() {
+			var pos, maxX, maxY;
+
+			maxX = maxY = 0;
+
+			each(grid, function(row, y) {
+				each(row, function(cell, x) {
+					var colSpan, rowSpan;
+
+					if (isCellSelected(cell)) {
+						cell = grid[y][x];
+
+						if (x > maxX)
+							maxX = x;
+
+						if (y > maxY)
+							maxY = y;
+
+						if (cell.real) {
+							colSpan = cell.colspan - 1;
+							rowSpan = cell.rowspan - 1;
+
+							if (colSpan) {
+								if (x + colSpan > maxX)
+									maxX = x + colSpan;
+							}
+
+							if (rowSpan) {
+								if (y + rowSpan > maxY)
+									maxY = y + rowSpan;
+							}
+						}
+					}
+				});
+			});
+
+			return {x : maxX, y : maxY};
+		};
+
+		function setEndCell(cell) {
+			var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
+
+			endPos = getPos(cell);
+
+			if (startPos && endPos) {
+				// Get start/end positions
+				startX = Math.min(startPos.x, endPos.x);
+				startY = Math.min(startPos.y, endPos.y);
+				endX = Math.max(startPos.x, endPos.x);
+				endY = Math.max(startPos.y, endPos.y);
+
+				// Expand end positon to include spans
+				maxX = endX;
+				maxY = endY;
+
+				// Expand startX
+				for (y = startY; y <= maxY; y++) {
+					cell = grid[y][startX];
+
+					if (!cell.real) {
+						if (startX - (cell.colspan - 1) < startX)
+							startX -= cell.colspan - 1;
+					}
+				}
+
+				// Expand startY
+				for (x = startX; x <= maxX; x++) {
+					cell = grid[startY][x];
+
+					if (!cell.real) {
+						if (startY - (cell.rowspan - 1) < startY)
+							startY -= cell.rowspan - 1;
+					}
+				}
+
+				// Find max X, Y
+				for (y = startY; y <= endY; y++) {
+					for (x = startX; x <= endX; x++) {
+						cell = grid[y][x];
+
+						if (cell.real) {
+							colSpan = cell.colspan - 1;
+							rowSpan = cell.rowspan - 1;
+
+							if (colSpan) {
+								if (x + colSpan > maxX)
+									maxX = x + colSpan;
+							}
+
+							if (rowSpan) {
+								if (y + rowSpan > maxY)
+									maxY = y + rowSpan;
+							}
+						}
+					}
+				}
+
+				// Remove current selection
+				dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+
+				// Add new selection
+				for (y = startY; y <= maxY; y++) {
+					for (x = startX; x <= maxX; x++) {
+						if (grid[y][x])
+							dom.addClass(grid[y][x].elm, 'mceSelected');
+					}
+				}
+			}
+		};
+
+		// Expose to public
+		tinymce.extend(this, {
+			deleteTable : deleteTable,
+			split : split,
+			merge : merge,
+			insertRow : insertRow,
+			insertCol : insertCol,
+			deleteCols : deleteCols,
+			deleteRows : deleteRows,
+			cutRows : cutRows,
+			copyRows : copyRows,
+			pasteRows : pasteRows,
+			getPos : getPos,
+			setStartCell : setStartCell,
+			setEndCell : setEndCell
+		});
+	};
+
+	tinymce.create('tinymce.plugins.TablePlugin', {
+		init : function(ed, url) {
+			var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload
+
+			function createTableGrid(node) {
+				var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
+
+				if (tblElm)
+					return new TableGrid(tblElm, ed.dom, selection);
+			};
+
+			function cleanup() {
+				// Restore selection possibilities
+				ed.getBody().style.webkitUserSelect = '';
+
+				if (hasCellSelection) {
+					ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+					hasCellSelection = false;
+				}
+			};
+
+			// 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]});
+			});
+
+			// Select whole table is a table border is clicked
+			if (!tinymce.isIE) {
+				ed.onClick.add(function(ed, e) {
+					e = e.target;
+
+					if (e.nodeName === 'TABLE') {
+						ed.selection.select(e);
+						ed.nodeChanged();
+					}
+				});
+			}
+
+			ed.onPreProcess.add(function(ed, args) {
+				var nodes, i, node, dom = ed.dom, value;
+
+				nodes = dom.select('table', args.node);
+				i = nodes.length;
+				while (i--) {
+					node = nodes[i];
+					dom.setAttrib(node, 'data-mce-style', '');
+
+					if ((value = dom.getAttrib(node, 'width'))) {
+						dom.setStyle(node, 'width', value);
+						dom.setAttrib(node, 'width', '');
+					}
+
+					if ((value = dom.getAttrib(node, 'height'))) {
+						dom.setStyle(node, 'height', value);
+						dom.setAttrib(node, 'height', '');
+					}
+				}
+			});
+
+			// Handle node change updates
+			ed.onNodeChange.add(function(ed, cm, n) {
+				var p;
+
+				n = ed.selection.getStart();
+				p = ed.dom.getParent(n, 'td,th,caption');
+				cm.setActive('table', n.nodeName === 'TABLE' || !!p);
+
+				// Disable table tools if we are in caption
+				if (p && p.nodeName === 'CAPTION')
+					p = 0;
+
+				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);
+				cm.setDisabled('merge_cells', !p);
+			});
+
+			ed.onInit.add(function(ed) {
+				var startTable, startCell, dom = ed.dom, tableGrid;
+
+				winMan = ed.windowManager;
+
+				// Add cell selection logic
+				ed.onMouseDown.add(function(ed, e) {
+					if (e.button != 2) {
+						cleanup();
+
+						startCell = dom.getParent(e.target, 'td,th');
+						startTable = dom.getParent(startCell, 'table');
+					}
+				});
+
+				dom.bind(ed.getDoc(), 'mouseover', function(e) {
+					var sel, table, target = e.target;
+
+					if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
+						table = dom.getParent(target, 'table');
+						if (table == startTable) {
+							if (!tableGrid) {
+								tableGrid = createTableGrid(table);
+								tableGrid.setStartCell(startCell);
+
+								ed.getBody().style.webkitUserSelect = 'none';
+							}
+
+							tableGrid.setEndCell(target);
+							hasCellSelection = true;
+						}
+
+						// Remove current selection
+						sel = ed.selection.getSel();
+
+						try {
+							if (sel.removeAllRanges)
+								sel.removeAllRanges();
+							else
+								sel.empty();
+						} catch (ex) {
+							// IE9 might throw errors here
+						}
+
+						e.preventDefault();
+					}
+				});
+
+				ed.onMouseUp.add(function(ed, e) {
+					var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
+
+					// Move selection to startCell
+					if (startCell) {
+						if (tableGrid)
+							ed.getBody().style.webkitUserSelect = '';
+
+						function setPoint(node, start) {
+							var walker = new tinymce.dom.TreeWalker(node, node);
+
+							do {
+								// Text node
+								if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
+									if (start)
+										rng.setStart(node, 0);
+									else
+										rng.setEnd(node, node.nodeValue.length);
+
+									return;
+								}
+
+								// BR element
+								if (node.nodeName == 'BR') {
+									if (start)
+										rng.setStartBefore(node);
+									else
+										rng.setEndBefore(node);
+
+									return;
+								}
+							} while (node = (start ? walker.next() : walker.prev()));
+						}
+
+						// Try to expand text selection as much as we can only Gecko supports cell selection
+						selectedCells = dom.select('td.mceSelected,th.mceSelected');
+						if (selectedCells.length > 0) {
+							rng = dom.createRng();
+							node = selectedCells[0];
+							endNode = selectedCells[selectedCells.length - 1];
+							rng.setStartBefore(node);
+							rng.setEndAfter(node);
+
+							setPoint(node, 1);
+							walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
+
+							do {
+								if (node.nodeName == 'TD' || node.nodeName == 'TH') {
+									if (!dom.hasClass(node, 'mceSelected'))
+										break;
+
+									lastNode = node;
+								}
+							} while (node = walker.next());
+
+							setPoint(lastNode);
+
+							sel.setRng(rng);
+						}
+
+						ed.nodeChanged();
+						startCell = tableGrid = startTable = null;
+					}
+				});
+
+				ed.onKeyUp.add(function(ed, e) {
+					cleanup();
+				});
+
+				ed.onKeyDown.add(function (ed, e) {
+					fixTableCellSelection(ed);
+				});
+
+				ed.onMouseDown.add(function (ed, e) {
+					if (e.button != 2) {
+						fixTableCellSelection(ed);
+					}
+				});
+				function tableCellSelected(ed, rng, n, currentCell) {
+					// The decision of when a table cell is selected is somewhat involved.  The fact that this code is
+					// required is actually a pointer to the root cause of this bug. A cell is selected when the start 
+					// and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases)
+					// or the parent of the table (in the case of the selection containing the last cell of a table).
+					var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'), 
+					tableParent, allOfCellSelected, tableCellSelection;
+					if (table) 
+					tableParent = table.parentNode;
+					allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE && 
+						rng.startOffset == 0 && 
+						rng.endOffset == 0 && 
+						currentCell && 
+						(n.nodeName=="TR" || n==tableParent);
+					tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell;	   
+					return  allOfCellSelected || tableCellSelection;
+					// return false;
+				}
+				
+				// this nasty hack is here to work around some WebKit selection bugs.
+				function fixTableCellSelection(ed) {
+					if (!tinymce.isWebKit)
+						return;
+
+					var rng = ed.selection.getRng();
+					var n = ed.selection.getNode();
+					var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH');
+				
+					if (!tableCellSelected(ed, rng, n, currentCell))
+						return;
+						if (!currentCell) {
+							currentCell=n;
+						}
+					
+					// Get the very last node inside the table cell
+					var end = currentCell.lastChild;
+					while (end.lastChild)
+						end = end.lastChild;
+					
+					// Select the entire table cell. Nothing outside of the table cell should be selected.
+					rng.setEnd(end, end.nodeValue.length);
+					ed.selection.setRng(rng);
+				}
+				ed.plugins.table.fixTableCellSelection=fixTableCellSelection;
+
+				// Add context menu
+				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') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
+							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', value : {action : 'insert'}});
+							m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
+							m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
+							m.addSeparator();
+
+							// Cell menu
+							sm = m.addMenu({title : 'table.cell'});
+							sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
+							sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
+							sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
+
+							// Row menu
+							sm = m.addMenu({title : 'table.row'});
+							sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
+							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'}).setDisabled(!clipboardRows);
+							sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
+
+							// 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'});
+					});
+				}
+
+				// Fix to allow navigating up and down in a table in WebKit browsers.
+				if (tinymce.isWebKit) {
+					function moveSelection(ed, e) {
+						var VK = tinymce.VK;
+						var key = e.keyCode;
+
+						function handle(upBool, sourceNode, event) {
+							var siblingDirection = upBool ? 'previousSibling' : 'nextSibling';
+							var currentRow = ed.dom.getParent(sourceNode, 'tr');
+							var siblingRow = currentRow[siblingDirection];
+
+							if (siblingRow) {
+								moveCursorToRow(ed, sourceNode, siblingRow, upBool);
+								tinymce.dom.Event.cancel(event);
+								return true;
+							} else {
+								var tableNode = ed.dom.getParent(currentRow, 'table');
+								var middleNode = currentRow.parentNode;
+								var parentNodeName = middleNode.nodeName.toLowerCase();
+								if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) {
+									var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody');
+									if (targetParent !== null) {
+										return moveToRowInTarget(upBool, targetParent, sourceNode, event);
+									}
+								}
+								return escapeTable(upBool, currentRow, siblingDirection, tableNode, event);
+							}
+						}
+
+						function getTargetParent(upBool, topNode, secondNode, nodeName) {
+							var tbodies = ed.dom.select('>' + nodeName, topNode);
+							var position = tbodies.indexOf(secondNode);
+							if (upBool && position === 0 || !upBool && position === tbodies.length - 1) {
+								return getFirstHeadOrFoot(upBool, topNode);
+							} else if (position === -1) {
+								var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1;
+								return tbodies[topOrBottom];
+							} else {
+								return tbodies[position + (upBool ? -1 : 1)];
+							}
+						}
+
+						function getFirstHeadOrFoot(upBool, parent) {
+							var tagName = upBool ? 'thead' : 'tfoot';
+							var headOrFoot = ed.dom.select('>' + tagName, parent);
+							return headOrFoot.length !== 0 ? headOrFoot[0] : null;
+						}
+
+						function moveToRowInTarget(upBool, targetParent, sourceNode, event) {
+							var targetRow = getChildForDirection(targetParent, upBool);
+							targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool);
+							tinymce.dom.Event.cancel(event);
+							return true;
+						}
+
+						function escapeTable(upBool, currentRow, siblingDirection, table, event) {
+							var tableSibling = table[siblingDirection];
+							if (tableSibling) {
+								moveCursorToStartOfElement(tableSibling);
+								return true;
+							} else {
+								var parentCell = ed.dom.getParent(table, 'td,th');
+								if (parentCell) {
+									return handle(upBool, parentCell, event);
+								} else {
+									var backUpSibling = getChildForDirection(currentRow, !upBool);
+									moveCursorToStartOfElement(backUpSibling);
+									return tinymce.dom.Event.cancel(event);
+								}
+							}
+						}
+
+						function getChildForDirection(parent, up) {
+							return parent && parent[up ? 'lastChild' : 'firstChild'];
+						}
+
+						function moveCursorToStartOfElement(n) {
+							ed.selection.setCursorLocation(n, 0);
+						}
+
+						function isVerticalMovement() {
+							return key == VK.UP || key == VK.DOWN;
+						}
+
+						function isInTable(ed) {
+							var node = ed.selection.getNode();
+							var currentRow = ed.dom.getParent(node, 'tr');
+							return currentRow !== null;
+						}
+
+						function columnIndex(column) {
+							var colIndex = 0;
+							var c = column;
+							while (c.previousSibling) {
+								c = c.previousSibling;
+								colIndex = colIndex + getSpanVal(c, "colspan");
+							}
+							return colIndex;
+						}
+
+						function findColumn(rowElement, columnIndex) {
+							var c = 0;
+							var r = 0;
+							each(rowElement.children, function(cell, i) {
+								c = c + getSpanVal(cell, "colspan");
+								r = i;
+								if (c > columnIndex)
+									return false;
+							});
+							return r;
+						}
+
+						function moveCursorToRow(ed, node, row, upBool) {
+							var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th'));
+							var tgtColumnIndex = findColumn(row, srcColumnIndex);
+							var tgtNode = row.childNodes[tgtColumnIndex];
+							var rowCellTarget = getChildForDirection(tgtNode, upBool);
+							moveCursorToStartOfElement(rowCellTarget || tgtNode);
+						}
+
+						function shouldFixCaret(preBrowserNode) {
+							var newNode = ed.selection.getNode();
+							var newParent = ed.dom.getParent(newNode, 'td,th');
+							var oldParent = ed.dom.getParent(preBrowserNode, 'td,th');
+							return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent)
+						}
+
+						function checkSameParentTable(nodeOne, NodeTwo) {
+							return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE');
+						}
+
+						if (isVerticalMovement() && isInTable(ed)) {
+							var preBrowserNode = ed.selection.getNode();
+							setTimeout(function() {
+								if (shouldFixCaret(preBrowserNode)) {
+									handle(!e.shiftKey && key === VK.UP, preBrowserNode, e);
+								}
+							}, 0);
+						}
+					}
+
+					ed.onKeyDown.add(moveSelection);
+				}
+								
+				// Fixes an issue on Gecko where it's impossible to place the caret behind a table
+				// This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
+				if (!tinymce.isIE) {
+					function fixTableCaretPos() {
+						var last;
+
+						// Skip empty text nodes form the end
+						for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
+
+						if (last && last.nodeName == 'TABLE')
+							ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
+					};
+
+					// Fixes an bug where it's impossible to place the caret before a table in Gecko
+					// this fix solves it by detecting when the caret is at the beginning of such a table
+					// and then manually moves the caret infront of the table
+					if (tinymce.isGecko) {
+						ed.onKeyDown.add(function(ed, e) {
+							var rng, table, dom = ed.dom;
+
+							// On gecko it's not possible to place the caret before a table
+							if (e.keyCode == 37 || e.keyCode == 38) {
+								rng = ed.selection.getRng();
+								table = dom.getParent(rng.startContainer, 'table');
+
+								if (table && ed.getBody().firstChild == table) {
+									if (isAtStart(rng, table)) {
+										rng = dom.createRng();
+
+										rng.setStartBefore(table);
+										rng.setEndBefore(table);
+
+										ed.selection.setRng(rng);
+
+										e.preventDefault();
+									}
+								}
+							}
+						});
+					}
+
+					ed.onKeyUp.add(fixTableCaretPos);
+					ed.onSetContent.add(fixTableCaretPos);
+					ed.onVisualAid.add(fixTableCaretPos);
+
+					ed.onPreProcess.add(function(ed, o) {
+						var last = o.node.lastChild;
+
+						if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
+							ed.dom.remove(last);
+					});
+
+					fixTableCaretPos();
+					ed.startContent = ed.getContent({format : 'raw'});
+				}
+			});
+
+			// Register action commands
+			each({
+				mceTableSplitCells : function(grid) {
+					grid.split();
+				},
+
+				mceTableMergeCells : function(grid) {
+					var rowSpan, colSpan, cell;
+
+					cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
+					if (cell) {
+						rowSpan = cell.rowSpan;
+						colSpan = cell.colSpan;
+					}
+
+					if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
+						winMan.open({
+							url : url + '/merge_cells.htm',
+							width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
+							height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
+							inline : 1
+						}, {
+							rows : rowSpan,
+							cols : colSpan,
+							onaction : function(data) {
+								grid.merge(cell, data.cols, data.rows);
+							},
+							plugin_url : url
+						});
+					} else
+						grid.merge();
+				},
+
+				mceTableInsertRowBefore : function(grid) {
+					grid.insertRow(true);
+				},
+
+				mceTableInsertRowAfter : function(grid) {
+					grid.insertRow();
+				},
+
+				mceTableInsertColBefore : function(grid) {
+					grid.insertCol(true);
+				},
+
+				mceTableInsertColAfter : function(grid) {
+					grid.insertCol();
+				},
+
+				mceTableDeleteCol : function(grid) {
+					grid.deleteCols();
+				},
+
+				mceTableDeleteRow : function(grid) {
+					grid.deleteRows();
+				},
+
+				mceTableCutRow : function(grid) {
+					clipboardRows = grid.cutRows();
+				},
+
+				mceTableCopyRow : function(grid) {
+					clipboardRows = grid.copyRows();
+				},
+
+				mceTablePasteRowBefore : function(grid) {
+					grid.pasteRows(clipboardRows, true);
+				},
+
+				mceTablePasteRowAfter : function(grid) {
+					grid.pasteRows(clipboardRows);
+				},
+
+				mceTableDelete : function(grid) {
+					grid.deleteTable();
+				}
+			}, function(func, name) {
+				ed.addCommand(name, function() {
+					var grid = createTableGrid();
+
+					if (grid) {
+						func(grid);
+						ed.execCommand('mceRepaint');
+						cleanup();
+					}
+				});
+			});
+
+			// Register dialog commands
+			each({
+				mceInsertTable : function(val) {
+					winMan.open({
+						url : url + '/table.htm',
+						width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
+						height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
+						inline : 1
+					}, {
+						plugin_url : url,
+						action : val ? val.action : 0
+					});
+				},
+
+				mceTableRowProps : function() {
+					winMan.open({
+						url : url + '/row.htm',
+						width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
+						height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
+						inline : 1
+					}, {
+						plugin_url : url
+					});
+				},
+
+				mceTableCellProps : function() {
+					winMan.open({
+						url : url + '/cell.htm',
+						width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
+						height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
+						inline : 1
+					}, {
+						plugin_url : url
+					});
+				}
+			}, function(func, name) {
+				ed.addCommand(name, function(ui, val) {
+					func(val);
+				});
+			});
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
+})(tinymce);
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/cell.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/cell.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/cell.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/cell.js	2012-10-30 15:40:38.369464402 +0000
@@ -63,6 +63,11 @@
 function updateAction() {
 	var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];
 
+	if (!AutoValidator.validate(formObj)) {
+		tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');
+		return false;
+	}
+
 	tinyMCEPopup.restoreSelection();
 	el = ed.selection.getStart();
 	tdElm = ed.dom.getParent(el, "td,th");
@@ -123,6 +128,36 @@
 
 			break;
 
+		case "col":
+			var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr");
+
+			if (cell.nodeName != "TD" && cell.nodeName != "TH")
+				cell = nextCell(cell);
+
+			do {
+				if (cell == tdElm)
+					break;
+				col += cell.getAttribute("colspan");
+			} while ((cell = nextCell(cell)) != null);
+
+			for (var i=0; i<rows.length; i++) {
+				cell = rows[i].firstChild;
+
+				if (cell.nodeName != "TD" && cell.nodeName != "TH")
+					cell = nextCell(cell);
+
+				curr = 0;
+				do {
+					if (curr == col) {
+						cell = updateCell(cell, true);
+						break;
+					}
+					curr += cell.getAttribute("colspan");
+				} while ((cell = nextCell(cell)) != null);
+			}
+
+			break;
+
 		case "all":
 			var rows = tableElm.getElementsByTagName("tr");
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/row.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/row.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/row.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/row.js	2012-10-30 15:40:38.370444368 +0000
@@ -56,6 +56,11 @@
 	var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0];
 	var action = getSelectValue(formObj, 'action');
 
+	if (!AutoValidator.validate(formObj)) {
+		tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');
+		return false;
+	}
+
 	tinyMCEPopup.restoreSelection();
 	trElm = dom.getParent(inst.selection.getStart(), "tr");
 	tableElm = dom.getParent(inst.selection.getStart(), "table");
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/table.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/table.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/js/table.js	2012-10-30 15:39:55.586444230 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/js/table.js	2012-10-30 15:40:38.370444368 +0000
@@ -60,7 +60,19 @@
 	if (action == "update") {
 		dom.setAttrib(elm, 'cellPadding', cellpadding, true);
 		dom.setAttrib(elm, 'cellSpacing', cellspacing, true);
-		dom.setAttrib(elm, 'border', border);
+
+		if (!isCssSize(border)) {
+			dom.setAttrib(elm, 'border', border);
+		} else {
+			dom.setAttrib(elm, 'border', '');
+		}
+
+		if (border == '') {
+			dom.setStyle(elm, 'border-width', '');
+			dom.setStyle(elm, 'border', '');
+			dom.setAttrib(elm, 'border', '');
+		}
+
 		dom.setAttrib(elm, 'align', align);
 		dom.setAttrib(elm, 'frame', frame);
 		dom.setAttrib(elm, 'rules', rules);
@@ -119,7 +131,7 @@
 		if (bordercolor != "") {
 			elm.style.borderColor = bordercolor;
 			elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
-			elm.style.borderWidth = border == "" ? "1px" : border;
+			elm.style.borderWidth = cssSize(border);
 		} else
 			elm.style.borderColor = '';
 
@@ -146,7 +158,10 @@
 	html += '<table';
 
 	html += makeAttrib('id', id);
-	html += makeAttrib('border', border);
+	if (!isCssSize(border)) {
+		html += makeAttrib('border', border);
+	}
+
 	html += makeAttrib('cellpadding', cellpadding);
 	html += makeAttrib('cellspacing', cellspacing);
 	html += makeAttrib('data-mce-new', '1');
@@ -228,12 +243,11 @@
 		inst.execCommand('mceInsertContent', false, html);
 
 	tinymce.each(dom.select('table[data-mce-new]'), function(node) {
-		var td = dom.select('td', node);
+		var tdorth = dom.select('td,th', node);
 
 		try {
-			// IE9 might fail to do this selection
-			inst.selection.select(td[0], true);
-			inst.selection.collapse();
+			// IE9 might fail to do this selection 
+			inst.selection.setCursorLocation(tdorth[0], 0);
 		} catch (ex) {
 			// Ignore
 		}
@@ -384,6 +398,20 @@
 	formObj.style.value = dom.serializeStyle(st);
 }
 
+function isCssSize(value) {
+	return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value);
+}
+
+function cssSize(value, def) {
+	value = tinymce.trim(value || def);
+
+	if (!isCssSize(value)) {
+		return parseInt(value, 10) + 'px';
+	}
+
+	return value;
+}
+
 function changedBackgroundImage() {
 	var formObj = document.forms[0];
 	var st = dom.parseStyle(formObj.style.value);
@@ -398,8 +426,14 @@
 	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";
+	if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != ""))
+		st['border-width'] = cssSize(formObj.border.value);
+	else {
+		if (!formObj.border.value) {
+			st['border'] = '';
+			st['border-width'] = '';
+		}
+	}
 
 	formObj.style.value = dom.serializeStyle(st);
 }
@@ -415,7 +449,7 @@
 
 		// Add border-width if it's missing
 		if (!st['border-width'])
-			st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";
+			st['border-width'] = cssSize(formObj.border.value, 1);
 	}
 
 	formObj.style.value = dom.serializeStyle(st);
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/langs/en_dlg.js 1.0.2.src/e107_handlers/tiny_mce/plugins/table/langs/en_dlg.js
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/langs/en_dlg.js	2012-10-30 15:39:55.585478403 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/langs/en_dlg.js	2012-10-30 15:40:38.371444838 +0000
@@ -1,74 +1 @@
-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:"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",
-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"
-});
\ No newline at end of file
+tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table Caption","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.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Footer",tbody:"Body",thead:"Header","row_all":"Update All Rows in Table","row_even":"Update Even Rows in Table","row_odd":"Update Odd Rows in Table","row_row":"Update Current Row","cell_all":"Update All Cells in Table","cell_row":"Update All Cells in Row","cell_cell":"Update Current Cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background Image",rtl:"Right to Left",ltr:"Left to Right",mime:"Target MIME Type",langcode:"Language Code",langdir:"Language Direction",style:"Style",id:"ID","merge_cells_title":"Merge Table Cells",bgcolor:"Background Color",bordercolor:"Border Color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical Alignment","cell_type":"Cell Type","cell_title":"Table Cell Properties","row_title":"Table Row Properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cell Padding",cellspacing:"Cell Spacing",rows:"Rows",cols:"Columns",height:"Height",width:"Width",title:"Insert/Edit Table",rowtype:"Row Type","advanced_props":"Advanced Properties","general_props":"General Properties","advanced_tab":"Advanced","general_tab":"General","cell_col":"Update all cells in column"});
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/row.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/table/row.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/row.htm	2012-10-30 15:39:55.583444652 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/row.htm	2012-10-30 15:40:38.372444837 +0000
@@ -5,6 +5,7 @@
 	<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/row.js"></script>
 	<link href="css/row.css" rel="stylesheet" type="text/css" />
@@ -70,7 +71,7 @@
 
 						<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>
+							<td class="col2"><input name="height" type="text" id="height" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>
 						</tr>
 					</table>
 				</fieldset>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/plugins/table/table.htm 1.0.2.src/e107_handlers/tiny_mce/plugins/table/table.htm
--- 1.0.0.src/e107_handlers/tiny_mce/plugins/table/table.htm	2012-10-30 15:39:55.584444397 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/plugins/table/table.htm	2012-10-30 15:40:38.372444837 +0000
@@ -46,13 +46,13 @@
 								<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>
+							<td><input id="border" name="border" type="text" value="" size="3" maxlength="5" onchange="changedBorder();" class="size" /></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><input name="width" type="text" id="width" value="" size="7" maxlength="7" 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>
+							<td><input name="height" type="text" id="height" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>
 						</tr>
 						<tr id="styleSelectRow" >
 							<td><label id="classlabel" for="class">{#class_name}</label></td>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/charmap.htm 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/charmap.htm
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/charmap.htm	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/charmap.htm	2012-10-30 15:40:38.373452820 +0000
@@ -5,7 +5,7 @@
 	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
 	<script type="text/javascript" src="js/charmap.js"></script>
 </head>
-<body id="charmap" style="display:none">
+<body id="charmap" style="display:none" role="application">
 <table align="center" border="0" cellspacing="0" cellpadding="2" role="presentation">
 	<tr>
 		<td colspan="2" class="title" ><label for="charmapView" id="charmap_label">{#advanced_dlg.charmap_title}</label></td>
@@ -46,6 +46,10 @@
 			</table>
 		</td>
 	</tr>
+	<tr>
+		<td colspan="2" id="charmap_usage">{#advanced_dlg.charmap_usage}</td>
+	</tr>
+	
 </table>
 </body>
 </html>
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/editor_template.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/editor_template.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/editor_template.js	2012-10-30 15:39:55.588444537 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/editor_template.js	2012-10-30 15:40:38.377442147 +0000
@@ -1 +1 @@
-(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],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(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({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_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){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((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={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"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i<n.clientWidth){i=n.clientWidth;d.setStyle(o,"width",n.clientWidth)}}if(k&&l.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+j.id+"_size",{cw:i,ch:m})}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(x,k){var A=this,p,m,r=A.editor,B=A.settings,z,j=r.controlManager,u,l,q=[],y,w;w=j.createToolbarGroup("toolbargroup",{name:r.getLang("advanced.toolbar"),tab_focus_toolbar:r.getParam("theme_advanced_tab_focus_toolbar")});A.toolbarGroup=w;y=B.theme_advanced_toolbar_align.toLowerCase();y="mce"+A._ufirst(y);l=d.add(d.add(x,"tr",{role:"presentation"}),"td",{"class":"mceToolbar "+y,role:"presentation"});for(p=1;(z=B["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(B["theme_advanced_buttons"+p+"_add"]){z+=","+B["theme_advanced_buttons"+p+"_add"]}if(B["theme_advanced_buttons"+p+"_add_before"]){z=B["theme_advanced_buttons"+p+"_add_before"]+","+z}A._addControls(z,m);w.add(m);k.deltaHeight-=B.theme_advanced_row_height}q.push(w.renderHTML());q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{},"&#160;")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager;i.setDisabled("undo",!j.undoManager.hasUndo()&&!j.typing);i.setDisabled("redo",!j.undoManager.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}r.setActive("visualaid",m.hasVisual);y._updateUndoStatus(m);r.setDisabled("outdent",!m.queryCommandState("Outdent"));C=o("A");if(G=r.get("link")){if(!C||!C.name){G.setDisabled(!C&&q);G.setActive(!!C)}}if(G=r.get("unlink")){G.setDisabled(!C&&q);G.setActive(!!C&&!C.name)}if(G=r.get("anchor")){G.setActive(!q&&!!C&&C.name)}C=o("IMG");if(G=r.get("image")){G.setActive(!q&&!!C&&D.className.indexOf("mceItem")==-1)}if(G=r.get("styleselect")){y._importClasses();j=[];f(G.items,function(n){j.push(n.value)});i=m.formatter.matchAll(j);G.select(i[0])}if(G=r.get("formatselect")){C=o(d.isBlock);if(C){G.select(C.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!w&&p.className){w=p.className}}if(m.dom.is(p,z.theme_advanced_font_selector)){if(!k&&p.style.fontSize){k=p.style.fontSize}if(!u&&p.style.fontFamily){u=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!B&&p.style.color){B=p.style.color}if(!l&&p.style.backgroundColor){l=p.style.backgroundColor}}return false});if(G=r.get("fontselect")){G.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==u})}if(G=r.get("fontsizeselect")){if(z.theme_advanced_runtime_fontsize&&!k&&!w){k=m.dom.getStyle(D,"fontSize",true)}G.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===w){return true}})}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_path&&z.theme_advanced_statusbar_location){C=d.get(m.id+"_path")||d.add(m.id+"_path_row","span",{id:m.id+"_path"});if(y.statusKeyboardNavigation){y.statusKeyboardNavigation.destroy();y.statusKeyboardNavigation=null}d.setHTML(C,"");o(function(H){var p=H.nodeName.toLowerCase(),s,v,t="";if(H.getAttribute("data-mce-bogus")){return}if(H.nodeType!=1||H.nodeName==="BR"||(d.hasClass(H,"mceItemHidden")||d.hasClass(H,"mceItemRemoved"))){return}if(e.isIE&&H.scopeName!=="HTML"){p=H.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(x=d.getAttrib(H,"src")){t+="src: "+x+" "}break;case"a":if(x=d.getAttrib(H,"name")){t+="name: "+x+" ";p+="#"+x}if(x=d.getAttrib(H,"href")){t+="href: "+x+" "}break;case"font":if(x=d.getAttrib(H,"face")){t+="font: "+x+" "}if(x=d.getAttrib(H,"size")){t+="size: "+x+" "}if(x=d.getAttrib(H,"color")){t+="color: "+x+" "}break;case"span":if(x=d.getAttrib(H,"style")){t+="style: "+x+" "}break}if(x=d.getAttrib(H,"id")){t+="id: "+x+" "}if(x=H.className){x=x.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(x){t+="class: "+x+" ";if(d.isBlock(H)||p=="img"||p=="span"){p+="."+x}}}p=p.replace(/(html:)/g,"");p={name:p,node:H,title:t};y.onResolveName.dispatch(y,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(F++)},p);if(C.hasChildNodes()){C.insertBefore(d.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),C.firstChild);C.insertBefore(v,C.firstChild)}else{C.appendChild(v)}},m.getBody());if(d.select("a",C).length>0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
+(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],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(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({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_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){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((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={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"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){if(e.isWebKit){window.focus()}v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i<n.clientWidth){i=n.clientWidth;d.setStyle(o,"width",n.clientWidth)}}if(k&&l.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+j.id+"_size",{cw:i,ch:m})}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(s.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(x,k){var A=this,p,m,r=A.editor,B=A.settings,z,j=r.controlManager,u,l,q=[],y,w;w=j.createToolbarGroup("toolbargroup",{name:r.getLang("advanced.toolbar"),tab_focus_toolbar:r.getParam("theme_advanced_tab_focus_toolbar")});A.toolbarGroup=w;y=B.theme_advanced_toolbar_align.toLowerCase();y="mce"+A._ufirst(y);l=d.add(d.add(x,"tr",{role:"presentation"}),"td",{"class":"mceToolbar "+y,role:"presentation"});for(p=1;(z=B["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(B["theme_advanced_buttons"+p+"_add"]){z+=","+B["theme_advanced_buttons"+p+"_add"]}if(B["theme_advanced_buttons"+p+"_add_before"]){z=B["theme_advanced_buttons"+p+"_add_before"]+","+z}A._addControls(z,m);w.add(m);k.deltaHeight-=B.theme_advanced_row_height}q.push(w.renderHTML());q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{},"&#160;")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize",tabIndex:"-1"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager,k=j.undoManager;i.setDisabled("undo",!k.hasUndo()&&!k.typing);i.setDisabled("redo",!k.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}r.setActive("visualaid",m.hasVisual);y._updateUndoStatus(m);r.setDisabled("outdent",!m.queryCommandState("Outdent"));C=o("A");if(G=r.get("link")){if(!C||!C.name){G.setDisabled(!C&&q);G.setActive(!!C)}}if(G=r.get("unlink")){G.setDisabled(!C&&q);G.setActive(!!C&&!C.name)}if(G=r.get("anchor")){G.setActive(!q&&!!C&&C.name)}C=o("IMG");if(G=r.get("image")){G.setActive(!q&&!!C&&D.className.indexOf("mceItem")==-1)}if(G=r.get("styleselect")){y._importClasses();j=[];f(G.items,function(n){j.push(n.value)});i=m.formatter.matchAll(j);G.select(i[0])}if(G=r.get("formatselect")){C=o(d.isBlock);if(C){G.select(C.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!w&&p.className){w=p.className}}if(m.dom.is(p,z.theme_advanced_font_selector)){if(!k&&p.style.fontSize){k=p.style.fontSize}if(!u&&p.style.fontFamily){u=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!B&&p.style.color){B=p.style.color}if(!l&&p.style.backgroundColor){l=p.style.backgroundColor}}return false});if(G=r.get("fontselect")){G.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==u})}if(G=r.get("fontsizeselect")){if(z.theme_advanced_runtime_fontsize&&!k&&!w){k=m.dom.getStyle(D,"fontSize",true)}G.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===w){return true}})}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_path&&z.theme_advanced_statusbar_location){C=d.get(m.id+"_path")||d.add(m.id+"_path_row","span",{id:m.id+"_path"});if(y.statusKeyboardNavigation){y.statusKeyboardNavigation.destroy();y.statusKeyboardNavigation=null}d.setHTML(C,"");o(function(H){var p=H.nodeName.toLowerCase(),s,v,t="";if(H.nodeType!=1||p==="br"||H.getAttribute("data-mce-bogus")||d.hasClass(H,"mceItemHidden")||d.hasClass(H,"mceItemRemoved")){return}if(e.isIE&&H.scopeName!=="HTML"){p=H.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(x=d.getAttrib(H,"src")){t+="src: "+x+" "}break;case"a":if(x=d.getAttrib(H,"name")){t+="name: "+x+" ";p+="#"+x}if(x=d.getAttrib(H,"href")){t+="href: "+x+" "}break;case"font":if(x=d.getAttrib(H,"face")){t+="font: "+x+" "}if(x=d.getAttrib(H,"size")){t+="size: "+x+" "}if(x=d.getAttrib(H,"color")){t+="color: "+x+" "}break;case"span":if(x=d.getAttrib(H,"style")){t+="style: "+x+" "}break}if(x=d.getAttrib(H,"id")){t+="id: "+x+" "}if(x=H.className){x=x.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(x){t+="class: "+x+" ";if(d.isBlock(H)||p=="img"||p=="span"){p+="."+x}}}p=p.replace(/(html:)/g,"");p={name:p,node:H,title:t};y.onResolveName.dispatch(y,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(F++)},p);if(C.hasChildNodes()){C.insertBefore(d.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),C.firstChild);C.insertBefore(v,C.firstChild)}else{C.appendChild(v)}},m.getBody());if(d.select("a",C).length>0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:260+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/editor_template_src.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/editor_template_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/editor_template_src.js	2012-10-30 15:39:55.595443698 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/editor_template_src.js	2012-10-30 15:40:38.377442147 +0000
@@ -593,6 +593,11 @@
 
 				if (evt.altKey) {
 		 			if (evt.keyCode === DOM_VK_F10) {
+						// Make sure focus is given to toolbar in Safari.
+						// We can't do this in IE as it prevents giving focus to toolbar when editor is in a frame
+						if (tinymce.isWebKit) {
+							window.focus();
+						}
 						t.toolbarGroup.focus();
 						return Event.cancel(evt);
 					} else if (evt.keyCode === DOM_VK_F11) {
@@ -752,7 +757,7 @@
 			each(explode(s.theme_advanced_containers || ''), function(c, i) {
 				var v = s['theme_advanced_container_' + c] || '';
 
-				switch (v.toLowerCase()) {
+				switch (c.toLowerCase()) {
 					case 'mceeditor':
 						n = DOM.add(tb, 'tr');
 						n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
@@ -869,7 +874,7 @@
 			
 
 			if (s.theme_advanced_resizing) {
-				DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});
+				DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});
 
 				if (s.theme_advanced_resizing_use_cookie) {
 					ed.onPostRender.add(function() {
@@ -936,10 +941,10 @@
 		},
 
 		_updateUndoStatus : function(ed) {
-			var cm = ed.controlManager;
+			var cm = ed.controlManager, um = ed.undoManager;
 
-			cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);
-			cm.setDisabled('redo', !ed.undoManager.hasRedo());
+			cm.setDisabled('undo', !um.hasUndo() && !um.typing);
+			cm.setDisabled('redo', !um.hasRedo());
 		},
 
 		_nodeChanged : function(ed, cm, n, co, ob) {
@@ -1095,11 +1100,8 @@
 				getParent(function(n) {
 					var na = n.nodeName.toLowerCase(), u, pi, ti = '';
 
-					if (n.getAttribute('data-mce-bogus'))
-						return;
-
-					// Ignore non element and hidden elements
-					if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))
+					// Ignore non element and bogus/hidden elements
+					if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))
 						return;
 
 					// Handle prefix
@@ -1223,7 +1225,7 @@
 			ed.windowManager.open({
 				url : this.url + '/charmap.htm',
 				width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),
-				height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
+				height : 260 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
 				inline : true
 			}, {
 				theme_url : this.url
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/img/colorpicker.jpg 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/img/colorpicker.jpg
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/img/colorpicker.jpg	2012-10-30 15:39:55.596444035 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/img/colorpicker.jpg	2012-10-30 15:40:38.388444230 +0000
@@ -1,19 +1,6 @@
  JFIF       >CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
  C 		
-
 $.' ",#(7),01444'9=82<.342 C			

2!!22222222222222222222222222222222222222222222222222  ,"            	
-    } !1AQa"q2#BR$3br	
-%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
-   w !1AQaq"2B	#3Rbr
-$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? 孇JضY6k[D{nկlzVEjַ=+ȯHٶ=+^ٺV-ZҼ<,C4پAUejZFX@qEyZjĆHk>sҚ)R!@TJ~jrc4u<IRe5"MH
-%u5"MJ
-c(Q=j<U־({UzǹZ&z${Xx#d\p:M^&%-]^^5N3OwZ\VXRBD*b+s>"Bv#cqUTL*f
-qLXTL*v
-Qf@£"aL#BLn:Vj̀t8;WZ'^fjշ=+*ߵizWZ'^FZұ=+R^]h-vhEVB(5r Y
O!!!@q1+ާ)1~:<*MD
<MH
B
H
{c'`xWZ9^ᩙq޲;֤.~ёЉp:UZ󎵗8^֠j֠kьâh֭F*֭F+#j1\XT⢌T=ЉF¥4YԦB£aSQ^$LFELE0MTPjτt{W
XUiPv(J̇hzWV'ZFi@+*ҴanՁVfoUy[s"sUL xC!Vs]0b"BǚPi(5B:T(4j j@kã'Pj@ji׷2p&9Vz׳E53Y)tґQ8Y8YҙQFL֡j֡ECנ#Zj-e91VPT(*
-o"xMڢASc-f#5)+3Lab
HRL"ZSE2#hCTz˫25	&*D*фք-ҳ!5~&
-<ʬ[8*j0<nj@淌""sUj"HZp]y^fJ
<p53p&1Lk֤ԣ5PuU	Ч#ѥ>aֳ(3ԥ2ejQ"bEE-XAYgE *$:
-ZT☂9hzԧ*B)WY
-dDSH^EcE2")H⼚R
-TUȫ<ڳ.EWb5J*:</DjMYњWH}F\-.ԥv٪5`yQJơc[V$g(4yPԐx54kӤp$
D
<H
W⠐ץM!NZ-]]wRFQT~ATNgIүZȵuzZ5VQYgEAST+LHIژXNZ90a)^uVlFE0iU-Ln*B)6Ե2x[F*uTf:՘r'Ic5j6Hjm\QqQRf1ұ֪D5DƞƢcZ"0zҊޜN7Ӂ8麗p$
F
8K&j
IC]ajVIVު]pNITUZA]PN%U-1V;iUR*Ԫg}1TT)*UNCT⚢+HE4iQ)M""Ey
-S#"LWJd*T(*t	̝*:NYȴ#UD5:5a(eSYƢcJMFMhrMƣcN&&P8Z\Љ<Piӳ]PDr
G\dI;5RSBYWqVT+3:1Vu:`UP"@*@*θHrv) Ⲕa*B)W4٢)TR\)Ln*LRb&%QS-FZ	Lje5
-ԋY8DjejVdnZ@CHM4	 &MIP9	6֑晚\D.i5EI.ikxP#jVڵR6HXT,*
-jmVei֜CBND Ss:# @r7Rb+f)1O&+	3VC<P(s)8Ap!mԅ=ԛ!&nL3hRi	&i74fDA٥74f!r.ih~ifÐCL4HjP#"EJE42HJmZDaiSsDN1K! .)qSZRbLT6W8Rb1PÜf)1Oq*k,4f)XAE v %QaX(,AES asIEI(Rb((E]1F(R((p)bQEvPg
\ No newline at end of file
+
 $.' ",#(7),01444'9=82<.342 C			

2!!22222222222222222222222222222222222222222222222222  ,"                         1A!"2                          !"   ? 4xzu!^Y:5x o(D\;>5ӭF"3F_fX(˦>ZY9(r֮JFDw&m_YcƟD343^*晚FiE1/}K_oC~?G+?]#}7\y8Ly3۳OnO=c<O'>g?L #2Ŗ(ǖ8\SGlq=\Qq-kZ+PByL2lNZiv,yBYǞO=:|Nu<}9^?O+DWקu85h΍4e4`IYy)rQVJEy2g4ХǟD34G)ddc'b/93Ng> \	9^Dyۯ=|ٮ6:N?dq峟>ɌuC	Wcv>\p8]hW?M+B
%䰥bu: 䚫]X^5pON?ztx~E[Yp_NgG-E;Qྜྷ.
zr/G^uF]1Cay? W&)ۢb'rSYD	9'Wr\pEUr)qѓ)2S92sm2g8ǧ;sCLdsno<snw4cG'>_>}oǖ8V2ьqqƜBqqU?Cx9KaG!+av`,$+`,6XKYzt8XwM$W]q7HZ:<5ק3h,՛F+0/ut7[
+6BYNg0(E_b(gmGeJ9MFn9JRftLy9fcci掗,`Rs9V2͒Z1Fuc|XFBV6b1
=׃lv,
{0b
+64V*tmUuf(8hٳq6qPzHJ7qV-9u@~u.iPw7G`YF麤귘k"RQ9HG%)LEr(3ȣӻ#f鏕ntyc,o|fv0\/iyȵ~2Ac'b9;1X!Ƭg
33wh,.՛+`,6YubFXt^V?5qƮ6Yqз zQqAn f]~3PZjTV 4@ꕪ=RZ @(oJ?4QE)rQp3y)GC$ǦnFNF63rAQaɇ%-r!_g'f+979Q~es;΃35A~`l2Fl]a~=bh؍'3v?
?=H-ѫd?aP
lu
h?LzjhZh%
_mA*T")K}vV/tT2Lz'l?dDDIqqpaQ&Mf[+&Yə2d;L3!(.(,t*,
X[4V`K,]ΕKEʭ U٤̲rcT?44铃f*ڲ
+D6u %Z2pkiy93Wu["z'F5Tm2'PFB6fC2vfҁ;7 QD$Hto6J}+4}ҺJt> H@( UGC%2iGt_WO;Uhһw͢U]Q;_a;YIO_a;]#vha]'TUUeE`l]Yu"nU2uʿ˿e2)W}&]'N}TT}/~t>ҍt>>]DDXE'DӴG:8O'D'i#:9:'H:D;DCڑ'DWHވ (:ND퐝/D;'dDG	'I"N"
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/img/icons.gif 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/img/icons.gif
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/img/icons.gif	2012-10-30 15:39:55.596444035 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/img/icons.gif	2012-10-30 15:40:38.388444230 +0000
@@ -1,15 +1,15 @@
-GIF89a<   9c§   n%4O8*opqyn4Kcpz1QﮏХX̣XݹpQQRԚ=8)؊Ssb/i䴕T|ՍxY.-Y]fr[vOmAwl𑣹tlaUOPhĸ5f-M97ϰQϨ˴g急ٺO5`pˑ6MGYur虙Rkƴq*KKzBRc򅊝򨩶suRyMFH|lOf>봱0ChBgd}ΓR{kW@Ks@`A8?g..<<?1bUbbSaԯԓsK  Ѝلě ƘOq!@x_oBf gd >QkܱS"X^Sp%c WnNX	9Lp𨸸Jvc"Zڎr̦PUg2Rr6[[Z?ː()'Р`!   ,    <   	H*\ȰÇ#JHŋ3jȱǏ CIɓ(}ԨeC0cʜ)ʛ8sɳϟ@
-JѣH;x`iӗJJUͤXjpQ.I((ٳhܥKۋ*6ݻx~vu^~
LÈzM3]u؉\*-z(g0.ti ?
ĺHlጐ򉧏%|*s|z > dF萑ą6J{kL8dD.\ {=VѷGhqK.rp	Vham.
6f@H A	 C$aD	TleBj<~GV}I
 9I	5>jT 	#dIq1CD, a f`fjV" p	gDP5Yt 'B!(!ߠUFޑ G]] GFtX
+GIF89a<  `   n%4O8*opqyn4Kcpz1QﮏХX̣XݹpQQRԚ=8)؊Ssb/i䴕T|ՍxY.-Y]fr[vOmAwl𑣹tlaUOPhĸ5f-M97ϰQϨ˴g急ٺO5`pˑ6MGYur虙Rkƴq*KKzBRc򅊝򨩶suRyMFH|lOf>봱0ChBgd}ΓR{kW@Ks@`A8?g..<<?1bUbbSaԯԓsK  Ѝلě ƘOq!@x_oBf gd >QkܱS"X^Sp%c WnNX	9Lp𨸸Jvc"Zڎr̦PUg2Rr6[[Z?ː()'Р9c   !   ,    <   	H*\ȰÇ#JHŋ3jȱǏ CIɓ(}ԨeC0cʜ)ʛ8sɳϟ@
+JѣH;x`iӗJJUͤXjpQ.I((ٳhܥKۋ*6ݻx~vu^~
LÈzM3]u؉\*-z(g0.ti ?
ĺHlጐ򉧏%|*s|z > dF萑ą6J{kL8dD.\ {=VѷGhqK.rp	Vham.
6f@H A	 C$aD	TleBj<~GV}I
 9I	5>jT 	#dIq1CD, a f`fjV" p	gDP5Yt?'B!(!ߠUFޑ G]] GFtX
 %`d;^ڑ38HD(qm4 fH뭺jPkFt &aH .@A#
 	1o	enB,l0A@ i3%PG?P
-L0ލ NN5\s^S].jB"D$#rwBPChD W2{ѳq&D@FfE}E~!&sq.$zԉDG TDjB= #61J*k__$%H-CvI|FXK&bBV/K3I:'@0BGG\8K7+D5tLP/r<S}Rι	6l6@0'
-C0~/o/'Z}~/5ɇcB6@!A@P{Z@F	6rqP A 4*`ЈU
-AX;RFZ!A \9Ґjy8okh8n)$qjW.>}iܕH6.*T'5C)F(@ 7	I-n@@"'
D$(Qq$`p^_!^Vt/r=MӘב&4A|R!PG'"LPUޔ+V|\ߠ| Yr?1:c I7M?CN.S
2e@}D BRL0 A38H!*y.`PC2$v1)y悞-sfvx Ģ״EAD 0/X }ַx2Fw %:O tq&.M LSzp@6(n ?h8Qr+~T2[i$E<Je+ @p;9nÖJ^>g?-((Dla0B
+L0ލ NN5\s^S].jB"D$#rwBPChD?W2{ѳq&D@FfE}E~!&sq.$zԉDG TDjB= #61J*k__$%H-CvI|FXK&bBV/K3I:'@0BGG\8K7+D5tLP/r<S}Rι	6l6@0'
+C0~/o/'Z}~/5ɇcB6@!AOP{Z@F	6rqP A 4*`ЈU
+AX;RFZ!A \9Ґjy8okh8n)$qjW.>}iܕH6.*T'5C)F(@ 7	I-n@@"'
D$(Qq$`p^_!^Vt/r=MӘב&4A|R!PG'"LPUޔ+V|\ߠ| Yr?1:c I7M?CN.S
2e@}D BRL0 A38H!*y.`PC2$v1)y悞-sfvx Ģ״EAD 0/X }ַx2Fw %:O tq&.MLSzp@6(n ?h8Qr+~T2[i$E<Je+ @p;9nÖJ^>g?-((Dla0B
 q2
2S dI
 bM"fE7
 1#F&$
40 5
-W[6EXv\2UI'ZcփTK8!=[5H0ZiF0ъr	0nKQ%i.Ep7PB.p̲Zfsl!x@J0! , \#8*N:&[@}G
ڙM6A҅2b	 ,gq喅<A" Hs`9W2j]Aq:XxDBV&f,D|?&'fĺ풡e3EEɵa3Zط6 4aNho,d@>CnKNg4A; dDqB[6fjD\7!T0]\H1TkZú ` 	R =1$=mBqB4 6\!EMC"tU	Ә(H"$-1q!XWMT4%5v)JiKfz[/{ɴ."]P"1Vm#FOLr?ιdOsdr31d1#r B.ApfXlL)HMxlWe8NzSa^rsVV_
+W[6EXv\2UI'ZcփTK8!=[5H0ZiF0ъr	0nKQ%i.Ep7PB.p̲Zfsl!x@J0! , \#8*N:&[@}G
ڙM6A҅2b	 ,gq喅<A"Hs`9W2j]Aq:XxDBV&f,D|?&'fĺ풡e3EEɵa3Zط6 4aNho,d@>CnKNg4A; dDqB[6fjD\7!T0]\H1TkZú ` 	R =1$=mBqB4 6\!EMC"tU	Ә(H"$-1q!XWMT4%5v)JiKfz[/{ɴ."]P"1Vm#FOLr?ιdOsdr31d1#r B.ApfXlL)HMxlWe8NzSa^rsVV_
 [jS5̎]@ºw_2aE@8C ͺ(ebY͠sA"GdfC" 9 SH$4H b7JSֈX ]SĦVԉ7JJ(]=QIO"$g!լ5rEY]#8$q@ 
-AT^3Y?gE{K#tA5.g9OS"FPtZ@t$FrP V r"d^".ufPh@Pj 6yJ 1zL  y!kqwNc'waTt9 3x$ (b|FāGEPzpWPsAG@
7'8h wW7qaaL !6${gX6|T0s37drUuV>{	W}AqG+}'Aq+s(gc7|#vG@Bt  tQ 3]g>
uǘ>Y',Udt^cŅlUR(j!hP ).rn$jv@Q<\-Cl1&yEHG͐
f  $p S`2b&iXexquA1!`cacsov8W#wMp-%6p͕SUOX#lc(l1#	=7W=wWhwsK \ P4x AP kE8sTiH`1C.W]vQ8R{YGųG
( XY8S@	4ёU!i8{qTUӅry&.@qNh>4y&H& fW3U ^<bZ銷Y jeCOĩJ'799X	h9Y8)AdO֒F"@
+AT^3Y?gE{K#tA5.g9OS"FPtZ@t$FrP V r"d^".ufPh@Pj 6yJ 1zL y!kqwNc'waTt9 3x$ (b|FāGEPzpWPsAG@
7'8h wW7qaaL !6${gX6|T0s37drUuV>{	W}AqG+}'Aq+s(gc7|#vG@Bt  tQ 3]g>
uǘ>Y',Udt^cŅlUR(j!hP ).rn$jv@Q<\-Cl1&yEHG͐
f  $p S`2b&iXexquA1!`cacsov8W#wMp-%6p͕SUOX#lc(l1#	=7W=wWhwsK \ P4x AP kE8sTiH`1C.W]vQ8R{YGųG
( XY8S@	4ёU!i8{qTUӅry&.@qNh>4y&H& fW3U^<bZ銷Y jeCOĩJ'799X	h9Y8)AdO֒F"@
  IsGZoaܥu-]cr7Aaoo.` v衜NWFq.!av7AO0m , [Z\
 [qIv4b#!b*٠~ :
pL`ڧ$ Xr~
 xQ8x9_
@@ -33,47 +33,47 @@
 Vpl <-`@`@1
ƀE
 H`4}pÛ pZ`]rP>5pl0vxq  8+ aL hl
aǋ]"-
e
 =^ϐ AﲵqUkȭ`P?mp9 m-0Sb(qQ'@v!]lO n @P
  Mk
Թ=;[JP?  </;P;`6]0ί3"^j
-ϟa
2>;rt&6a_]+AQ	L1!R^0 ?t 
 ֽ&.`ow-NP 
LpWP
|n ې0VP[r 0`/p ` nH NA	1p#&0:٭
ps0@i9߿OHdx0C<
t3PXO2|c^zEV2BEdg/6K#`L_A}!kQ&LpӠƥM&ݸUYvj#M ,$H.hc/RFJ{r#Xc!zZl*x`a!%N!%
-tQ
-~r HR'OiGN
a5Ҏjas(>ܫnԆR{:Buތ"'Lɑc|WlN?]=OR8 RUX 8	 `'	&
0v!(>5Fh +pE* )$6 /sܱG>x
-5" #| %|HuǤrˬ$tJA`G0`Ǖj@
`2h83G
-xk^hKأx^!6zo
-"tv`>@jJ\9ܠu4Xa0dڨcX4V
-$$lAMgOQOiѢ[8PVK $ZYhFe.&|$H2I"y+C:L$Cxv؃n2x'{'`23^1<JKAAt^䊀.)"+Kg$
-Y1.yL#6.hv7<Y#䑴 ꬓ!F2 j'F`q!
P;P0 
fjaQZ .e:Qo<darOXS%ƙ1JQdoP.,|*ggpj0>|-XI}#>jS)eZ҂h 
&>&C^3"߈ &IY$
B_}eUz/{}OGJ-A46ax T;y/Gg04  (aH3xCB1Q
pؔ.dp`jd0DatArt0Jկ^TXoA$ 2BA[xHȭʴc@
-(ĺ6.	FfND -C'"2	W-`bIiF1vB E\)1EIe*bj2B.^d'vHJRd"IԌd< $@c6gMp(ZdGd87gǃ!QC6	6lh;9v 'VФ@pZĥ2ԡHy2!mC 4nwpa!(HсqHaG8'8r3Y`9	kHցϩ&T1<ZCU50( 
-E5o2$7ܲyX܄J8`+aa:Ba7N kC%G@V 	Le1{ЯelaKFA=8Z~`&( vTNvJpP   e`T(
-	B"fIE#a/8uxjYhF!#A+`!Z䢯`"	a5DźF_4^C3adQs(GpEx=#-8h`H{.8H"Gz-zZԢ0J)R'.@X%ɕkK\2IL:eSDrLK◴gpMNęf8
G4p[@zD@15ORcèFBFZX$(1hi!V2OtvIxp0Ci0Bq Àf4pIMq't#V Tc3De!CɈ L
-$h?
-pGՂ d2\	H@ C 	V!h]2<ws6c`ZЂO`>?= hO
-şpFaw82T\^W>xF8Ab[n . @-н@BN06 	!`QZ ^.
7U7OpEhDr^0ӨBpx$\C	̂@DlDR/pAGkA9)`?dp(?NlR56Na-ؗ?|dy'?fQiZRZQ>rB}X*Ie1f#d1 @b`Np3O5uO
-/tuj'D9byj	Y1i`K	KK@@_  4MxS#( .H5]^^akhb66?`)hh ;1i*UlSnCbp7ۈ+`P`K`H5>F V7!7 
?> 09>C*E\#D\7PĊ'9?A,ęD\Fřߑ:9"SSZ` X
p./h + YAHX<_􂧋:Dp1'^:Jh˅0ӆ$;+x/+0s`)ʻ"
xIW Z @i <.P<%@1
-Ppp#3H0xo:K.#1"8ט	E#cH {8AHR[A3Ky# 	,fϚ		JɆ`
-X;0JHJ
-(>02#R k˙I1xbzs?lBӃ73N?:ӿz>4>0C+@M}X
-r@dw:4dQC
-p 0<
-耰y+<pص8h
-8Ɂ븎&hS@ Yu~ 2UX6o˂p{
->V0-> >'(
-;! @h   C }݀EP&7xgU	ͨ
-NTP%zP{p5HHBx"`Уm@ QWXpCfxJd$ҧC>H:l0j܈m
-^7h'h @4Xǃpp/+sdGZ 0 z 	,K!%X<D
-hY<@ȉș'8
-2 ˤA($TM׌M{ޫɍHlWJ%
-XJ	8SU 0VYJQk*&J)˷'VU3X x˸3KZˣKCˆ3 (К`C@{Ec L D
-2̩̍@Xe1nVTmXMMd
? T`( Q:T.B08'1$½<dxɨ  [YϤ"D5U[,J4S 1E[ۺۼ۬h[=۷e($8ddL),[< Wp!/@mh ǨEh(]эRiF'kdHaR!8S X G
-/4σv x<վS0GZ(TC%*(@HgTK|hLTlJ`(p  (VB:o=E^x{ZY>ٔ׬ՠ`([ =dfݿ	`a4H\&	?mʮJ	pVr^&\ yso?]Y}}0lL;ၚA[,J Ym /c\`x<'ciɄ6BhL8h
-~:S` S**
->
-݂Kd7uՊ
-[@"[M[7X[&lexeǒ@,[`¥%Z XmBf\! H$
uFhe݈odh؃o]G \ph8(@`-ph|LE
-$(<(qPHMITK=s6C#(uQCՆ`~cm~1iI#>vc~{8&֊_%0p"~.P^Ra"Fj'aQ>#p&K|?#"#Y>:;p@TTH,J[KpVu }(&Ug	[k֊;h
-XB(F`N{JPŐNli$ʙv,ߖI
-ʣ8قׂPB
-Wn
-x8g'o,0MGɨ~n7-)SSjZ@ZHThG]<@ 䂐
-Tf_8H 0(NM|MM&Ԏʖl
%Ȋ	Pj^Gfqpq^᪶j>EpJ 
-r&Snr[m)Ͻ!x^,r-r2i
-LӞr~m s9s:7٪9 ݨs>7js:J}AVHtE_DU/4ɰk|LLPCuR/uS?R/CuVouWuXuYuZu[u\u]u^u_u`vavb/vc?vdOve_vfovgvhvivjvkvlvmvnvo#vs?wtOwu_wvow9G q?_xHB@YMwwwxZ^(HF+N O_xxxxzg(+Wy#Bxxoyy^w'H+h7JJH7rz/z?z=_+  $XzzzO@(t hO;X@{{cY{{?$XUŇ!Ƴ{ȏ|ɟ|B Xz}F|}/}gO}]fTKO0}}7zWgWKgTF=Ym_~o~wOXOGY~~vwG׆[ouxx|~LOHjD ],h 
-2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*WX׃2gʬp..\tMh'РB-j(ҤJ2m#_4D*֬Zr+ذbǒ-k,ڴjײm-ܸrҭk.޼z/ ;
\ No newline at end of file
+ϟa
2>;rt&6a_]+AQ	L1!R^0 ?t 
 ֽ&.`ow-NP 
LpWP
|n ې0VP[r 0`/p ` nH NA	1p#&0:٭
ps0
+ q¿p!`"xg>(LNMdd&rϠ-_`$A.4;F`&M|
+TLEMAH25qTQ&Bu1#F$ @XH ]^$Ʈ_"BYٳ*T`0*
+Kb_wCJ2L(@DdO̎ m{
y(@Q`}WhNtUT
+GjKuU9E	'NL#x཯'4~{?>'	!`
! 0 "`TA$hA%z`-44ll``J 2V\Q
+*(J	f(
6 Fq1'~B:gH"0I%sѨ**<-	1ݩ8 d q#%`&+NG!;B?0.DxB"`7ڂ-ra5+D7bMd V%0j$!b0g΂ēh "V5zF"`裐FH؊0Ǌj榜 a@ۄ	by'bl!do⨗"KcG谂'w>K{Lbf6t-!Oi!y,H$j\{ǅmlL>aI&ganH "=HCZe:K`pάFdK'E	qfR٤>ƛ$"jY,F,|aVLǈaJ]!%rnɃ	E;(1" 1$Ix|??W`}d~~oGHj	D <&isX'9i{6: 	 (IB 
v0Z R
lpM vЪRU&[%7rC`)V2x_
+bK? iVQF@B@lIFCQ@qGh ЅuMx6"pu"P	:G0!OjE 
3J3D'@%*GYPCh)2+MTI-oyd##M9ǌ$#	KGf! q bS!:cD6`nvgDYc: 8A	:ď
+aɮ}-lc+AI$<5eb4-Ff#8↷r(c	9@:+
+;8
+7UΧLBZrN576
+u  ׭!yDrG D(|A
rc1&5&RFey+X[3Q	!t"@[r׼z{k`g	H`
+~_d'[Y{kb+B0
+-'ֶ@ ACqSW3}@4`D ,pB!PNÄ<Q
{`SB3
+1Kt^W	bwIJ!_5gI!s9C8`[((QGha`(L<E+AwaE:G0rSl6THtmUDy%7Y%uA0(F-IY֒L6J/0Ț$Be"DW/9{#mr͜079E%[YWȓ wNHm[E/ b&i"0KbiwB@ӳFB;x:H
+$F& (G!Qhs8	jBtQpHFB7:U8@Q*L@wb H𻲎@pՄq$״y@v{ KpE#0&9Vl&$0
+ 6"'"1&(f15D
&D]o0t G
+(
+p)aHrT8hhݵDrlb6%!U`bE'6 WzezƘF#J 0d
+P$#Yx8N!M;LD P1t8Ay,AjS0VI@eL^Գ/58q2ҕr2c3`Q}/*ƈ<~/g"CbchvL*8?|QxTB38JwR'A41iHI'(JJ/@_ #3ÅK`R>.0;[)]\_Sha66?`)hP;/Q*UBk;l+Jn `؂8`K`05>zF2V7!ط 
=><C*C\đۓZ7PxDD&!D>C@DDCDDEDޑغ
+SSZ`9X
X./h +W)0:W$9^s:Dp1'^zHh!˅ӆ #j;+`/+0s`'"
`IV Z;@i.8<%(
+PXX#30vn:<
+K,#1"8ր	EcH$c= 0AQC3J$y#萓셔f	΂ɟIHX #Jʬ0ʬሌ0#R SJ1x`z[jB63N8?b < 4AK}@
+rx@@Lu"LЇO+p 0$
+ y*$X)558h
+8ꠎ&PS@ YuxB  2UX m˂Noci
+>V-> >I&(9!A @h AOd-܀-І$ɸ7xgD=(	PM<PbP{XP0HB`"HPm@ QWXpdx2RcRC>H:l0il.]7P'h @4@GpX/+sdGZ0Ѐz ~K!%@,fAp(0sHH'8
+h2ʌ
+@<Jtc1ݓI0MTMVV2	 VRAʤ飘9)ۈi K'VխV2X `K|XK@BK(H'B?{CcL ,(LL@؉M1m8mRmІV}͓uMd?<B`(  9T -뜛.N ' O0+<dxȨ  ZYO
+DňP=ۆH4S 1EЂs[[[[P۲m[%[M$  cLL)Y< Wp/@mhFƐEP(ugF'؈iLFaR! ҄SX
+/4O;u|`^;>S0;GZA
*@GufK|PJ}#ԉTJ`(p(XVA:݈m-Yɾ^x{Y &YuWU_('[%bm
`eſ	`a4H%[웦 kJop^\ys&n3Eـ}}0TL;`@[*JU .b\ px$N&gɄ6BhL8h
+ :ӭHRN
+>Њ݂K 7t⽊
+[(b
+ۢЁ5[7@$Te`Œ(eeZneHeee
f B X=m@fR0.#fuFh Mmdhn]G\ph8@H-hSoڂ^{4h-
+$<(pP0e5HII%T[_5C#$t9+UHcfcmpcfgI#i&^|{6~c%
+^
0X>!~a8jFj:a".%kፀ aQ &#X˚ijd# !"A(s8;X<TH*J3^o>cu }$eiڞʾ :h
+@«(FHD~6
+zʨPhLi Jm^~mI j-ւO*
+Wn
+x n'Ɔ*]./MG]Ȩ|n5-"(hZ@Z0TPFE<@ 
+ԋN߽<ы pH 6d̞?vJl
Ű
+։8^G%NqXiFaꄨ-
+rrЂɦQVr['= r`*+rri
+L ҆f78ؒې<j 8TIe?V0CGtC-crȘdqtJq4d8mBPQ'uQ8+TWUgVwWXYZ[\]^_`a'b7cGdWegfwghijklmuzk"q'r7sGtW7Go'_`;HB@Yu}~xY^pwwHF+N O߀xxO(+Va#BxWgwy]wH+h62JH7p'זGz+  #XxO@(t hO;X@w{bY{'$XUÇ!ěwǇȯB Xz{DO7=]NTKOjҷ??xxOD%YmyGWw 7X/Y}owGO׆[~Wgvx|LOHjD~,h 5z=h	Ņ	7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w<Ġ
,j(ҤJ2m)ԨRRj*֬Zr+ذbǒ-k,ڴjײmӀ ;
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/anchor.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/anchor.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/anchor.js	2012-10-30 15:39:55.597477853 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/anchor.js	2012-10-30 15:40:38.389441905 +0000
@@ -30,9 +30,10 @@
 			ed.selection.collapse(1);
 
 		elm = ed.dom.getParent(ed.selection.getNode(), 'A');
-		if (elm)
+		if (elm) {
+			elm.setAttribute('name', name);
 			elm.name = name;
-		else
+		} else
 			ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, ''));
 
 		tinyMCEPopup.close();
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/charmap.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/charmap.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/charmap.js	2012-10-30 15:39:55.597477853 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/charmap.js	2012-10-30 15:40:38.389441905 +0000
@@ -281,13 +281,21 @@
 function addKeyboardNavigation(){
 	var tableElm, cells, settings;
 
-	cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup");
+	cells = tinyMCEPopup.dom.select("a.charmaplink", "charmapgroup");
 
 	settings ={
 		root: "charmapgroup",
 		items: cells
 	};
-
+	cells[0].tabindex=0;
+	tinyMCEPopup.dom.addClass(cells[0], "mceFocus");
+	if (tinymce.isGecko) {
+		cells[0].focus();		
+	} else {
+		setTimeout(function(){
+			cells[0].focus();
+		}, 100);
+	}
 	tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom);
 }
 
@@ -306,7 +314,7 @@
 			previewCharFn = 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');';
 			html += ''
 				+ '<td class="charmap">'
-				+ '<a class="charmaplink" role="button" onmouseover="'+previewCharFn+'" onfocus="'+previewCharFn+'" 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] + '">'
+				+ '<a class="charmaplink" role="button" onmouseover="'+previewCharFn+'" onfocus="'+previewCharFn+'" 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] + ' '+ tinyMCEPopup.editor.translate("advanced_dlg.charmap_usage")+'">'
 				+ charmap[i][1]
 				+ '</a></td>';
 			if ((cols+1) % charsPerRow == 0)
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/color_picker.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/color_picker.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/color_picker.js	2012-10-30 15:39:55.597477853 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/color_picker.js	2012-10-30 15:40:38.389441905 +0000
@@ -1,6 +1,6 @@
 tinyMCEPopup.requireLangPack();
 
-var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false;
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
 
 var colors = [
 	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
@@ -266,10 +266,10 @@
 }
 
 function computeColor(e) {
-	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;
+	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target);
 
-	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);
+	x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0);
+	y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0);
 
 	partWidth = document.getElementById('colors').width / 6;
 	partDetail = detail / 2;
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/image.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/image.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/js/image.js	2012-10-30 15:39:55.597477853 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/js/image.js	2012-10-30 15:40:38.390444462 +0000
@@ -18,7 +18,7 @@
 
 		e = ed.selection.getNode();
 
-		this.fillFileList('image_list', 'tinyMCEImageList');
+		this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'));
 
 		if (e.nodeName == 'IMG') {
 			f.src.value = ed.dom.getAttrib(e, 'src');
@@ -39,7 +39,7 @@
 	fillFileList : function(id, l) {
 		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
 
-		l = window[l];
+		l = typeof(l) === 'function' ? l() : window[l];
 
 		if (l && l.length > 0) {
 			lst.options[lst.options.length] = new Option('', '');
@@ -90,9 +90,13 @@
 			tinyMCEPopup.editor.execCommand('mceRepaint');
 			tinyMCEPopup.editor.focus();
 		} else {
-			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});
-			ed.dom.setAttribs('__mce_tmp', args);
-			ed.dom.setAttrib('__mce_tmp', 'id', '');
+			tinymce.each(args, function(value, name) {
+				if (value === "") {
+					delete args[name];
+				}
+			});
+
+			ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});
 			ed.undoManager.add();
 		}
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/langs/en_dlg.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/langs/en_dlg.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/langs/en_dlg.js	2012-10-30 15:39:55.596444035 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/langs/en_dlg.js	2012-10-30 15:40:38.392444563 +0000
@@ -1,54 +1 @@
-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",
-anchor_invalid:"Please specify a valid 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 be an external link. Do you want to add the required http:// prefix?",
-link_list:"Link list",
-accessibility_help:"Accessibility Help",
-accessibility_usage_title:"General Usage"
-});
\ No newline at end of file
+tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","":""});
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/langs/en.js 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/langs/en.js
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/langs/en.js	2012-10-30 15:39:55.596444035 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/langs/en.js	2012-10-30 15:40:38.392444563 +0000
@@ -1,68 +1 @@
-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",
-
-// Accessibility Strings
-shortcuts_desc:'Accessibility Help',
-help_shortcut:'. Press ALT F10 for toolbar. Press ALT 0 for help.',
-rich_text_area:"Rich Text Area",
-toolbar:"Toolbar"
-});
+tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition Description",dt:"Definition Term ",samp:"Code Sample",code:"Code",blockquote:"Block Quote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"DIV",paragraph:"Paragraph",block:"Format",fontdefault:"Font Family","font_size":"Font Size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More Colors...","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Block Quote","help_desc":"Help","newdocument_desc":"New Document","image_props_desc":"Image Properties","paste_desc":"Paste (Ctrl+V)","copy_desc":"Copy (Ctrl+C)","cut_desc":"Cut (Ctrl+X)","anchor_desc":"Insert/Edit Anchor","visualaid_desc":"show/Hide Guidelines/Invisible Elements","charmap_desc":"Insert Special Character","backcolor_desc":"Select Background Color","forecolor_desc":"Select Text Color","custom1_desc":"Your Custom Description Here","removeformat_desc":"Remove Formatting","hr_desc":"Insert Horizontal Line","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup Messy Code","image_desc":"Insert/Edit Image","unlink_desc":"Unlink","link_desc":"Insert/Edit Link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Increase Indent","outdent_desc":"Decrease Indent","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","justifyfull_desc":"Align Full","justifyright_desc":"Align Right","justifycenter_desc":"Align Center","justifyleft_desc":"Align Left","striketrough_desc":"Strikethrough","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"});
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/content.css 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/content.css
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/content.css	2012-10-30 15:39:55.597477853 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/content.css	2012-10-30 15:40:38.392444563 +0000
@@ -9,11 +9,11 @@
 h5 {font-size: .83em}
 h6 {font-size: .75em}
 .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
-a.mceItemAnchor {display:inline-block; width:11px !important; height:11px  !important; background:url(img/items.gif) no-repeat 0 0;}
+a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center}
 span.mceItemNbsp {background: #DDD}
 td.mceSelected, th.mceSelected {background-color:#3399ff !important}
 img {border:0;}
-table {cursor:default}
+table, img, hr, .mceItemAnchor {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}
@@ -35,6 +35,7 @@
 
 img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}
 font[face=mceinline] {font-family:inherit !important}
+*[contentEditable]:focus {outline:0}
 
 .mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc}
 .mceItemShockWave {background-image:url(../../img/shockwave.gif)}
@@ -43,5 +44,7 @@
 .mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)}
 .mceItemRealMedia {background-image:url(../../img/realmedia.gif)}
 .mceItemVideo {background-image:url(../../img/video.gif)}
+.mceItemAudio {background-image:url(../../img/video.gif)}
+.mceItemEmbeddedAudio {background-image:url(../../img/video.gif)}
 .mceItemIframe {background-image:url(../../img/iframe.gif)}
 .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;}
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/buttons.png 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/buttons.png
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/buttons.png	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/buttons.png	2012-10-30 15:40:38.393441918 +0000
@@ -1,12 +1,13 @@
 PNG
 
-   
IHDR   ^   N   Q   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  OPLTE!𴳲[[[^žu\
-apī'xxxlllHHH»***kkkܻĽǿ޾444JJJ׷ĻٹyyyzzzKKK߿]]]ȿvvvü^0}#999UUUBBB111KYYYᑢ9```nnnDY>>>rrrMMMӿtttgggċ%%%bq慅쑐1M  
-IDATxڴ_WG2ɄPTf"
Y I$	%W.UZRWE@^m]["ؾ眙ɤ৿o>999sTQQZ khA`_޾i#;GV+_C3D\#s;D܂Wzrᔋ;@F'񆄂 4JHӍ2M8?R-ׇ}wfS_UX\Jk	sC<"rWdX\eͺrjԅ$`6=}Ezz,YLR-=E_(TxG\{Ywuz\ GVXhqtzуzwb"5}Hu/ww*.NstvZU!@:$*=J뫫`Z߁씽ۭUjHWIIҞ,Mx¢U
-Abi
-{^
	{d^L8jҦ>Kwy QР+uj9ǃd
}{4a<
au:Odgs\a< {r7 豪I	DG+p<7^"%к&
-ʸbWW ރu<
0ڌUёJ*ѧK:DF!O_ʞ8%Jo\ ?l3fޜݘi𡚚T:LHM&55h?|;*Dvd9TdqҹS?N~cNC8;ٻ[#cݝ; ~t6Rn^ o0I9~[Z^ťşN;c?wu!|]]D=[!	(E쓋'/oPcWFe%Jʡ'Rn%T34AbK~ijH$dJʚ>;qmEjqġtY9*)ihqi0l~8o_\aٟ	e'QD&~f5/}e>6rYWǈjyforZor	+|z`؛*8>Y&g{:P\&2LOO92<<<B%50ʌZGG+UT2diqM~kgZ(
DSFF&gu_1&miiCD05HcJ{\pS[Ȍ4L0OOO9Оanq\KP,a%%AtN6:`8*x
^ ΜfjPz882$ӌ-j$ǲu
-^R6T{{6;Bթf>RE\%"׺/zgA协S)AQ`^ѣGB8:C/_jDLG13T8|Vټ fZ Yv|9ԩSDH4
-ЬSD(~PF
-

=EDCCQD%!-
?密՜[f# DnĔHJ
>̀1L0>ɌlvF[$86x/	)_)	b@<VEQL<4>5 aٔDk2OM=3E0}6t60/ߝ_"bջi[j,/_Jζ2:qx0>H׎	»aנ0<h^صkא`2^e pWypy".j:SZMOPiW?
-BV?q)ֺ3,,Thx0[w߹{[J[ov~>R(0	:?ޤ	(Shj4o0O
*44_=q"?asUi8K-H VVl_02D:,KKM8DDpnA8
v12
N2SrrFb9s=Pfi*M*IUR);a&jɵ8g4jF#[I !ia4Ti1&)'PS˦4XȉJ<]TicZABlRPbY#w=^Fĥ0Yd[/#Ui"0F~4J4y$UmARJr"Gb<'\@=68'	@RfKdcFfLUiñESwNU8&`o ~L*-0nҴXUEd#Vv- vWiߢJsmD
+#J{<@oENe؅U1 dx~q8B%R	m7[5KjbJ9?n+Sb_] i'k6ժmEǼTlݍdhR[^UƀWi[6(D2[F_ l0[    IENDB`
\ No newline at end of file
+   
IHDR   ^   N   Q  OPLTE!𴳲[[[^žu\
+apī'xxxlllHHH»***kkkܻĽǿ޾444JJJ׷ĻٹyyyzzzKKK߿]]]ȿvvvü^0}#999UUUBBB111KYYYᑢ9```nnnDY>>>rrrMMMӿtttgggċ%%%bq慅쑐1M  	IDATxڵ_SWor0[3 i 0
f$A8"ʦ
+
+-Uu[8֥>mgKJ	|sJ?<y{>W(..^PW
+_nLӦ?QxXXx)wT5k֬=T0SKcPJ^Yh3yp
"%C_J,`NN ǋ
LXZJlY<Ճjqԡ$w(0QjCpr^v?fTJP@'ի8",QZKIIQCC<zUKC@?"]ag_ZrE\N?@	'B1t9#8S_d$
A_&~?zg>Hڒ,cYCԮSJjuzYR~uD\&\KCv&srh/T](שԚ.3
+Nb7RYjen1jlhn6\ǩihpnl`u
:͌hC/F3ڠKW75560.
̧X
+#l5.dҤW5M&[{Z\L* M2ԈؐlE{ИQ"[mJ 2bTvuu
;`dD4	Gts?qVnf&
B
Mf5	WG/Mh
+Hu=M/~!gƍW^piJ}܁}O;/ XOQ#rqj8mË9!|}1k^߬7k8޾s*eifsmpp9'w.[^;	&O0PQSSLzzRc3Ka)6bfr` +ZT`&EE+T@/EmUоx&Xe1J딕'bXY,vEekb#B
+++ke*+?sU8wEih$:)~/@,YYXLZp9*+&~>hnx''b 3uSN׳(ݴXP|sqf3&KISG=+W/Ds{񱱱q!m8tZ8n{cc86{Ibӿ:9|>e˖*Bibq2
u-><6333nw|R-Yx-0^36#GG:70dyݛGK{L--Үᵻ-P2U$ΤOeBܳܛ>JQd\g{J[8$$k'{=IÇ;r>XQW.}`Qy]z;@q)C`n_MЧi!OG|4GPs02!Yqф??Ws}}?Nۏ Fg'UJ\#dCf!cDfu+7n
?-*Y`b{圪xn;蛞Ue#ŋ
+Nq ?Satr!\{ʗwyN\_V9n'̷9#^|8]az[]X4똼vYF:΄q+V>Y~ =nueYsl-x3(,lLm9q&XmgϮgVl[j߾Ukn.-ӆʕRFD1e,) h2H}9'[6BF_.ۧ43+Sn{Mpfka#wi)>햭|[87=s%w*IjCd*fFTcJ6?.mQXC/B"Ja%?*儏.m⡁.MTקui)ڥY
nJV&:8<Tqs046tH.դo.MҐA0j4.Mz%bBv{NHGJ@=K3 'xXo<q]b{
+IiCQ퓔U$G<Na;hn=xAQW`0Kx@z.M	֥CAh	Lu`=A(.A%Dik(WxB-R] .-T]]_KUyWZ]m	RmhbGΆ	Yפ_Mz9!eGè 19-jC{/|Re mЇ3+9m6#Fυ/R4>@q&[O9#hE#`ؖ6lp+N    IENDB`
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/items.gif 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/items.gif
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/items.gif	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/items.gif	2012-10-30 15:40:38.393441918 +0000
@@ -1 +1 @@
-GIF89a       !   ,      @w&ڃq|a4b ;
\ No newline at end of file
+GIF89a      !   ,      @Dwڃq|a4b ;
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/tabs.gif 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/tabs.gif
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/tabs.gif	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/img/tabs.gif	2012-10-30 15:40:38.394444715 +0000
@@ -1,6 +1,5 @@
-GIF89a,Z      2Jb͑󡳻둛                     !  8 ,    ,Z  @da(Ȥrl:ШtJZج)xL.zn|N~""6#7$% !! 
-H*\ȰÇ#JHQ0hȱǏ CIɓ(S\ɲ˗-
h@͛8sɳ@
-JѣH5@SӧPJJիXjʵׯ`Êր	Ҫ]˶۷pʝKݻx˷_RLÈ+^̸ǐ#KL˘-ذϠCMӨS^ͺװc˞
-sͻNȓ+_μr-HNسkνËO
X˟OϿ h&J D(Vhfv ($hb,0(4h8<> DiH&6 PF)TJiǕXf\v%NV)V~ihkIU)tign©'w矀bzj衈&裐F&)饘f*Ʃ駠N)ꩨFJjQꫀꓰjz뮼z++lj&6,>+Vk
-öv+k覫&ko	 l'|p
,G,@gwLw,$|*l,
-/412۬<B9,DE''PGrOKmBXwu*docBl-/=x |7~nx*}K?8x[=y+}yyy褷<z験|zozKz'<K{|{{{ķ;|'7G/Wogw/o7 ;
\ No newline at end of file
+GIF89a,Z 6 2Jb͑󡳻                              !  6 ,    ,Z @@CQ(Ȥrl:ШtJZج6[XxL.zn|N(~562*(, 
+H*\ 
#JHŋ3jȱǏ CI$"HXɲ˗0cʜI͛8sɳ@}GѣH*]ʴӧPJJիXƢ`ÊKóhӶKЀڷpVSܻxk®޿Lp+^̸d
+̘L˘3k̹ϠCMӨOaװc˞M۸sͻ+_μУKNسkνwVNOӫ_Ͼ˟O3p  (h&6F(a[ue$eevJZ$hb/ Չ,⋞4h8<c@	( HNB~%Ĕ CPV$
+.PiA
+ \$bbfjn)tix晐 㟀*()  !$袌6裐F*餔Vj饘f馜vjꩨꪬ꫰*무j뭸Zk+k&6F+-|qܵfv+k覫 )+k ,Lpd7G,Wlgw {\xl(,0,4l83[@-D-Y%L7PG플;jXBYwלl#d-8'}#pǭ6mݾ]#|>.n:AԁZFn;1P圫杇	un:;R~`:?cB_nG 
%Cg{3|</{}OOgw/c觯 ;
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/ui.css 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/ui.css
--- 1.0.0.src/e107_handlers/tiny_mce/themes/advanced/skins/default/ui.css	2012-10-30 15:39:55.598444447 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/themes/advanced/skins/default/ui.css	2012-10-30 15:40:38.394444715 +0000
@@ -103,6 +103,7 @@
 .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;}
+.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal}
 
 /* Progress,Resize */
 .defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF}
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/tiny_mce.js 1.0.2.src/e107_handlers/tiny_mce/tiny_mce.js
--- 1.0.0.src/e107_handlers/tiny_mce/tiny_mce.js	2012-10-30 15:39:55.588444537 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/tiny_mce.js	2012-10-30 15:40:38.396442358 +0000
@@ -1 +1 @@
-(function(d){var a=/^\s*|\s*$/g,e,c="B".replace(/A(.)|B/,"$1")==="$1";var b={majorVersion:"3",minorVersion:"4.1",releaseDate:"2011-03-24",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=d.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);if(d.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m<f.length;m++){if(r=f[m].href){if(/^https?:\/\/[^\/]+$/.test(r)){r+="/"}k=r?r.match(/.*\//)[0]:""}}function h(i){if(i.src&&/tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(i.src)){if(/_(src|dev)\.js/g.test(i.src)){s.suffix="_src"}if((j=i.src.indexOf("?"))!=-1){s.query=i.src.substring(j+1)}s.baseURL=i.src.substring(0,i.src.lastIndexOf("/"));if(k&&s.baseURL.indexOf("://")==-1&&s.baseURL.indexOf("/")!==0){s.baseURL=k+s.baseURL}return s.baseURL}return null}f=q.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}l=q.getElementsByTagName("head")[0];if(l){f=l.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}}return},is:function(g,f){if(!f){return g!==e}if(f=="array"&&(g.hasOwnProperty&&g instanceof Array)){return true}return typeof(g)==f},makeMap:function(f,j,h){var g;f=f||[];j=j||",";if(typeof(f)=="string"){f=f.split(j)}h=h||{};g=f.length;while(g--){h[f[g]]={}}return h},each:function(i,f,h){var j,g;if(!i){return 0}h=h||i;if(i.length!==e){for(j=0,g=i.length;j<g;j++){if(f.call(h,i[j],j,i)===false){return 0}}}else{for(j in i){if(i.hasOwnProperty(j)){if(f.call(h,i[j],j,i)===false){return 0}}}}return 1},map:function(g,h){var i=[];b.each(g,function(f){i.push(h(f))});return i},grep:function(g,h){var i=[];b.each(g,function(f){if(!h||h(f)){i.push(f)}});return i},inArray:function(g,h){var j,f;if(g){for(j=0,f=g.length;j<f;j++){if(g[j]===h){return j}}}return -1},extend:function(k,j){var h,g,f=arguments;for(h=1,g=f.length;h<g;h++){j=f[h];b.each(j,function(i,l){if(i!==e){k[l]=i}})}return k},trim:function(f){return(f?""+f:"").replace(a,"")},create:function(o,f,j){var n=this,g,i,k,l,h,m=0;o=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(o);k=o[3].match(/(^|\.)(\w+)$/i)[2];i=n.createNS(o[3].replace(/\.\w+$/,""),j);if(i[k]){return}if(o[2]=="static"){i[k]=f;if(this.onCreate){this.onCreate(o[2],o[3],i[k])}return}if(!f[k]){f[k]=function(){};m=1}i[k]=f[k];n.extend(i[k].prototype,f);if(o[5]){g=n.resolve(o[5]).prototype;l=o[5].match(/\.(\w+)$/i)[1];h=i[k];if(m){i[k]=function(){return g[l].apply(this,arguments)}}else{i[k]=function(){this.parent=g[l];return h.apply(this,arguments)}}i[k].prototype[k]=i[k];n.each(g,function(p,q){i[k].prototype[q]=g[q]});n.each(f,function(p,q){if(g[q]){i[k].prototype[q]=function(){this.parent=g[q];return p.apply(this,arguments)}}else{if(q!=k){i[k].prototype[q]=p}}})}n.each(f["static"],function(p,q){i[k][q]=p});if(this.onCreate){this.onCreate(o[2],o[3],i[k].prototype)}},walk:function(i,h,j,g){g=g||this;if(i){if(j){i=i[j]}b.each(i,function(k,f){if(h.call(g,k,f,j)===false){return false}b.walk(k,h,j,g)})}},createNS:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0;g<j.length;g++){f=j[g];if(!h[f]){h[f]={}}h=h[f]}return h},resolve:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0,f=j.length;g<f;g++){h=h[j[g]];if(!h){break}}return h},addUnload:function(j,i){var h=this;j={func:j,scope:i||this};if(!h.unloads){function g(){var f=h.unloads,l,m;if(f){for(m in f){l=f[m];if(l&&l.func){l.func.call(l.scope,1)}}if(d.detachEvent){d.detachEvent("onbeforeunload",k);d.detachEvent("onunload",g)}else{if(d.removeEventListener){d.removeEventListener("unload",g,false)}}h.unloads=l=f=w=g=0;if(d.CollectGarbage){CollectGarbage()}}}function k(){var l=document;if(l.readyState=="interactive"){function f(){l.detachEvent("onstop",f);if(g){g()}l=0}if(l){l.attachEvent("onstop",f)}d.setTimeout(function(){if(l){l.detachEvent("onstop",f)}},0)}}if(d.attachEvent){d.attachEvent("onunload",g);d.attachEvent("onbeforeunload",k)}else{if(d.addEventListener){d.addEventListener("unload",g,false)}}h.unloads=[j]}else{h.unloads.push(j)}return j},removeUnload:function(i){var g=this.unloads,h=null;b.each(g,function(j,f){if(j&&j.func==i){g.splice(f,1);h=i;return false}});return h},explode:function(f,g){return f?b.map(f.split(g||","),b.trim):f},_addVer:function(g){var f;if(!this.query){return g}f=(g.indexOf("?")==-1?"?":"&")+this.query;if(g.indexOf("#")==-1){return g+f}return g.replace("#",f+"#")},_replace:function(h,f,g){if(c){return g.replace(h,function(){var l=f,j=arguments,k;for(k=0;k<j.length-2;k++){if(j[k]===e){l=l.replace(new RegExp("\\$"+k,"g"),"")}else{l=l.replace(new RegExp("\\$"+k,"g"),j[k])}}return l})}return g.replace(h,f)}};b._init();d.tinymce=d.tinyMCE=b})(window);tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,h,d,c;e=tinymce.trim(e);g=f.settings=g||{};if(/^(mailto|tel|news|javascript|about|data):/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^\w*:?\/\//.test(e)){e=(g.base_uri.protocol||"http")+"://mce_host"+f.toAbsPath(g.base_uri.path,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,h=[],d,g;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(i){if(i){h.push(i)}});e=h;for(c=f.length-1,h=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();(function(){function serialize(o,quote){var i,v,t;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i<o.length;i++){v+=(i>0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(i in o){v+=typeof o[i]!="function"?(v.length>1?","+quote:quote)+i+quote+":"+serialize(o[i],quote):""}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(j){var a,g,d,k=/[&\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;"};d={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n<m.length;n+=2){o=String.fromCharCode(parseInt(m[n],p));if(!g[o]){l="&"+m[n+1]+";";q[o]=l;q[l]=o}}return q}}a=e("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);j.html=j.html||{};j.html.Entities={encodeRaw:function(m,l){return m.replace(l?k:b,function(n){return g[n]||n})},encodeAllRaw:function(l){return(""+l).replace(f,function(m){return g[m]||m})},encodeNumeric:function(m,l){return m.replace(l?k:b,function(n){if(n.length>1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : _".split(" ");for(g=0;g<j.length;g++){a[j[g]]="_"+g;a["_"+g]=j[g]}function c(n,q,p,i){function o(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(r){var y={},p,n,v,q,u=d.url_converter,x=d.url_converter_scope||this;function o(C,F){var E,B,A,D;E=y[C+"-top"+F];if(!E){return}B=y[C+"-right"+F];if(E!=B){return}A=y[C+"-bottom"+F];if(B!=A){return}D=y[C+"-left"+F];if(A!=D){return}y[C+F]=D;delete y[C+"-top"+F];delete y[C+"-right"+F];delete y[C+"-bottom"+F];delete y[C+"-left"+F]}function t(B){var C=y[B],A;if(!C||C.indexOf(" ")<0){return}C=C.split(" ");A=C.length;while(A--){if(C[A]!==C[0]){return false}}y[B]=C[0];return true}function z(C,B,A,D){if(!t(B)){return}if(!t(A)){return}if(!t(D)){return}y[C]=y[B]+" "+y[A]+" "+y[D];delete y[B];delete y[A];delete y[D]}function s(A){q=true;return a[A]}function i(B,A){if(q){B=B.replace(/_[0-9]/g,function(C){return a[C]})}if(!A){B=B.replace(/\\([\'\";:])/g,"$1")}return B}if(r){r=r.replace(/\\[\"\';:_]/g,s).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(A){return A.replace(/[;:]/g,s)});while(p=b.exec(r)){n=p[1].replace(l,"").toLowerCase();v=p[2].replace(l,"");if(n&&v.length>0){if(n==="font-weight"&&v==="700"){v="bold"}else{if(n==="color"||n==="background-color"){v=v.toLowerCase()}}v=v.replace(k,c);v=v.replace(h,function(B,A,E,D,F,C){F=F||C;if(F){F=i(F);return"'"+F.replace(/\'/g,"\\'")+"'"}A=i(A||E||D);if(u){A=u.call(x,A,"style")}return"url('"+A.replace(/\'/g,"\\'")+"')"});y[n]=q?i(v,true):v}b.lastIndex=p.index+p[0].length}o("border","");o("border","-width");o("border","-color");o("border","-style");o("padding","");o("margin","");z("border","border-width","border-style","border-color");if(y.border==="medium none"){delete y.border}}return y},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,t,v;x=f.styles[t];if(x){for(u=0,s=x.length;u<s;u++){t=x[u];v=p[t];if(v!==e){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(n)}else{for(n in p){q=p[n];if(q!==e){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(l){var g={},i,k,f,d,b,e,c=l.makeMap,j=l.each;function h(n,m){return n.split(m||",")}function a(q,p){var n,o={};function m(r){return r.replace(/[A-Z]+/g,function(s){return m(q[s])})}for(n in q){if(q.hasOwnProperty(n)){q[n]=m(q[n])}}m(p).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(u,s,r,t){r=h(r,"|");o[s]={attributes:c(r),attributesOrder:r,children:c(t,"|",{"#comment":{}})}});return o}k="h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup";k=c(k,",",c(k.toUpperCase()));g=a({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]");i=c("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls");f=c("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source");d=l.extend(c("td,th,iframe,video,object"),f);b=c("pre,script,style");e=c("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");l.html.Schema=function(p){var x=this,m={},n={},u=[],o;p=p||{};if(p.verify_html===false){p.valid_elements="*[*]"}if(p.valid_styles){o={};j(p.valid_styles,function(z,y){o[y]=l.explode(z)})}function v(y){return new RegExp("^"+y.replace(/([?+*])/g,".$1")+"$")}function r(F){var E,A,T,P,U,z,C,O,R,K,S,W,I,D,Q,y,M,B,V,X,J,N,H=/^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,L=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,G=/[*?+]/;if(F){F=h(F);if(m["@"]){M=m["@"].attributes;B=m["@"].attributesOrder}for(E=0,A=F.length;E<A;E++){z=H.exec(F[E]);if(z){Q=z[1];K=z[2];y=z[3];R=z[4];I={};D=[];C={attributes:I,attributesOrder:D};if(Q==="#"){C.paddEmpty=true}if(Q==="-"){C.removeEmpty=true}if(M){for(X in M){I[X]=M[X]}D.push.apply(D,B)}if(R){R=h(R,"|");for(T=0,P=R.length;T<P;T++){z=L.exec(R[T]);if(z){O={};W=z[1];S=z[2].replace(/::/g,":");Q=z[3];N=z[4];if(W==="!"){C.attributesRequired=C.attributesRequired||[];C.attributesRequired.push(S);O.required=true}if(W==="-"){delete I[S];D.splice(l.inArray(D,S),1);continue}if(Q){if(Q==="="){C.attributesDefault=C.attributesDefault||[];C.attributesDefault.push({name:S,value:N});O.defaultValue=N}if(Q===":"){C.attributesForced=C.attributesForced||[];C.attributesForced.push({name:S,value:N});O.forcedValue=N}if(Q==="<"){O.validValues=c(N,"?")}}if(G.test(S)){C.attributePatterns=C.attributePatterns||[];O.pattern=v(S);C.attributePatterns.push(O)}else{if(!I[S]){D.push(S)}I[S]=O}}}}if(!M&&K=="@"){M=I;B=D}if(y){C.outputName=K;m[y]=C}if(G.test(K)){C.pattern=v(K);u.push(C)}else{m[K]=C}}}}}function t(y){m={};u=[];r(y);j(g,function(A,z){n[z]=A.children})}function q(z){var y=/^(~)?(.+)$/;if(z){j(h(z),function(C){var B=y.exec(C),D=B[1]==="~"?"span":"div",A=B[2];n[A]=n[D];j(n,function(E,F){if(E[D]){E[A]=E[D]}})})}}function s(z){var y=/^([+\-]?)(\w+)\[([^\]]+)\]$/;if(z){j(h(z),function(D){var C=y.exec(D),A,B;if(C){B=C[1];if(B){A=n[C[2]]}else{A=n[C[2]]={"#comment":{}}}A=n[C[2]];j(h(C[3],"|"),function(E){if(B==="-"){delete A[E]}else{A[E]={}}})}})}}if(!p.valid_elements){j(g,function(z,y){m[y]={attributes:z.attributes,attributesOrder:z.attributesOrder};n[y]=z.children});j(h("strong/b,em/i"),function(y){y=h(y,"/");m[y[1]].outputName=y[0]});m.img.attributesDefault=[{name:"alt",value:""}];j(h("ol,ul,li,sub,sup,blockquote,tr,div,span,font,a,table,tbody"),function(y){m[y].removeEmpty=true});j(h("p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption"),function(y){m[y].paddEmpty=true})}else{t(p.valid_elements)}q(p.custom_elements);s(p.valid_children);r(p.extended_valid_elements);s("+ol[ul|ol],+ul[ul|ol]");if(p.invalid_elements){l.each(l.explode(p.invalid_elements),function(y){if(m[y]){delete m[y]}})}x.children=n;x.styles=o;x.getBoolAttrs=function(){return i};x.getBlockElements=function(){return k};x.getShortEndedElements=function(){return f};x.getSelfClosingElements=function(){return e};x.getNonEmptyElements=function(){return d};x.getWhiteSpaceElements=function(){return b};x.isValidChild=function(y,A){var z=n[y];return !!(z&&z[A])};x.getElementRule=function(y){var A=m[y],z;if(A){return A}z=u.length;while(z--){A=u[z];if(A.pattern.test(y)){return A}}};x.addValidElements=r;x.setValidElements=t;x.addCustomElements=q;x.addValidChildren=s};l.html.Schema.boolAttrMap=i;l.html.Schema.blockElementsMap=k})(tinymce);(function(a){a.html.SaxParser=function(c,e){var b=this,d=function(){};c=c||{};b.schema=e=e||new a.html.Schema();if(c.fix_self_closing!==false){c.fix_self_closing=true}a.each("comment cdata text start end pi doctype".split(" "),function(f){if(f){b[f]=c[f]||d}});b.parse=function(q){var A=this,f,m=0,G,j,l=[],B,K,t,N,F,k,p,x,I,r,E,o,J,n,H,M,L,z,D,h,g,u,s=0,v=a.html.Entities.decode,y;function C(O){var Q,P;Q=l.length;while(Q--){if(l[Q].name===O){break}}if(Q>=0){for(P=l.length-1;P>=Q;P--){O=l[P];if(O.valid){A.end(O.name)}}l.length=Q}}D=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)\\s*((?:[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*)>))","g");h=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;g={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};F=e.getShortEndedElements();z=e.getSelfClosingElements();k=e.getBoolAttrs();x=c.validate;y=c.fix_self_closing;while(f=D.exec(q)){if(m<f.index){A.text(v(q.substr(m,f.index-m)))}if(G=f[6]){C(G.toLowerCase())}else{if(G=f[7]){G=G.toLowerCase();p=G in F;if(y&&z[G]&&l.length>0&&l[l.length-1].name===G){C(G)}if(!x||(I=e.getElementRule(G))){r=true;if(x){J=I.attributes;n=I.attributePatterns}if(o=f[8]){B=[];B.map={};o.replace(h,function(P,O,T,S,R){var U,Q;O=O.toLowerCase();T=O in k?O:v(T||S||R||"");if(x&&O.indexOf("data-")!==0){U=J[O];if(!U&&n){Q=n.length;while(Q--){U=n[Q];if(U.pattern.test(O)){break}}if(Q===-1){U=null}}if(!U){return}if(U.validValues&&!(T in U.validValues)){return}}B.map[O]=T;B.push({name:O,value:T})})}else{B=[];B.map={}}if(x){H=I.attributesRequired;M=I.attributesDefault;L=I.attributesForced;if(L){K=L.length;while(K--){E=L[K];N=E.name;u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}if(M){K=M.length;while(K--){E=M[K];N=E.name;if(!(N in B.map)){u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}}if(H){K=H.length;while(K--){if(H[K] in B.map){break}}if(K===-1){r=false}}if(B.map["data-mce-bogus"]){r=false}}if(r){A.start(G,B,p)}}else{r=false}if(j=g[G]){j.lastIndex=m=f.index+f[0].length;if(f=j.exec(q)){if(r){t=q.substr(m,f.index-m)}m=f.index+f[0].length}else{t=q.substr(m);m=q.length}if(r&&t.length>0){A.text(t,true)}if(r){A.end(G)}D.lastIndex=m;continue}if(!p){if(!o||o.indexOf("/")!=o.length-1){l.push({name:G,valid:r})}else{if(r){A.end(G)}}}}else{if(G=f[1]){A.comment(G)}else{if(G=f[2]){A.cdata(G)}else{if(G=f[3]){A.doctype(G)}else{if(G=f[4]){A.pi(G,f[5])}}}}}}m=f.index+f[0].length}if(m<q.length){A.text(v(q.substr(m)))}for(K=l.length-1;K>=0;K--){G=l[K];if(G.valid){A.end(G.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h<f;h++){j=m[h];if(j.name!=="id"){k[k.length]={name:j.name,value:j.value};k.map[j.name]=j.value}}n.attributes=k}n.value=g.value;n.shortEnded=g.shortEnded;return n},wrap:function(g){var f=this;f.parent.insert(g,f);g.append(f);return f},unwrap:function(){var f=this,h,g;for(h=f.firstChild;h;){g=h.next;f.insert(h,f,true);h=g}f.remove()},remove:function(){var f=this,h=f.parent,g=f.next,i=f.prev;if(h){if(h.firstChild===f){h.firstChild=g;if(g){g.prev=null}}else{i.next=g}if(h.lastChild===f){h.lastChild=i;if(i){i.next=null}}else{g.prev=i}f.parent=f.next=f.prev=null}return f},append:function(h){var f=this,g;if(h.parent){h.remove()}g=f.lastChild;if(g){g.next=h;h.prev=g;f.lastChild=h}else{f.lastChild=f.firstChild=h}h.parent=f;return h},insert:function(h,f,i){var g;if(h.parent){h.remove()}g=f.parent||this;if(i){if(f===g.firstChild){g.firstChild=h}else{f.prev.next=h}h.prev=f.prev;h.next=f;f.prev=h}else{if(f===g.lastChild){g.lastChild=h}else{f.next.prev=h}h.next=f.next;h.prev=f;f.next=h}h.parent=g;return h},getAll:function(g){var f=this,h,i=[];for(h=f.firstChild;h;h=a(h,f)){if(h.name===g){i.push(h)}}return i},empty:function(){var g=this,f,h,j;if(g.firstChild){f=[];for(j=g.firstChild;j;j=a(j,g)){f.push(j)}h=f.length;while(h--){j=f[h];j.parent=j.firstChild=j.lastChild=j.next=j.prev=null}}g.firstChild=g.lastChild=null;return g},isEmpty:function(j){var f=this,h=f.firstChild,g;if(h){do{if(h.type===1){if(h.attributes.map["data-mce-bogus"]){continue}if(j[h.name]){return false}g=h.attributes.length;while(g--){if(h.attributes[g].name.indexOf("data-")===0){return false}}}if((h.type===3&&!c.test(h.value))){return false}}while(h=a(h,f))}return true}});d.extend(b,{create:function(g,f){var i,h;i=new b(g,e[g]||1);if(f){for(h in f){i.attr(h,f[h])}}return i}});d.html.Node=b})(tinymce);(function(b){var a=b.html.Node;b.html.DomParser=function(g,h){var f=this,e={},d=[],i={},c={};g=g||{};g.root_name=g.root_name||"body";f.schema=h=h||new b.html.Schema();function j(m){var o,p,x,v,z,n,q,l,t,u,k,s,y,r;s=b.makeMap("tr,td,th,tbody,thead,tfoot,table");k=h.getNonEmptyElements();for(o=0;o<m.length;o++){p=m[o];if(!p.parent){continue}v=[p];for(x=p.parent;x&&!h.isValidChild(x.name,p.name)&&!s[x.name];x=x.parent){v.push(x)}if(x&&v.length>1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t<v.length-1;t++){if(h.isValidChild(n.name,v[t].name)){q=f.filterNode(v[t].clone());n.append(q)}else{q=n}for(l=v[t].firstChild;l&&l!=v[t+1];){r=l.next;q.append(l);l=r}n=q}if(!z.isEmpty(k)){x.insert(z,v[0],true);x.insert(p,z)}else{x.insert(p,v[0],true)}x=v[0];if(x.isEmpty(k)||x.firstChild===x.lastChild&&x.firstChild.name==="br"){x.empty().remove()}}else{if(p.parent){if(p.name==="li"){y=p.prev;if(y&&(y.name==="ul"||y.name==="ul")){y.append(p);continue}y=p.next;if(y&&(y.name==="ul"||y.name==="ul")){y.insert(p,y.firstChild,true);continue}p.wrap(f.filterNode(new a("ul",1)));continue}if(h.isValidChild(p.parent.name,"div")&&h.isValidChild("div",p.name)){p.wrap(f.filterNode(new a("div",1)))}else{if(p.name==="style"||p.name==="script"){p.empty().remove()}else{p.unwrap()}}}}}}f.filterNode=function(m){var l,k,n;if(k in e){n=i[k];if(n){n.push(m)}else{i[k]=[m]}}l=d.length;while(l--){k=d[l].name;if(k in m.attributes.map){n=c[k];if(n){n.push(m)}else{c[k]=[m]}}}return m};f.addNodeFilter=function(k,l){b.each(b.explode(k),function(m){var n=e[m];if(!n){e[m]=n=[]}n.push(l)})};f.addAttributeFilter=function(k,l){b.each(b.explode(k),function(m){var n;for(n=0;n<d.length;n++){if(d[n].name===m){d[n].callbacks.push(l);return}}d.push({name:m,callbacks:[l]})})};f.parse=function(u,m){var n,D,y,x,A,z,v,q,C,G,o,B,F=[],s,k,r,p,t;m=m||{};i={};c={};o=b.extend(b.makeMap("script,style,head,title,meta,param"),h.getBlockElements());t=h.getNonEmptyElements();p=h.children;r=h.getWhiteSpaceElements();B=/^[ \t\r\n]+/;s=/[ \t\r\n]+$/;k=/[ \t\r\n]+/g;function E(l,H){var I=new a(l,H),J;if(l in e){J=i[l];if(J){J.push(I)}else{i[l]=[I]}}return I}n=new b.html.SaxParser({validate:g.validate,fix_self_closing:false,cdata:function(l){y.append(E("#cdata",4)).value=l},text:function(I,l){var H;if(!r[y.name]){I=I.replace(k," ");if(y.lastChild&&o[y.lastChild.name]){I=I.replace(B,"")}}if(I.length!==0){H=E("#text",3);H.raw=!!l;y.append(H).value=I}},comment:function(l){y.append(E("#comment",8)).value=l},pi:function(l,H){y.append(E(l,7)).value=H},doctype:function(l){y.append(E("#doctype",10)).value=l},start:function(l,P,I){var N,K,J,H,L,Q,O,M;J=h.getElementRule(l);if(J){N=E(J.outputName||l,1);N.attributes=P;N.shortEnded=I;y.append(N);M=p[y.name];if(M&&p[N.name]&&!M[N.name]){F.push(N)}K=d.length;while(K--){L=d[K].name;if(L in P.map){C=c[L];if(C){C.push(N)}else{c[L]=[N]}}}if(o[l]){for(H=N.prev;H&&H.type===3;){Q=H.value.replace(s,"");if(Q.length>0){H.value=Q;H=H.prev}else{O=H.prev;H.remove();H=O}}}if(!I){y=N}}},end:function(l){var L,I,K,H,J;I=h.getElementRule(l);if(I){if(o[l]){if(!r[y.name]){for(L=y.firstChild;L&&L.type===3;){K=L.value.replace(B,"");if(K.length>0){L.value=K;L=L.next}else{H=L.next;L.remove();L=H}}for(L=y.lastChild;L&&L.type===3;){K=L.value.replace(s,"");if(K.length>0){L.value=K;L=L.prev}else{H=L.prev;L.remove();L=H}}}L=y.prev;if(L&&L.type===3){K=L.value.replace(B,"");if(K.length>0){L.value=K}else{L.remove()}}}if(I.removeEmpty||I.paddEmpty){if(y.isEmpty(t)){if(I.paddEmpty){y.empty().append(new a("#text","3")).value="\u00a0"}else{if(!y.attributes.map.name){J=y.parent;y.empty().remove();y=J;return}}}}y=y.parent}}},h);D=y=new a(g.root_name,11);n.parse(u);j(F);for(G in i){C=e[G];x=i[G];v=x.length;while(v--){if(!x[v].parent){x.splice(v,1)}}for(A=0,z=C.length;A<z;A++){C[A](x,G,m)}}for(A=0,z=d.length;A<z;A++){C=d[A];if(C.name in c){x=c[C.name];v=x.length;while(v--){if(!x[v].parent){x.splice(v,1)}}for(v=0,q=C.callbacks.length;v<q;v++){C.callbacks[v](x,C.name,m)}}}return D};if(g.remove_trailing_brs){f.addNodeFilter("br",function(n,m){var r,q=n.length,o,u=h.getBlockElements(),k=h.getNonEmptyElements(),s,p,t;for(r=0;r<q;r++){o=n[r];s=o.parent;if(u[o.parent.name]&&o===s.lastChild){p=o.prev;while(p){t=p.name;if(t!=="span"||p.attr("data-mce-type")!=="bookmark"){if(t!=="br"){break}if(t==="br"){o=null;break}}p=p.prev}if(o){o.remove();if(s.isEmpty(k)){elementRule=h.getElementRule(s.name);if(elementRule.removeEmpty){s.remove()}else{if(elementRule.paddEmpty){s.empty().append(new b.html.Node("#text",3)).value="\u00a0"}}}}}}})}}})(tinymce);tinymce.html.Writer=function(e){var c=[],a,b,d,f,g;e=e||{};a=e.indent;b=tinymce.makeMap(e.indent_before||"");d=tinymce.makeMap(e.indent_after||"");f=tinymce.html.Entities.getEncodeFunc(e.entity_encoding||"raw",e.entities);g=e.element_format=="html";return{start:function(m,k,p){var n,j,h,o;if(a&&b[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n<j;n++){h=k[n];c.push(" ",h.name,'="',f(h.value,true),'"')}}if(!p||g){c[c.length]=">"}else{c[c.length]=" />"}},end:function(h){var i;c.push("</",h,">");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("<![CDATA[",h,"]]>")},comment:function(h){c.push("<!--",h,"-->")},pi:function(h,i){if(i){c.push("<?",h," ",i,"?>")}else{c.push("<?",h,"?>")}},doctype:function(h){c.push("<!DOCTYPE",h,">")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n<m;n++){r=q.attributesOrder[n];if(r in s.map){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}for(n=0,m=s.length;n<m;n++){r=s[n].name;if(!(r in u.map)){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}s=u}e.start(k.name,s,o);if(!o){if((k=k.firstChild)){do{f(k)}while(k=k.next)}e.end(j)}}else{t(k)}}if(h.type==1&&!c.inner){f(h)}else{g[11](h)}return e.getContent()}}})(tinymce);(function(d){var f=d.each,c=d.is,e=d.isWebKit,a=d.isIE,h=d.html.Entities,b=/^([a-z0-9],?)+$/i,g=d.html.Schema.blockElementsMap;d.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(m,k){var j=this,i;j.doc=m;j.win=window;j.files={};j.cssFlicker=false;j.counter=0;j.stdMode=!d.isIE||m.documentMode>=8;j.boxModel=!d.isIE||m.compatMode=="CSS1Compat"||j.stdMode;j.hasOuterHTML="outerHTML" in m.createElement("a");j.settings=k=d.extend({keep_values:false,hex_colors:1},k);j.styles=new d.html.Styles({url_converter:k.url_converter,url_converter_scope:k.url_converter_scope},k.schema);if(d.isIE6){try{m.execCommand("BackgroundImageCache",false,true)}catch(l){j.cssFlicker=true}}if(a){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(n){m.createElement(n)})}d.addUnload(j.destroy,j)},getRoot:function(){var i=this,j=i.settings;return(j&&i.get(j.root_element))||i.doc.body},getViewPort:function(j){var k,i;j=!j?this.win:j;k=j.document;i=this.boxModel?k.documentElement:k.body;return{x:j.pageXOffset||i.scrollLeft,y:j.pageYOffset||i.scrollTop,w:j.innerWidth||i.clientWidth,h:j.innerHeight||i.clientHeight}},getRect:function(l){var k,i=this,j;l=i.get(l);k=i.getPos(l);j=i.getSize(l);return{x:k.x,y:k.y,w:j.w,h:j.h}},getSize:function(l){var j=this,i,k;l=j.get(l);i=j.getStyle(l,"width");k=j.getStyle(l,"height");if(i.indexOf("px")===-1){i=0}if(k.indexOf("px")===-1){k=0}return{w:parseInt(i)||l.offsetWidth||l.clientWidth,h:parseInt(k)||l.offsetHeight||l.clientHeight}},getParent:function(k,j,i){return this.getParents(k,j,i,false)},getParents:function(s,m,k,q){var j=this,i,l=j.settings,p=[];s=j.get(s);q=q===undefined;if(l.strict_root){k=k||j.getRoot()}if(c(m,"string")){i=m;if(m==="*"){m=function(o){return o.nodeType==1}}else{m=function(o){return j.is(o,i)}}}while(s){if(s==k||!s.nodeType||s.nodeType===9){break}if(!m||m(s)){if(q){p.push(s)}else{return s}}s=s.parentNode}return q?p:null},get:function(i){var j;if(i&&this.doc&&typeof(i)=="string"){j=i;i=this.doc.getElementById(i);if(i&&i.id!==j){return this.doc.getElementsByName(j)[1]}}return i},getNext:function(j,i){return this._findSib(j,i,"nextSibling")},getPrev:function(j,i){return this._findSib(j,i,"previousSibling")},select:function(k,j){var i=this;return d.dom.Sizzle(k,i.get(j)||i.get(i.settings.root_element)||i.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(b.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return d.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(l,o,i,k,m){var j=this;return this.run(l,function(r){var q,n;q=c(o,"string")?j.doc.createElement(o):o;j.setAttribs(q,i);if(k){if(k.nodeType){q.appendChild(k)}else{j.setHTML(q,k)}}return !m?r.appendChild(q):q})},create:function(k,i,j){return this.add(this.doc.createElement(k),k,i,j,1)},createHTML:function(q,i,m){var p="",l=this,j;p+="<"+q;for(j in i){if(i.hasOwnProperty(j)){p+=" "+j+'="'+l.encode(i[j])+'"'}}if(typeof(m)!="undefined"){return p+">"+m+"</"+q+">"}return p+" />"},remove:function(i,j){return this.run(i,function(l){var k,m;k=l.parentNode;if(!k){return null}if(j){while(m=l.firstChild){if(!d.isIE||m.nodeType!==3||m.nodeValue){k.insertBefore(m,l)}else{l.removeChild(m)}}}return k.removeChild(l)})},setStyle:function(l,i,j){var k=this;return k.run(l,function(o){var n,m;n=o.style;i=i.replace(/-(\D)/g,function(q,p){return p.toUpperCase()});if(k.pixelStyles.test(i)&&(d.is(j,"number")||/^[\-0-9\.]+$/.test(j))){j+="px"}switch(i){case"opacity":if(a){n.filter=j===""?"":"alpha(opacity="+(j*100)+")";if(!l.currentStyle||!l.currentStyle.hasLayout){n.display="inline-block"}}n[i]=n["-moz-opacity"]=n["-khtml-opacity"]=j||"";break;case"float":a?n.styleFloat=j:n.cssFloat=j;break;default:n[i]=j||""}if(k.settings.update_styles){k.setAttrib(o,"data-mce-style")}})},getStyle:function(l,i,k){l=this.get(l);if(!l){return false}if(this.doc.defaultView&&k){i=i.replace(/[A-Z]/g,function(m){return"-"+m});try{return this.doc.defaultView.getComputedStyle(l,null).getPropertyValue(i)}catch(j){return null}}i=i.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(i=="float"){i=a?"styleFloat":"cssFloat"}if(l.currentStyle&&k){return l.currentStyle[i]}return l.style[i]},setStyles:function(l,m){var j=this,k=j.settings,i;i=k.update_styles;k.update_styles=0;f(m,function(o,p){j.setStyle(l,p,o)});k.update_styles=i;if(k.update_styles){j.setAttrib(l,k.cssText)}},removeAllAttribs:function(i){return this.run(i,function(l){var j=l.attributes;for(var k=j.length-1;k>=0;k--){l.removeAttributeNode(j.item(k))}})},setAttrib:function(k,l,i){var j=this;if(!k||!l){return}if(j.settings.strict){l=l.toLowerCase()}return this.run(k,function(n){var m=j.settings;switch(l){case"style":if(!c(i,"string")){f(i,function(o,p){j.setStyle(n,p,o)});return}if(m.keep_values){if(i&&!j._isRes(i)){n.setAttribute("data-mce-style",i,2)}else{n.removeAttribute("data-mce-style",2)}}n.style.cssText=i;break;case"class":n.className=i||"";break;case"src":case"href":if(m.keep_values){if(m.url_converter){i=m.url_converter.call(m.url_converter_scope||j,i,l,n)}j.setAttrib(n,"data-mce-"+l,i,2)}break;case"shape":n.setAttribute("data-mce-style",i);break}if(c(i)&&i!==null&&i.length!==0){n.setAttribute(l,""+i,2)}else{n.removeAttribute(l,2)}})},setAttribs:function(j,k){var i=this;return this.run(j,function(l){f(k,function(m,o){i.setAttrib(l,o,m)})})},getAttrib:function(l,m,k){var i,j=this;l=j.get(l);if(!l||l.nodeType!==1){return false}if(!c(k)){k=""}if(/^(src|href|style|coords|shape)$/.test(m)){i=l.getAttribute("data-mce-"+m);if(i){return i}}if(a&&j.props[m]){i=l[j.props[m]];i=i&&i.nodeValue?i.nodeValue:i}if(!i){i=l.getAttribute(m,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(m)){if(l[j.props[m]]===true&&i===""){return m}return i?m:""}if(l.nodeName==="FORM"&&l.getAttributeNode(m)){return l.getAttributeNode(m).nodeValue}if(m==="style"){i=i||l.style.cssText;if(i){i=j.serializeStyle(j.parseStyle(i),l.nodeName);if(j.settings.keep_values&&!j._isRes(i)){l.setAttribute("data-mce-style",i)}}}if(e&&m==="class"&&i){i=i.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(a){switch(m){case"rowspan":case"colspan":if(i===1){i=""}break;case"size":if(i==="+0"||i===20||i===0){i=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(i===0){i=""}break;case"hspace":if(i===-1){i=""}break;case"maxlength":case"tabindex":if(i===32768||i===2147483647||i==="32768"){i=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(i===65535){return m}return k;case"shape":i=i.toLowerCase();break;default:if(m.indexOf("on")===0&&i){i=d._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+i)}}}return(i!==undefined&&i!==null&&i!=="")?""+i:k},getPos:function(q,l){var j=this,i=0,p=0,m,o=j.doc,k;q=j.get(q);l=l||o.body;if(q){if(a&&!j.stdMode){q=q.getBoundingClientRect();m=j.boxModel?o.documentElement:o.body;i=j.getStyle(j.select("html")[0],"borderWidth");i=(i=="medium"||j.boxModel&&!j.isIE6)&&2||i;return{x:q.left+m.scrollLeft-i,y:q.top+m.scrollTop-i}}k=q;while(k&&k!=l&&k.nodeType){i+=k.offsetLeft||0;p+=k.offsetTop||0;k=k.offsetParent}k=q.parentNode;while(k&&k!=l&&k.nodeType){i-=k.scrollLeft||0;p-=k.scrollTop||0;k=k.parentNode}}return{x:i,y:p}},parseStyle:function(i){return this.styles.parse(i)},serializeStyle:function(j,i){return this.styles.serialize(j,i)},loadCSS:function(i){var k=this,l=k.doc,j;if(!i){i=""}j=k.select("head")[0];f(i.split(","),function(m){var n;if(k.files[m]){return}k.files[m]=true;n=k.create("link",{rel:"stylesheet",href:d._addVer(m)});if(a&&l.documentMode&&l.recalc){n.onload=function(){if(l.recalc){l.recalc()}n.onload=null}}j.appendChild(n)})},addClass:function(i,j){return this.run(i,function(k){var l;if(!j){return 0}if(this.hasClass(k,j)){return k.className}l=this.removeClass(k,j);return k.className=(l!=""?(l+" "):"")+j})},removeClass:function(k,l){var i=this,j;return i.run(k,function(n){var m;if(i.hasClass(n,l)){if(!j){j=new RegExp("(^|\\s+)"+l+"(\\s+|$)","g")}m=n.className.replace(j," ");m=d.trim(m!=" "?m:"");n.className=m;if(!m){n.removeAttribute("class");n.removeAttribute("className")}return m}return n.className})},hasClass:function(j,i){j=this.get(j);if(!j||!i){return false}return(" "+j.className+" ").indexOf(" "+i+" ")!==-1},show:function(i){return this.setStyle(i,"display","block")},hide:function(i){return this.setStyle(i,"display","none")},isHidden:function(i){i=this.get(i);return !i||i.style.display=="none"||this.getStyle(i,"display")=="none"},uniqueId:function(i){return(!i?"mce_":i)+(this.counter++)},setHTML:function(k,j){var i=this;return i.run(k,function(m){if(a){while(m.firstChild){m.removeChild(m.firstChild)}try{m.innerHTML="<br />"+j;m.removeChild(m.firstChild)}catch(l){m=i.create("div");m.innerHTML="<br />"+j;f(m.childNodes,function(o,n){if(n){m.appendChild(o)}})}}else{m.innerHTML=j}return j})},getOuterHTML:function(k){var j,i=this;k=i.get(k);if(!k){return null}if(k.nodeType===1&&i.hasOuterHTML){return k.outerHTML}j=(k.ownerDocument||i.doc).createElement("body");j.appendChild(k.cloneNode(true));return j.innerHTML},setOuterHTML:function(l,j,m){var i=this;function k(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){i.insertAfter(s.cloneNode(true),p);s=s.previousSibling}i.remove(p)}return this.run(l,function(o){o=i.get(o);if(o.nodeType==1){m=m||o.ownerDocument||i.doc;if(a){try{if(a&&o.nodeType==1){o.outerHTML=j}else{k(o,j,m)}}catch(n){k(o,j,m)}}else{k(o,j,m)}}})},decode:h.decode,encode:h.encodeAllRaw,insertAfter:function(i,j){j=this.get(j);return this.run(i,function(l){var k,m;k=j.parentNode;m=j.nextSibling;if(m){k.insertBefore(l,m)}else{k.appendChild(l)}return l})},isBlock:function(j){var i=j.nodeType;if(i){return !!(i===1&&g[j.nodeName])}return !!g[j]},replace:function(m,l,i){var j=this;if(c(l,"array")){m=m.cloneNode(true)}return j.run(l,function(k){if(i){f(d.grep(k.childNodes),function(n){m.appendChild(n)})}return k.parentNode.replaceChild(m,k)})},rename:function(l,i){var k=this,j;if(l.nodeName!=i.toUpperCase()){j=k.create(i);f(k.getAttribs(l),function(m){k.setAttrib(j,m.nodeName,k.getAttrib(l,m.nodeName))});k.replace(j,l,1)}return j||l},findCommonAncestor:function(k,i){var l=k,j;while(l){j=i;while(j&&l!=j){j=j.parentNode}if(l==j){break}l=l.parentNode}if(!l&&k.ownerDocument){return k.ownerDocument.documentElement}return l},toHex:function(i){var k=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(i);function j(l){l=parseInt(l).toString(16);return l.length>1?l:"0"+l}if(k){i="#"+j(k[1])+j(k[2])+j(k[3]);return i}return i},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(i){f(i.imports,function(s){q(s)});f(i.cssRules||i.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){f(s.selectorText.split(","),function(r){r=r.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(r)||!/\.[\w\-]+$/.test(r)){return}l=r;r=d._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",r);if(p&&!(r=p(r,l))){return}if(!o[r]){j.push({"class":r});o[r]=1}})}break;case 3:q(s.styleSheet);break}})}try{f(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(l,k,j){var i=this,m;if(i.doc&&typeof(l)==="string"){l=i.get(l)}if(!l){return false}j=j||this;if(!l.nodeType&&(l.length||l.length===0)){m=[];f(l,function(o,n){if(o){if(typeof(o)=="string"){o=i.doc.getElementById(o)}m.push(k.call(j,o,n))}});return m}return k.call(j,l)},getAttribs:function(j){var i;j=this.get(j);if(!j){return[]}if(a){i=[];if(j.nodeName=="OBJECT"){return j.attributes}if(j.nodeName==="OPTION"&&this.getAttrib(j,"selected")){i.push({specified:1,nodeName:"selected"})}j.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(k){i.push({specified:1,nodeName:k})});return i}return j.attributes},destroy:function(j){var i=this;if(i.events){i.events.destroy()}i.win=i.doc=i.root=i.events=null;if(!j){d.removeUnload(i.destroy)}},createRng:function(){var i=this.doc;return i.createRange?i.createRange():new d.dom.Range(this)},nodeIndex:function(n,o){var i=0,l,m,k,j;if(n){for(l=n.nodeType,n=n.previousSibling,m=n;n;n=n.previousSibling){k=n.nodeType;if(o&&k==3){j=false;try{j=n.nodeValue.length}catch(p){}if(k==l||!j){continue}}i++;l=k}}return i},split:function(m,l,p){var q=this,i=q.createRng(),n,k,o;function j(t){var s,r=t.childNodes;if(t.nodeType==1&&t.getAttribute("data-mce-type")=="bookmark"){return}for(s=r.length-1;s>=0;s--){j(r[s])}if(t.nodeType!=9){if(t.nodeType==3&&t.nodeValue.length>0){if(!q.isBlock(t.parentNode)||d.trim(t.nodeValue).length>0){return}}if(t.nodeType==1){r=t.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("data-mce-type")=="bookmark"){t.parentNode.insertBefore(r[0],t)}if(r.length||/^(br|hr|input|img)$/i.test(t.nodeName)){return}}q.remove(t)}return t}if(m&&l){i.setStart(m.parentNode,q.nodeIndex(m));i.setEnd(l.parentNode,q.nodeIndex(l));n=i.extractContents();i=q.createRng();i.setStart(l.parentNode,q.nodeIndex(l)+1);i.setEnd(m.parentNode,q.nodeIndex(m)+1);k=i.extractContents();o=m.parentNode;o.insertBefore(j(n),m);if(p){o.replaceChild(p,l)}else{o.insertBefore(l,m)}o.insertBefore(j(k),m);q.remove(m);return p||l}},bind:function(m,i,l,k){var j=this;if(!j.events){j.events=new d.dom.EventUtils()}return j.events.add(m,i,l,k||this)},unbind:function(l,i,k){var j=this;if(!j.events){j.events=new d.dom.EventUtils()}return j.events.remove(l,i,k)},_findSib:function(l,i,j){var k=this,m=i;if(l){if(c(m,"string")){m=function(n){return k.is(n,i)}}for(l=l[j];l;l=l[j]){if(m(l)){return l}}}return null},_isRes:function(i){return/^(top|left|bottom|right|width|height)/i.test(i)||/;\s*(top|left|bottom|right|width|height)/i.test(i)}});d.DOM=new d.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(Y,t){var ab=N[h],W=N[U],aa=N[P],V=N[z],Z=t.startContainer,ad=t.startOffset,X=t.endContainer,ac=t.endOffset;if(Y===0){return G(ab,W,Z,ad)}if(Y===1){return G(aa,V,Z,ad)}if(Y===2){return G(aa,V,X,ac)}if(Y===3){return G(ab,W,X,ac)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z<Y){return -1}return 1}aa=V;while(aa&&aa.parentNode!=X){aa=aa.parentNode}if(aa){W=0;t=X.firstChild;while(t!=aa&&W<Z){W++;t=t.nextSibling}if(Z<=W){return -1}return 1}aa=X;while(aa&&aa.parentNode!=V){aa=aa.parentNode}if(aa){W=0;t=V.firstChild;while(t!=aa&&W<Y){W++;t=t.nextSibling}if(W<Y){return -1}return 1}ab=c.findCommonAncestor(X,V);ad=X;while(ad&&ad.parentNode!=ab){ad=ad.parentNode}if(!ad){ad=ab}ac=V;while(ac&&ac.parentNode!=ab){ac=ac.parentNode}if(!ac){ac=ab}if(ad==ac){return 0}t=ab.firstChild;while(t){if(t==ad){return -1}if(t==ac){return 1}t=t.nextSibling}}function B(V,Y,X){var t,W;if(V){N[h]=Y;N[U]=X}else{N[P]=Y;N[z]=X}t=N[P];while(t.parentNode){t=t.parentNode}W=N[h];while(W.parentNode){W=W.parentNode}if(W==t){if(G(N[h],N[U],N[P],N[z])>0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(g){var i=this,j="\uFEFF",e,h,d=g.dom,c=true,f=false;function b(){var n=g.getRng(),k=d.createRng(),m,o;m=n.item?n.item(0):n.parentElement();if(m.ownerDocument!=d.doc){return k}o=g.isCollapsed();if(n.item||!m.hasChildNodes()){if(o){k.setStart(m,0);k.setEnd(m,0)}else{k.setStart(m.parentNode,d.nodeIndex(m));k.setEnd(k.startContainer,k.startOffset+1)}return k}function l(s){var u,q,t,p,A=0,x,y,z,r,v;r=n.duplicate();r.collapse(s);u=d.create("a");z=r.parentElement();if(!z.hasChildNodes()){k[s?"setStart":"setEnd"](z,0);return}z.appendChild(u);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){k[s?"setStartAfter":"setEndAfter"](z);d.remove(u);return}p=tinymce.grep(z.childNodes);x=p.length-1;while(A<=x){y=Math.floor((A+x)/2);z.insertBefore(u,p[y]);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){A=y+1}else{if(v<0){x=y-1}else{found=true;break}}}q=v>0||y==0?u.nextSibling:u.previousSibling;if(q.nodeType==1){d.remove(u);t=d.nodeIndex(q);q=q.parentNode;if(!s||y>0){t++}}else{if(v>0||y==0){r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=r.text.length}else{r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=q.nodeValue.length-r.text.length}d.remove(u)}k[s?"setStart":"setEnd"](q,t)}l(true);if(!o){l()}return k}this.addRange=function(k){var p,n,m,r,u,s,t=g.dom.doc,o=t.body;function l(B){var x,A,v,z,y;v=d.create("a");x=B?m:u;A=B?r:s;z=p.duplicate();if(x==t||x==t.documentElement){x=o;A=0}if(x.nodeType==3){x.parentNode.insertBefore(v,x);z.moveToElementText(v);z.moveStart("character",A);d.remove(v);p.setEndPoint(B?"StartToStart":"EndToEnd",z)}else{y=x.childNodes;if(y.length){if(A>=y.length){d.insertAfter(v,y[y.length-1])}else{x.insertBefore(v,y[A])}z.moveToElementText(v)}else{v=t.createTextNode(j);x.appendChild(v);z.moveToElementText(v.parentNode);z.collapse(c)}p.setEndPoint(B?"StartToStart":"EndToEnd",z);d.remove(v)}}this.destroy();m=k.startContainer;r=k.startOffset;u=k.endContainer;s=k.endOffset;p=o.createTextRange();if(m==u&&m.nodeType==1&&r==s-1){if(r==s-1){try{n=o.createControlRange();n.addElement(m.childNodes[r]);n.select();return}catch(q){}}}l(true);l();p.select()};this.getRangeAt=function(){if(!e||!tinymce.dom.RangeUtils.compareRanges(h,g.getRng())){e=b();h=g.getRng()}try{e.startContainer.nextSibling}catch(k){e=b();h=null}return e};this.destroy=function(){h=e=null}}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e<r.length;e++){if(r[e]===r[e-1]){r.splice(e--,1)}}}}return r};b.matches=function(e,r){return b(e,null,null,r)};b.find=function(y,e,z){var x;if(!y){return[]}for(var t=0,s=f.order.length;t<s;t++){var v=f.order[t],u;if((u=f.leftMatch[v].exec(y))){var r=u[1];u.splice(1,1);if(r.substr(r.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");x=f.find[v](u,e,z);if(x!=null){y=y.replace(f.match[v],"");break}}}}if(!x){x=e.getElementsByTagName("*")}return{set:x,expr:y}};b.filter=function(C,B,F,u){var s=C,H=[],z=B,x,e,y=B&&B[0]&&b.isXML(B[0]);while(C&&B.length){for(var A in f.filter){if((x=f.leftMatch[A].exec(C))!=null&&x[2]){var r=f.filter[A],G,E,t=x[1];e=false;x.splice(1,1);if(t.substr(t.length-1)==="\\"){continue}if(z===H){H=[]}if(f.preFilter[A]){x=f.preFilter[A](x,z,F,H,u,y);if(!x){e=G=true}else{if(x===true){continue}}}if(x){for(var v=0;(E=z[v])!=null;v++){if(E){G=r(E,x,v,z);var D=u^!!G;if(F&&G!=null){if(D){e=true}else{z[v]=false}}else{if(D){H.push(E);e=true}}}}}if(G!==undefined){if(!F){z=H}C=C.replace(f.match[A],"");if(!e){return[]}break}}}if(C===s){if(e==null){b.error(C)}else{break}}s=C}return z};b.error=function(e){throw"Syntax error, unrecognized expression: "+e};var f=b.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(x,r){var t=typeof r==="string",v=t&&!/\W/.test(r),y=t&&!v;if(v){r=r.toLowerCase()}for(var s=0,e=x.length,u;s<e;s++){if((u=x[s])){while((u=u.previousSibling)&&u.nodeType!==1){}x[s]=y||u&&u.nodeName.toLowerCase()===r?u||false:u===r}}if(y){b.filter(r,x,true)}},">":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s<e;s++){v=x[s];if(v){var t=v.parentNode;x[s]=t.nodeName.toLowerCase()===r?t:false}}}else{for(;s<e;s++){v=x[s];if(v){x[s]=u?v.parentNode:v.parentNode===r}}if(u){b.filter(r,x,true)}}},"":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("parentNode",r,s,t,u,v)},"~":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("previousSibling",r,s,t,u,v)}},find:{ID:function(r,s,t){if(typeof s.getElementById!=="undefined"&&!t){var e=s.getElementById(r[1]);return e?[e]:[]}},NAME:function(s,v){if(typeof v.getElementsByName!=="undefined"){var r=[],u=v.getElementsByName(s[1]);for(var t=0,e=u.length;t<e;t++){if(u[t].getAttribute("name")===s[1]){r.push(u[t])}}return r.length===0?null:r}},TAG:function(e,r){return r.getElementsByTagName(e[1])}},preFilter:{CLASS:function(t,r,s,e,x,y){t=" "+t[1].replace(/\\/g,"")+" ";if(y){return t}for(var u=0,v;(v=r[u])!=null;u++){if(v){if(x^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(t)>=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return r<e[3]-0},gt:function(s,r,e){return r>e[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v<u;v++){if(t[v]===s){return false}}return true}else{b.error("Syntax error, unrecognized expression: "+e)}}}},CHILD:function(e,t){var x=t[1],r=e;switch(x){case"only":case"first":while((r=r.previousSibling)){if(r.nodeType===1){return false}}if(x==="first"){return true}r=e;case"last":while((r=r.nextSibling)){if(r.nodeType===1){return false}}return true;case"nth":var s=t[2],A=t[3];if(s===1&&A===0){return true}var v=t[0],z=e.parentNode;if(z&&(z.sizcache!==v||!e.nodeIndex)){var u=0;for(r=z.firstChild;r;r=r.nextSibling){if(r.nodeType===1){r.nodeIndex=++u}}z.sizcache=v}var y=e.nodeIndex-A;if(s===0){return y===0}else{return(y%s===0&&y/s>=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s<e;s++){r.push(u[s])}}else{for(;u[s];s++){r.push(u[s])}}}return r}}var c;if(document.documentElement.compareDocumentPosition){c=function(r,e){if(!r.compareDocumentPosition||!e.compareDocumentPosition){if(r==e){o=true}return r.compareDocumentPosition?-1:1}var s=r.compareDocumentPosition(e)&4?-1:r===e?0:1;if(s===0){o=true}return s}}else{if("sourceIndex" in document.documentElement){c=function(r,e){if(!r.sourceIndex||!e.sourceIndex){if(r==e){o=true}return r.sourceIndex?-1:1}var s=r.sourceIndex-e.sourceIndex;if(s===0){o=true}return s}}else{if(document.createRange){c=function(t,r){if(!t.ownerDocument||!r.ownerDocument){if(t==r){o=true}return t.ownerDocument?-1:1}var s=t.ownerDocument.createRange(),e=r.ownerDocument.createRange();s.setStart(t,0);s.setEnd(t,0);e.setStart(r,0);e.setEnd(r,0);var u=s.compareBoundaryPoints(Range.START_TO_END,e);if(u===0){o=true}return u}}}}b.getText=function(e){var r="",t;for(var s=0;e[s];s++){t=e[s];if(t.nodeType===3||t.nodeType===4){r+=t.nodeValue}else{if(t.nodeType!==8){r+=b.getText(t.childNodes)}}}return r};(function(){var r=document.createElement("div"),s="script"+(new Date()).getTime();r.innerHTML="<a name='"+s+"'/>";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="<p class='TEST'></p>";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1&&!z){e.sizcache=v;e.sizset=t}if(e.nodeName.toLowerCase()===x){u=e;break}e=e[r]}A[t]=u}}}function q(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1){if(!z){e.sizcache=v;e.sizset=t}if(typeof x!=="string"){if(e===x){u=true;break}}else{if(b.filter(x,[e]).length>0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x<r;x++){b(e,s[x],t)}return b.filter(u,t)};window.tinymce.dom.Sizzle=b})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j<arguments.length;j++){h.push(arguments[j])}h=e[g].apply(e,h);b.update(g);return h}});a.extend(b,{on:function(i,h,g){return a.dom.Event.add(b.id,i,h,g)},getXY:function(){return{x:parseInt(b.getStyle("left")),y:parseInt(b.getStyle("top"))}},getSize:function(){var g=e.get(b.id);return{w:parseInt(b.getStyle("width")||g.clientWidth),h:parseInt(b.getStyle("height")||g.clientHeight)}},moveTo:function(g,h){b.setStyles({left:g,top:h})},moveBy:function(g,i){var h=b.getXY();b.moveTo(h.x+g,h.y+i)},resizeTo:function(g,i){b.setStyles({width:g,height:i})},resizeBy:function(g,j){var i=b.getSize();b.resizeTo(i.w+g,i.h+j)},update:function(h){var g;if(a.isIE6&&d.blocker){h=h||"";if(h.indexOf("get")===0||h.indexOf("has")===0||h.indexOf("is")===0){return}if(h=="remove"){e.remove(b.blocker);return}if(!b.blocker){b.blocker=e.uniqueId();g=e.add(d.container||e.getRoot(),"iframe",{id:b.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});e.setStyle(g,"opacity",0)}else{g=e.get(b.blocker)}e.setStyles(g,{left:b.getStyle("left",1),top:b.getStyle("top",1),width:b.getStyle("width",1),height:b.getStyle("height",1),display:b.getStyle("display",1),zIndex:parseInt(b.getStyle("zIndex",1)||0)-1})}}})}})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}if(c.isIE&&i.boxModel){this._fixIESelection()}c.addUnload(f.destroy,f)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML=h.item?h.item(0).outerHTML:h.htmlText}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(k,j){var h=this,f=h.getRng(),i,l=h.win.document,m,g;j=j||{format:"html"};j.set=true;k=j.content=k;if(!j.no_events){h.onBeforeSetContent.dispatch(h,j)}k=j.content;if(f.insertNode){k+='<span id="__caret">_</span>';if(f.startContainer==l&&f.endContainer==l){l.body.innerHTML=k}else{f.deleteContents();if(l.body.childNodes.length==0){l.body.innerHTML=k}else{if(f.createContextualFragment){f.insertNode(f.createContextualFragment(k))}else{m=l.createDocumentFragment();g=l.createElement("div");m.appendChild(g);g.outerHTML=k;f.insertNode(m)}}}i=h.dom.get("__caret");f=l.createRange();f.setStartBefore(i);f.setEndBefore(i);h.setRng(f);h.dom.remove("__caret");h.setRng(f)}else{if(f.item){l.execCommand("Delete",false,null);f=h.getRng()}f.pasteHTML(k)}if(!j.no_events){h.onSetContent.dispatch(h,j)}},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(r,s){var v=this,m=v.dom,g,j,i,n,h,o,p,l="\uFEFF",u;function f(x,y){var t=0;d(m.select(x),function(A,z){if(A==y){t=z}});return t}if(r==2){function k(){var x=v.getRng(true),t=m.getRoot(),y={};function z(C,H){var B=C[H?"startContainer":"endContainer"],G=C[H?"startOffset":"endOffset"],A=[],D,F,E=0;if(B.nodeType==3){if(s){for(D=B.previousSibling;D&&D.nodeType==3;D=D.previousSibling){G+=D.nodeValue.length}}A.push(G)}else{F=B.childNodes;if(G>=F.length&&F.length){E=1;G=Math.max(0,F.length-1)}A.push(v.dom.nodeIndex(F[G],s)+E)}for(;B&&B!=t;B=B.parentNode){A.push(v.dom.nodeIndex(B,s))}return A}y.start=z(x,true);if(!v.isCollapsed()){y.end=z(x)}return y}return k()}if(r){return{rng:v.getRng()}}g=v.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();u="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();try{g.collapse();g.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_start" style="'+u+'">'+l+"</span>");if(!n){j.collapse(false);g.moveToElementText(j.parentElement());if(g.compareEndPoints("StartToEnd",j)==0){j.move("character",-1)}j.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_end" style="'+u+'">'+l+"</span>")}}catch(q){return null}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=v.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_end",style:u},l))}g.collapse(true);g.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_start",style:u},l))}v.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(r.tridentSel){r.tridentSel.destroy()}if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){y=t[0];for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(t[v]>u.length-1){return}x=u[t[v]]}if(x.nodeType===3){y=Math.min(t[0],x.nodeValue.length)}if(x.nodeType===1){y=Math.min(t[0],x.childNodes.length)}if(z){f.setStart(x,y)}else{f.setEnd(x,y)}}return true}if(g(true)&&g()){r.setRng(f)}}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3&&!c.isOpera){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(l.isBlock(t)&&!t.innerHTML){t.innerHTML=!a?'<br data-mce-bogus="1" />':" "}return t}k("start");k("end");if(j){f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;if(k){f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g)}return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var h=this,g=h.getRng(),i;if(g.item){i=g.item(0);g=h.win.document.body.createTextRange();g.moveToElementText(i)}g.collapse(!!f);h.setRng(g)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(l){var g=this,h,i,k,j=g.win.document;if(l&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():j.createRange())}}catch(f){}if(c.isIE&&i&&i.setStart&&j.selection.createRange().item){k=j.selection.createRange().item(0);i=j.createRange();i.setStartBefore(k);i.setEndAfter(k)}if(!i){i=j.createRange?j.createRange():j.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;h.removeAllRanges();h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var h=this,g=h.getRng(),i=h.getSel(),l,k=g.startContainer,f=g.endContainer;if(!g){return h.dom.getRoot()}if(g.setStart){l=g.commonAncestorContainer;if(!g.collapsed){if(g.startContainer==g.endContainer){if(g.endOffset-g.startOffset<2){if(g.startContainer.hasChildNodes()){l=g.startContainer.childNodes[g.startOffset]}}}if(k.nodeType===3&&f.nodeType===3){function j(p,m){var o=p;while(p&&p.nodeType===3&&p.length===0){p=m?p.nextSibling:p.previousSibling}return p||o}if(k.length===g.startOffset){k=j(k.nextSibling,true)}else{k=k.parentNode}if(g.endOffset===0){f=j(f.previousSibling,false)}else{f=f.parentNode}if(k&&k===f){return k}}}if(l&&l.nodeType==3){return l.parentNode}return l}return g.item?g.item(0):g.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}},_fixIESelection:function(){var g=this.dom,m=g.doc,h=m.body,j,n,f;m.documentElement.unselectable=true;function i(o,r){var p=h.createTextRange();try{p.moveToPoint(o,r)}catch(q){p=null}return p}function l(p){var o;if(p.button){o=i(p.x,p.y);if(o){if(o.compareEndPoints("StartToStart",n)>0){o.setEndPoint("StartToStart",n)}else{o.setEndPoint("EndToEnd",n)}o.select()}}else{k()}}function k(){var o=m.selection.createRange();if(n&&!o.item&&o.compareEndPoints("StartToEnd",o)===0){n.select()}g.unbind(m,"mouseup",k);g.unbind(m,"mousemove",l);n=j=0}g.bind(m,["mousedown","contextmenu"],function(o){if(o.target.nodeName==="HTML"){if(j){k()}f=m.documentElement;if(f.scrollHeight>f.clientHeight){return}j=1;n=i(o.x,o.y);if(n){g.bind(m,"mouseup",k);g.bind(m,"mousemove",l);g.win.focus();n.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}e.remove_trailing_brs=true;i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"").replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// <![CDATA[\n"+j(o)+"\n// ]]>"}}else{if(o.length>0){n.firstChild.value="<!--\n"+j(o)+"\n-->"}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(m.getInner?o.innerHTML:a.trim(i.getOuterHTML(o),m),m));if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","previousSibling",e))}};(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(b){var a=b.dom.Event,c=b.each;b.create("tinymce.ui.KeyboardNavigation",{KeyboardNavigation:function(e,f){var p=this,m=e.root,l=e.items,n=e.enableUpDown,i=e.enableLeftRight||!e.enableUpDown,k=e.excludeFromTabOrder,j,h,o,d,g;f=f||b.DOM;j=function(q){g=q.target.id};h=function(q){f.setAttrib(q.target.id,"tabindex","-1")};d=function(q){var r=f.get(g);f.setAttrib(r,"tabindex","0");r.focus()};p.focus=function(){f.get(g).focus()};p.destroy=function(){c(l,function(q){f.unbind(f.get(q.id),"focus",j);f.unbind(f.get(q.id),"blur",h)});f.unbind(f.get(m),"focus",d);f.unbind(f.get(m),"keydown",o);l=f=m=p.focus=j=h=o=d=null;p.destroy=function(){}};p.moveFocus=function(u,r){var q=-1,t=p.controls,s;if(!g){return}c(l,function(x,v){if(x.id===g){q=v;return false}});q+=u;if(q<0){q=l.length-1}else{if(q>=l.length){q=0}}s=l[q];f.setAttrib(g,"tabindex","-1");f.setAttrib(s.id,"tabindex","0");f.get(s.id).focus();if(e.actOnFocus){e.onAction(s.id)}if(r){a.cancel(r)}};o=function(y){var u=37,t=39,x=38,z=40,q=27,s=14,r=13,v=32;switch(y.keyCode){case u:if(i){p.moveFocus(-1)}break;case t:if(i){p.moveFocus(1)}break;case x:if(n){p.moveFocus(-1)}break;case z:if(n){p.moveFocus(1)}break;case q:if(e.onCancel){e.onCancel();a.cancel(y)}break;case s:case r:case v:if(e.onAction){e.onAction(g);a.cancel(y)}break}};c(l,function(s,q){var r;if(!s.id){s.id=f.uniqueId("_mce_item_")}if(k){f.bind(s.id,"blur",h);r="-1"}else{r=(q===0?"0":"-1")}f.setAttrib(s.id,"tabindex",r);f.bind(f.get(s.id),"focus",j)});if(l[0]){g=l[0].id}f.setAttrib(m,"tabindex","-1");f.bind(f.get(m),"focus",d);f.bind(f.get(m),"keydown",o)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.select("#menu_"+g.id)[0];h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a role="button" id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" aria-labelledby="'+this.id+'_voice" title="'+a.encode(e.title)+'">';if(e.image){d+='<img class="mceIcon" src="'+e.image+'" alt="'+a.encode(e.title)+'" />'+c}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")}d+='<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="'+this.id+'_voice">'+e.title+"</span>";d+="</a>";return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(i,h,f){var g=this;g.parent(i,h,f);g.items=[];g.onChange=new a(g);g.onPostRender=new a(g);g.onAdd=new a(g);g.onRenderMenu=new d.util.Dispatcher(this);g.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle");c.setAttrib(g.id,"aria-valuenow",i.title)}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null;c.setAttrib(g.id,"aria-valuenow",g.settings.title)}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<span role="button" aria-haspopup="true" aria-labelledby="'+f.id+'_text" aria-describedby="'+f.id+'_voiceDesc"><table role="presentation" tabindex="0" id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("span",{id:f.id+"_voiceDesc","class":"voiceLabel",style:"display:none;"},f.settings.title);i+=c.createHTML("a",{id:f.id+"_text",tabindex:-1,href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},'<span><span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>')+"</td>";i+="</tr></tbody></table></span>";return i},showMenu:function(){var g=this,j,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}j=c.getPos(this.settings.menu_container);i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(k){if(k.value===g.selectedValue){f.items[k.id].setSelected(1);g.oldID=k.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){c.removeClass(f.id,f.classPrefix+"Selected");if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(function(){g.hideMenu();g.focus()});f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id,"keydown",function(h){if(h.keyCode==32){f.showMenu(h);b.cancel(h)}});b.add(f.id,"focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id,"keydown",function(h){if(h.keyCode==40){f.showMenu();b.cancel(h)}});f.keyPressHandler=b.add(f.id,"keypress",function(i){var h;if(i.keyCode==13){h=f.selectedValue;f.selectedValue=null;b.cancel(i);f.settings.onselect(h)}})}f._focused=1});b.add(f.id,"blur",function(){b.remove(f.id,"keydown",f.keyDownHandler);b.remove(f.id,"keypress",f.keyPressHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f;this.setAriaProperty("disabled",f)},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox","aria-labelledby":f.id+"_aria"},g);g+=c.createHTML("span",{id:f.id+"_aria",style:"display: none"},f.settings.title);return g},postRender:function(){var g=this,h,i=true;g.rendered=true;function f(k){var j=g.items[k.target.selectedIndex-1];if(j&&(j=j.value)){g.onChange.dispatch(g,j);if(g.settings.onselect){g.settings.onselect(j)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(k){var j;b.remove(g.id,"change",h);i=false;j=b.add(g.id,"blur",function(){if(i){return}i=true;b.add(g.id,"change",f);b.remove(g.id,"blur",j)});if(k.keyCode==13||k.keyCode==32){f(k);return b.cancel(k)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>');i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";i=b.createHTML("table",{id:f.id,role:"presentation",tabindex:"0","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("span",{role:"button","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.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"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.onHideMenu.dispatch(f);f.isMenuVisible=0;f.editor.focus()},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(i){i=i.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");g=c.add(g,"a",{role:"option",href:"javascript:;",style:{backgroundColor:"#"+i},title:p.editor.getLang("colors."+i,i),"data-mce-color":"#"+i});if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+i;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return a.cancel(i)});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('<div id="'+f.id+'" role="group" aria-labelledby="'+f.id+'_voice">');i.push("<span role='application'>");i.push('<span id="'+f.id+'_voice" class="mceVoiceLabel" style="display:none;">'+d.encode(g.name)+"</span>");j(e,function(h){i.push(h.renderHTML())});i.push("</span>");i.push("</div>");return i.join("")},focus:function(){this.keyNav.focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e<l.length;e++){k=l[e];d=l[e-1];g=l[e+1];if(e===0){j="mceToolbarStart";if(k.Button){j+=" mceToolbarStartButton"}else{if(k.SplitButton){j+=" mceToolbarStartSplitButton"}else{if(k.ListBox){j+=" mceToolbarStartListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,"<!-- IE -->"))}}if(c.stdMode){f+='<td style="position: relative">'+k.renderHTML()+"</td>"}else{f+="<td>"+k.renderHTML()+"</td>"}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,"<!-- IE -->"))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},"<tbody><tr>"+f+"</tr></tbody>")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){return this.lookup[d]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));if(!f.lookup[h]){b.ScriptLoader.add(e,d,g)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l<o.length;l++){if(o[l]==n){o.splice(l,1);break}}if(m.activeEditor==n){m._setActive(o[0])}n.destroy();m.onRemoveEditor.dispatch(m,n);return n},execCommand:function(r,p,o){var q=this,n=q.get(o),l;switch(r){case"mceFocus":n.focus();return true;case"mceAddEditor":case"mceAddControl":if(!q.get(o)){new j.Editor(o,q.settings).render()}return true;case"mceAddFrameControl":l=o.window;l.tinyMCE=tinyMCE;l.tinymce=j;j.DOM.doc=l.document;j.DOM.win=l;n=new j.Editor(o.element_id,o);n.render();if(j.isIE){function m(){n.destroy();l.detachEvent("onunload",m);l=l.tinyMCE=l.tinymce=null}l.attachEvent("onunload",m)}o.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(n){n.remove()}return true;case"mceToggleEditor":if(!n){q.execCommand("mceAddControl",0,o);return true}if(n.isHidden()){n.show()}else{n.hide()}return true}if(q.activeEditor){return q.activeEditor.execCommand(r,p,o)}return false},execInstanceCommand:function(p,o,n,m){var l=this.get(p);if(l){return l.execCommand(o,n,m)}return false},triggerSave:function(){g(this.editors,function(l){l.save()})},addI18n:function(n,q){var l,m=this.i18n;if(!j.is(n,"string")){g(n,function(r,p){g(r,function(t,s){g(t,function(v,u){if(s==="common"){m[p+"."+u]=v}else{m[p+"."+s+"."+u]=v}})})})}else{g(q,function(r,p){m[n+"."+p]=r})}},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);(function(m){var n=m.DOM,j=m.dom.Event,f=m.extend,k=m.util.Dispatcher,i=m.each,a=m.isGecko,b=m.isIE,e=m.isWebKit,d=m.is,h=m.ThemeManager,c=m.PluginManager,o=m.inArray,l=m.grep,g=m.explode;m.create("tinymce.Editor",{Editor:function(r,q){var p=this;p.id=p.editorId=r;p.execCommands={};p.queryStateCommands={};p.queryValueCommands={};p.isNotDirty=false;p.plugins={};i(["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(s){p[s]=new k(p)});p.settings=q=f({id:r,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.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:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,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",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",validate:true,entity_encoding:"named",url_converter:p.convertURL,url_converter_scope:p,ie7_compat:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.contentCSS=[];p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language&&v.language_load!==false){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(s){if(s&&s.charAt(0)!="-"&&!c.urls[s]){if(s=="safari"){return}c.load(s,"plugins/"+s+"/editor_plugin"+m.suffix+".js")}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,F=this,G=F.settings,C,z,B=F.getElement(),q,p,D,x,A,E,y;m.add(F);G.aria_label=G.aria_label||n.getAttrib(B,"aria-label",F.getLang("aria.rich_text_area"));if(G.theme){G.theme=G.theme.replace(/-/,"");q=h.get(G.theme);F.theme=new q();if(F.theme.init&&G.init_theme){F.theme.init(F,h.urls[G.theme]||m.documentBaseURL.replace(/\/$/,""))}}i(g(G.plugins.replace(/\-/g,"")),function(H){var I=c.get(H),t=c.urls[H]||m.documentBaseURL.replace(/\/$/,""),s;if(I){s=new I(F,t);F.plugins[H]=s;if(s.init){s.init(F,t)}}});if(G.popup_css!==false){if(G.popup_css){G.popup_css=F.documentBaseURI.toAbsolute(G.popup_css)}else{G.popup_css=F.baseURI.toAbsolute("themes/"+G.theme+"/skins/"+G.skin+"/dialog.css")}}if(G.popup_css_add){G.popup_css+=","+F.documentBaseURI.toAbsolute(G.popup_css_add)}F.controlManager=new m.ControlManager(F);if(G.custom_undo_redo){F.onBeforeExecCommand.add(function(t,H,u,I,s){if(H!="Undo"&&H!="Redo"&&H!="mceRepaint"&&(!s||!s.skip_undo)){F.undoManager.beforeChange()}});F.onExecCommand.add(function(t,H,u,I,s){if(H!="Undo"&&H!="Redo"&&H!="mceRepaint"&&(!s||!s.skip_undo)){F.undoManager.add()}})}F.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){F.nodeChanged()}});if(a){function v(s,t){if(!t||!t.initial){F.execCommand("mceRepaint")}}F.onUndo.add(v);F.onRedo.add(v);F.onSetContent.add(v)}F.onBeforeRenderUI.dispatch(F,F.controlManager);if(G.render_ui){C=G.width||B.style.width||B.offsetWidth;z=G.height||B.style.height||B.offsetHeight;F.orgDisplay=B.style.display;E=/^[0-9\.]+(|px)$/i;if(E.test(""+C)){C=Math.max(parseInt(C)+(q.deltaWidth||0),100)}if(E.test(""+z)){z=Math.max(parseInt(z)+(q.deltaHeight||0),100)}q=F.theme.renderUI({targetNode:B,width:C,height:z,deltaWidth:G.delta_width,deltaHeight:G.delta_height});F.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:C,height:z});if(G.content_css){m.each(g(G.content_css),function(s){F.contentCSS.push(F.documentBaseURI.toAbsolute(s))})}z=(q.iframeHeight||z)+(typeof(z)=="number"?(q.deltaHeight||0):"");if(z<100){z=100}F.iframeHTML=G.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(G.document_base_url!=m.documentBaseURL){F.iframeHTML+='<base href="'+F.documentBaseURI.getURI()+'" />'}if(G.ie7_compat){F.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" />'}else{F.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=edge" />'}F.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(!a||!/Firefox\/2/.test(navigator.userAgent)){for(y=0;y<F.contentCSS.length;y++){F.iframeHTML+='<link type="text/css" rel="stylesheet" href="'+F.contentCSS[y]+'" />'}F.contentCSS=[]}x=G.body_id||"tinymce";if(x.indexOf("=")!=-1){x=F.getParam("body_id","","hash");x=x[F.id]||x}A=G.body_class||"";if(A.indexOf("=")!=-1){A=F.getParam("body_class","","hash");A=A[F.id]||""}F.iframeHTML+='</head><body id="'+x+'" class="mceContentBody '+A+'"></body></html>';if(m.relaxedDomain&&(b||(m.isOpera&&parseFloat(opera.version())<11))){D='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+F.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}r=n.add(q.iframeContainer,"iframe",{id:F.id+"_ifr",src:D||'javascript:""',frameBorder:"0",title:G.aria_label,style:{width:"100%",height:z}});F.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=F.orgDisplay;n.get(F.id).style.display="none";n.setAttrib(F.id,"aria-hidden",true);if(!m.relaxedDomain||!D){F.setupIframe()}B=r=q=null},setupIframe:function(){var r=this,x=r.settings,y=n.get(r.id),z=r.getDoc(),v,p;if(!b||!m.relaxedDomain){z.open();z.write(r.iframeHTML);z.close();if(m.relaxedDomain){z.domain=m.relaxedDomain}}if(!b){try{if(!x.readonly){z.designMode="On"}}catch(q){}}if(b){p=r.getBody();n.hide(p);if(!x.readonly){p.contentEditable=true}n.show(p)}r.schema=new m.html.Schema(x);r.dom=new m.dom.DOMUtils(r.getDoc(),{keep_values:true,url_converter:r.convertURL,url_converter_scope:r,hex_colors:x.force_hex_style_colors,class_filter:x.class_filter,update_styles:1,fix_ie_paragraphs:1,schema:r.schema});r.parser=new m.html.DomParser(x,r.schema);r.parser.addAttributeFilter("name",function(s,t){var B=s.length,D,A,C,E;while(B--){E=s[B];if(E.name==="a"&&E.firstChild){C=E.parent;D=E.lastChild;do{A=D.prev;C.insert(D,E);D=A}while(D)}}});r.parser.addAttributeFilter("src,href,style",function(s,t){var A=s.length,B,D=r.dom,C;while(A--){B=s[A];C=B.attr(t);if(t==="style"){B.attr("data-mce-style",D.serializeStyle(D.parseStyle(C),B.name))}else{B.attr("data-mce-"+t,r.convertURL(C,t,B.name))}}});r.parser.addNodeFilter("script",function(s,t){var A=s.length;while(A--){s[A].attr("type","mce-text/javascript")}});r.parser.addNodeFilter("#cdata",function(s,t){var A=s.length,B;while(A--){B=s[A];B.type=8;B.name="#comment";B.value="[CDATA["+B.value+"]]"}});r.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,A){var B=t.length,C,s=r.schema.getNonEmptyElements();while(B--){C=t[B];if(C.isEmpty(s)){C.empty().append(new m.html.Node("br",1)).shortEnded=true}}});r.serializer=new m.dom.Serializer(x,r.dom,r.schema);r.selection=new m.dom.Selection(r.dom,r.getWin(),r.serializer);r.formatter=new m.Formatter(this);r.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",collapsed:false,styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",collapsed:false,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:false,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",collapsed:false,styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},wrap_links:false},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},wrap_links:false},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){r.formatter.register(s,{block:s,remove:"all"})});r.formatter.register(r.settings.formats);r.undoManager=new m.UndoManager(r);r.undoManager.onAdd.add(function(t,s){if(t.hasUndo()){return r.onChange.dispatch(r,s,t)}});r.undoManager.onUndo.add(function(t,s){return r.onUndo.dispatch(r,s,t)});r.undoManager.onRedo.add(function(t,s){return r.onRedo.dispatch(r,s,t)});r.forceBlocks=new m.ForceBlocks(r,{forced_root_block:x.forced_root_block});r.editorCommands=new m.EditorCommands(r);r.serializer.onPreProcess.add(function(s,t){return r.onPreProcess.dispatch(r,t,s)});r.serializer.onPostProcess.add(function(s,t){return r.onPostProcess.dispatch(r,t,s)});r.onPreInit.dispatch(r);if(!x.gecko_spellcheck){r.getBody().spellcheck=0}if(!x.readonly){r._addEvents()}r.controlManager.onPostRender.dispatch(r,r.controlManager);r.onPostRender.dispatch(r);if(x.directionality){r.getBody().dir=x.directionality}if(x.nowrap){r.getBody().style.whiteSpace="nowrap"}if(x.handle_node_change_callback){r.onNodeChange.add(function(t,s,A){r.execCallback("handle_node_change_callback",r.id,A,-1,-1,true,r.selection.isCollapsed())})}if(x.save_callback){r.onSaveContent.add(function(s,A){var t=r.execCallback("save_callback",r.id,A.content,r.getBody());if(t){A.content=t}})}if(x.onchange_callback){r.onChange.add(function(t,s){r.execCallback("onchange_callback",r,s)})}if(x.protect){r.onBeforeSetContent.add(function(s,t){if(x.protect){i(x.protect,function(A){t.content=t.content.replace(A,function(B){return"<!--mce:protected "+escape(B)+"-->"})})}})}if(x.convert_newlines_to_brs){r.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(x.preformatted){r.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(x.verify_css_classes){r.serializer.attribValueFilter=function(C,A){var B,t;if(C=="class"){if(!r.classesRE){t=r.dom.getClasses();if(t.length>0){B="";i(t,function(s){B+=(B?"|":"")+s["class"]});r.classesRE=new RegExp("("+B+")","gi")}}return !r.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(A)||r.classesRE.test(A)?A:""}return A}}if(x.cleanup_callback){r.onBeforeSetContent.add(function(s,t){t.content=r.execCallback("cleanup_callback","insert_to_editor",t.content,t)});r.onPreProcess.add(function(s,t){if(t.set){r.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){r.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});r.onPostProcess.add(function(s,t){if(t.set){t.content=r.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=r.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(x.save_callback){r.onGetContent.add(function(s,t){if(t.save){t.content=r.execCallback("save_callback",r.id,t.content,r.getBody())}})}if(x.handle_event_callback){r.onEvent.add(function(s,t,A){if(r.execCallback("handle_event_callback",t,s,A)===false){j.cancel(t)}})}r.onSetContent.add(function(){r.addVisual(r.getBody())});if(x.padd_empty_editor){r.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function u(s,t){i(s.dom.select("a"),function(B){var A=B.parentNode;if(s.dom.isBlock(A)&&A.lastChild===B){s.dom.add(A,"br",{"data-mce-bogus":1})}})}r.onExecCommand.add(function(s,t){if(t==="CreateLink"){u(s)}});r.onSetContent.add(r.selection.onSetContent.add(u));if(!x.readonly){try{z.designMode="Off";z.designMode="On"}catch(q){}}}setTimeout(function(){if(r.removed){return}r.load({initial:true,format:"html"});r.startContent=r.getContent({format:"raw"});r.undoManager.add();r.initialized=true;r.onInit.dispatch(r);r.execCallback("setupcontent_callback",r.id,r.getBody(),r.getDoc());r.execCallback("init_instance_callback",r);r.focus(true);r.nodeChanged({initial:1});i(r.contentCSS,function(s){r.dom.loadCSS(s)});if(x.auto_focus){setTimeout(function(){var s=m.get(x.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getWin().focus()},100)}},1);y=null},focus:function(s){var x,q=this,v=q.settings.content_editable,r,p,u=q.getDoc();if(!s){r=q.selection.getRng();if(r.item){p=r.item(0)}if(!v){q.getWin().focus()}if(p&&p.ownerDocument==u){r=u.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((x=m.activeEditor)!=null){x.onDeactivate.dispatch(x,q)}q.onActivate.dispatch(q,x)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=q.getStart()||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(p,r,q){this.execCommands[p]={func:r,scope:q||this}},addQueryStateHandler:function(p,r,q){this.queryStateCommands[p]={func:r,scope:q||this}},addQueryValueHandler:function(p,r,q){this.queryValueCommands[p]={func:r,scope:q||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=false;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(t,s){var r=this,q,p=r.getBody();s=s||{};s.format=s.format||"html";s.set=true;s.content=t;if(!s.no_events){r.onBeforeSetContent.dispatch(r,s)}t=s.content;if(!m.isIE&&(t.length===0||/^\s+$/.test(t))){p.innerHTML='<br data-mce-bogus="1" />';return}if(s.format!=="raw"){t=new m.html.Serializer({},r.schema).serialize(r.parser.parse(t))}s.content=m.trim(t);r.dom.setHTML(p,s.content);if(!s.no_events){r.onSetContent.dispatch(r,s)}return s.content},getContent:function(q){var p=this,r;q=q||{};q.format=q.format||"html";q.get=true;if(!q.no_events){p.onBeforeGetContent.dispatch(p,q)}if(q.format=="raw"){r=p.getBody().innerHTML}else{r=p.serializer.serialize(p.getBody(),q)}q.content=m.trim(r);if(!q.no_events){p.onGetContent.dispatch(p,q)}return q.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var B=this,r,C=B.settings,q=B.dom,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function p(t,D){var s=t.type;if(B.removed){return}if(B.onEvent.dispatch(B,t,D)!==false){B[x[t.fakeType||t.type]].dispatch(B,t,D)}}i(x,function(t,s){switch(s){case"contextmenu":q.bind(B.getDoc(),s,p);break;case"paste":q.bind(B.getBody(),s,function(D){p(D)});break;case"submit":case"reset":q.bind(B.getElement().form||n.getParent(B.id,"form"),s,p);break;default:q.bind(C.content_editable?B.getBody():B.getDoc(),s,p)}});q.bind(C.content_editable?B.getBody():(a?B.getDoc():B.getWin()),"focus",function(s){B.focus(true)});if(m.isGecko){q.bind(B.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("data-mce-src"))){t.src=B.documentBaseURI.toAbsolute(s)}})}if(a){function u(){var E=this,G=E.getDoc(),F=E.settings;if(a&&!F.readonly){if(E._isHidden()){try{if(!F.content_editable){G.designMode="On"}}catch(D){}}try{G.execCommand("styleWithCSS",0,false)}catch(D){if(!E._isHidden()){try{G.execCommand("useCSS",0,true)}catch(D){}}}if(!F.table_inline_editing){try{G.execCommand("enableInlineTableEditing",false,false)}catch(D){}}if(!F.object_resizing){try{G.execCommand("enableObjectResizing",false,false)}catch(D){}}}}B.onBeforeExecCommand.add(u);B.onMouseDown.add(u)}if(m.isWebKit){B.onClick.add(function(s,t){t=t.target;if(t.nodeName=="IMG"||(t.nodeName=="A"&&q.hasClass(t,"mceItemAnchor"))){B.selection.getSel().setBaseAndExtent(t,0,t,1);B.nodeChanged()}})}B.onMouseUp.add(B.nodeChanged);B.onKeyUp.add(function(s,t){var D=t.keyCode;if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45||D==46||D==8||(m.isMac&&(D==91||D==93))||t.ctrlKey){B.nodeChanged()}});B.onReset.add(function(){B.setContent(B.startContent,{format:"raw"})});if(C.custom_shortcuts){if(C.custom_undo_redo_keyboard_shortcuts){B.addShortcut("ctrl+z",B.getLang("undo_desc"),"Undo");B.addShortcut("ctrl+y",B.getLang("redo_desc"),"Redo")}B.addShortcut("ctrl+b",B.getLang("bold_desc"),"Bold");B.addShortcut("ctrl+i",B.getLang("italic_desc"),"Italic");B.addShortcut("ctrl+u",B.getLang("underline_desc"),"Underline");for(r=1;r<=6;r++){B.addShortcut("ctrl+"+r,"",["FormatBlock",false,"h"+r])}B.addShortcut("ctrl+7","",["FormatBlock",false,"<p>"]);B.addShortcut("ctrl+8","",["FormatBlock",false,"<div>"]);B.addShortcut("ctrl+9","",["FormatBlock",false,"<address>"]);function v(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(B.shortcuts,function(D){if(m.isMac&&D.ctrl!=t.metaKey){return}else{if(!m.isMac&&D.ctrl!=t.ctrlKey){return}}if(D.alt!=t.altKey){return}if(D.shift!=t.shiftKey){return}if(t.keyCode==D.keyCode||(t.charCode&&t.charCode==D.charCode)){s=D;return false}});return s}B.onKeyUp.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyPress.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyDown.add(function(s,t){var D=v(t);if(D){D.func.call(D.scope);return j.cancel(t)}})}if(m.isIE){q.bind(B.getDoc(),"controlselect",function(D){var t=B.resizeInfo,s;D=D.target;if(D.nodeName!=="IMG"){return}if(t){q.unbind(t.node,t.ev,t.cb)}if(!q.hasClass(D,"mceItemNoResize")){ev="resizeend";s=q.bind(D,ev,function(F){var E;F=F.target;if(E=q.getStyle(F,"width")){q.setAttrib(F,"width",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"width","")}if(E=q.getStyle(F,"height")){q.setAttrib(F,"height",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"height","")}})}else{ev="resizestart";s=q.bind(D,"resizestart",j.cancel,j)}t=B.resizeInfo={node:D,ev:ev,cb:s}});B.onKeyDown.add(function(s,D){var t;switch(D.keyCode){case 8:t=B.getDoc().selection;if(t.createRange&&t.createRange().item){s.dom.remove(t.createRange().item(0));return j.cancel(D)}}})}if(m.isOpera){B.onClick.add(function(s,t){j.prevent(t)})}if(C.custom_undo_redo){function y(){B.undoManager.typing=false;B.undoManager.add()}q.bind(B.getDoc(),"focusout",function(s){if(!B.removed&&B.undoManager.typing){y()}});B.dom.bind(B.dom.getRoot(),"dragend",function(s){y()});B.onKeyUp.add(function(t,F){var s,E,D;if(b&&F.keyCode==8){s=B.selection.getRng();if(s.parentElement){E=s.parentElement();D=B.selection.getBookmark();E.innerHTML=E.innerHTML;B.selection.moveToBookmark(D)}}if((F.keyCode>=33&&F.keyCode<=36)||(F.keyCode>=37&&F.keyCode<=40)||F.keyCode==13||F.keyCode==45||F.ctrlKey){y()}});B.onKeyDown.add(function(t,H){var s,F,E,G=H.keyCode;if(b&&G==46){s=B.selection.getRng();if(s.parentElement){F=s.parentElement();if(!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.typing=true;B.undoManager.add()}if(H.ctrlKey){s.moveEnd("word",1);s.select()}B.selection.getSel().clear();if(s.parentElement()==F){E=B.selection.getBookmark();try{F.innerHTML=F.innerHTML}catch(D){}B.selection.moveToBookmark(E)}H.preventDefault();return}}if((G>=33&&G<=36)||(G>=37&&G<=40)||G==13||G==45){if(m.isIE&&G==13){B.undoManager.beforeChange()}if(B.undoManager.typing){y()}return}if((G<16||G>20)&&G!=224&&G!=91&&!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.add();B.undoManager.typing=true}});B.onMouseDown.add(function(){if(B.undoManager.typing){y()}})}if(m.isGecko){function A(){var s=B.dom.getAttribs(B.selection.getStart().cloneNode(false));return function(){var t=B.selection.getStart();B.dom.removeAllAttribs(t);i(s,function(D){t.setAttributeNode(D.cloneNode(true))})}}function z(){var t=B.selection;return !t.isCollapsed()&&t.getStart()!=t.getEnd()}B.onKeyPress.add(function(s,D){var t;if((D.keyCode==8||D.keyCode==46)&&z()){t=A();B.getDoc().execCommand("delete",false,null);t();return j.cancel(D)}});B.dom.bind(B.getDoc(),"cut",function(t){var s;if(z()){s=A();B.onKeyUp.addToTop(j.cancel,j);setTimeout(function(){s();B.onKeyUp.remove(j.cancel,j)},0)}})}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var l=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,o;function q(y,x,v){var u;y=y.toLowerCase();if(u=j.exec[y]){u(y,x,v);return a}return b}function m(v){var u;v=v.toLowerCase();if(u=j.state[v]){return u(v)}return -1}function h(v){var u;v=v.toLowerCase();if(u=j.value[v]){return u(v)}return b}function t(u,v){v=v||"exec";d(u,function(y,x){d(x.toLowerCase().split(","),function(z){j[v][z]=y})})}c.extend(this,{execCommand:q,queryCommandState:m,queryCommandValue:h,addCommands:t});function f(x,v,u){if(v===e){v=b}if(u===e){u=null}return n.getDoc().execCommand(x,v,u)}function s(u){return n.formatter.match(u)}function r(u,v){n.formatter.toggle(u,v?{value:v}:e)}function i(u){o=p.getBookmark(u)}function g(){p.moveToBookmark(o)}t({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(y){var x=n.getDoc(),u;try{f(y)}catch(v){u=a}if(u||!x.queryCommandSupported(y)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(z){if(z){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(u){if(p.isCollapsed()){p.select(p.getNode())}f(u);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){var v=u.substring(7);d("left,center,right,full".split(","),function(x){if(v!=x){n.formatter.remove("align"+x)}});r("align"+v);q("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(x){var u,v;f(x);u=l.getParent(p.getNode(),"ol,ul");if(u){v=u.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)){i();l.split(v,u);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){r(u)},"ForeColor,HiliteColor,FontName":function(x,v,u){r(x,u)},FontSize:function(y,x,v){var u,z;if(v>=1&&v<=7){z=c.explode(k.font_size_style_values);u=c.explode(k.font_size_classes);if(u){v=u[v-1]||v}else{v=z[v-1]||v}}r(y,v)},RemoveFormat:function(u){n.formatter.remove(u)},mceBlockQuote:function(u){r("blockquote")},FormatBlock:function(x,v,u){return r(u||"p")},mceCleanup:function(){var u=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(u)},mceRemoveNode:function(y,x,v){var u=v||p.getNode();if(u!=n.getBody()){i();n.dom.remove(u,a);g()}},mceSelectNodeDepth:function(y,x,v){var u=0;l.getParent(p.getNode(),function(z){if(z.nodeType==1&&u++==v){p.select(z);return b}},n.getBody())},mceSelectNode:function(x,v,u){p.select(u)},mceInsertContent:function(z,D,E){var C,u,x,F,y,u,A,G,B;function v(H,J){var I,K=new c.dom.TreeWalker(H,J);while((I=K.current())){if((I.nodeType==3&&c.trim(I.nodeValue).length)||I.nodeName=="BR"||I.nodeName=="IMG"){return I}K.prev()}}B={content:E,format:"html"};p.onBeforeSetContent.dispatch(p,B);E=B.content;if(E.indexOf("{$caret}")==-1){E+="{$caret}"}p.setContent('<span id="__mce">\uFEFF</span>',{no_events:false});l.setOuterHTML("__mce",E.replace(/\{\$caret\}/,'<span data-mce-type="bookmark" id="__mce">\uFEFF</span>'));C=l.select("#__mce")[0];x=l.getRoot();if(C.previousSibling&&l.isBlock(C.previousSibling)||C.parentNode==x){y=v(C.previousSibling,x);if(y){if(y.nodeName=="BR"){y.parentNode.insertBefore(C,y)}else{l.insertAfter(C,y)}}}while(C){if(C===x){l.setOuterHTML(F,new c.html.Serializer({},n.schema).serialize(new c.html.DomParser({remove_trailing_brs:true},n.schema).parse(l.getOuterHTML(F))));break}F=C;C=C.parentNode}C=l.select("#__mce")[0];if(C){y=v(C.previousSibling,x);l.remove(C);if(y){u=l.createRng();if(y.nodeType==3){u.setStart(y,y.length);u.setEnd(y,y.length)}else{if(y.nodeName=="BR"){u.setStartBefore(y);u.setEndBefore(y)}else{u.setStartAfter(y);u.setEndAfter(y)}}p.setRng(u);if(!c.isIE){y=l.create("span",null,"\u00a0");u.insertNode(y);A=l.getRect(y);G=l.getViewPort(n.getWin());if((A.y>G.y+G.h||A.y<G.y)||(A.x>G.x+G.w||A.x<G.x)){n.getBody().scrollLeft=A.x;n.getBody().scrollTop=A.y}l.remove(y)}p.collapse(true)}}p.onSetContent.dispatch(p,B);n.addVisual()},mceInsertRawHTML:function(x,v,u){p.setContent("tiny_mce_marker");n.setContent(n.getContent().replace(/tiny_mce_marker/g,function(){return u}))},mceSetContent:function(x,v,u){n.setContent(u)},"Indent,Outdent":function(y){var v,u,x;v=k.indentation;u=/[a-z%]+$/i.exec(v);v=parseInt(v);if(!m("InsertUnorderedList")&&!m("InsertOrderedList")){d(p.getSelectedBlocks(),function(z){if(y=="outdent"){x=Math.max(0,parseInt(z.style.paddingLeft||0)-v);l.setStyle(z,"paddingLeft",x?x+u:"")}else{l.setStyle(z,"paddingLeft",(parseInt(z.style.paddingLeft||0)+v)+u)}})}else{f(y)}},mceRepaint:function(){var v;if(c.isGecko){try{i(a);if(p.getSel()){p.getSel().selectAllChildren(n.getBody())}p.collapse(a);g()}catch(u){}}},mceToggleFormat:function(x,v,u){n.formatter.toggle(u)},InsertHorizontalRule:function(){n.execCommand("mceInsertContent",false,"<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(x,v,u){n.execCommand("mceInsertContent",false,p.setContent(u.replace(/\{\$selection\}/g,p.getContent({format:"text"}))))},mceInsertLink:function(A,z,y){var x=l.getParent(p.getNode(),"a"),v,u;if(c.is(y,"string")){y={href:y}}y.href=y.href.replace(" ","%20");if(!x){if(c.isWebKit){v=l.getParent(p.getNode(),"img");if(v){u=v.style.cssFloat;v.style.cssFloat=null}}f("CreateLink",b,"javascript:mctmp(0);");if(u){v.style.cssFloat=u}d(l.select("a[href='javascript:mctmp(0);']"),function(B){l.setAttribs(B,y)})}else{if(y.href){l.setAttribs(x,y)}else{n.dom.remove(x,a)}}},selectAll:function(){var v=l.getRoot(),u=l.createRng();u.setStart(v,0);u.setEnd(v,v.childNodes.length);n.selection.setRng(u)}});t({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){return s("align"+u.substring(7))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){return s(u)},mceBlockQuote:function(){return s("blockquote")},Outdent:function(){var u;if(k.inline_styles){if((u=l.getParent(p.getStart(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}if((u=l.getParent(p.getEnd(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}}return m("InsertUnorderedList")||m("InsertOrderedList")||(!k.inline_styles&&!!l.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(u){return l.getParent(p.getNode(),u=="insertunorderedlist"?"UL":"OL")}},"state");t({"FontSize,FontName":function(x){var v=0,u;if(u=l.getParent(p.getNode(),"span")){if(x=="fontsize"){v=u.style.fontSize}else{v=u.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return v}},"value");if(k.custom_undo_redo){t({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(e){var c,d=0,g=[];function f(){return b.trim(e.getContent({format:"raw",no_events:1}))}return c={typing:false,onAdd:new a(c),onUndo:new a(c),onRedo:new a(c),beforeChange:function(){if(g[d]){g[d].beforeBookmark=e.selection.getBookmark(2,true)}},add:function(l){var h,j=e.settings,k;l=l||{};l.content=f();k=g[d];if(k&&k.content==l.content){return null}if(j.custom_undo_redo_levels){if(g.length>j.custom_undo_redo_levels){for(h=0;h<g.length-1;h++){g[h]=g[h+1]}g.length--;d=g.length}}l.bookmark=e.selection.getBookmark(2,true);if(d<g.length-1){g.length=d+1}g.push(l);d=g.length-1;c.onAdd.dispatch(c,l);e.isNotDirty=0;return l},undo:function(){var j,h;if(c.typing){c.add();c.typing=false}if(d>0){j=g[--d];e.setContent(j.content,{format:"raw"});e.selection.moveToBookmark(j.beforeBookmark);c.onUndo.dispatch(c,j)}return j},redo:function(){var h;if(d<g.length-1){h=g[++d];e.setContent(h.content,{format:"raw"});e.selection.moveToBookmark(h.bookmark);c.onRedo.dispatch(c,h)}return h},clear:function(){g=[];d=0;c.typing=false},hasUndo:function(){return d>0||this.typing},hasRedo:function(){return d<g.length-1&&!this.typing}}}})(tinymce);(function(m){var k=m.dom.Event,c=m.isIE,a=m.isGecko,b=m.isOpera,j=m.each,i=m.extend,d=true,h=false;function l(p){var q,o,n;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(p.nodeName)){if(q){o=p.cloneNode(false);o.appendChild(q);q=o}else{q=n=p.cloneNode(false)}q.removeAttribute("id")}}while(p=p.parentNode);if(q){return{wrapper:q,inner:n}}}function g(o,p){var n=p.ownerDocument.createRange();n.setStart(o.endContainer,o.endOffset);n.setEndAfter(p);return n.cloneContents().textContent.length==0}function f(o){o=o.innerHTML;o=o.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi,"-");o=o.replace(/<[^>]+>/g,"");return o.replace(/[ \u00a0\t\r\n]+/g,"")==""}function e(p,r,n){var o,q;if(f(n)){o=r.getParent(n,"ul,ol");if(!r.getParent(o.parentNode,"ul,ol")){r.split(o,n);q=r.create("p",0,'<br data-mce-bogus="1" />');r.replace(q,n);p.select(q,1)}return h}return d}m.create("tinymce.ForceBlocks",{ForceBlocks:function(n){var o=this,p=n.settings,q;o.editor=n;o.dom=n.dom;q=(p.forced_root_block||"p").toLowerCase();p.element=q.toUpperCase();n.onPreInit.add(o.setup,o);if(p.forced_root_block){n.onInit.add(o.forceRoots,o);n.onSetContent.add(o.forceRoots,o);n.onBeforeGetContent.add(o.forceRoots,o);n.onExecCommand.add(function(r,s){if(s=="mceInsertContent"){o.forceRoots();r.nodeChanged()}})}},setup:function(){var o=this,n=o.editor,q=n.settings,u=n.dom,p=n.selection;if(q.forced_root_block){n.onBeforeExecCommand.add(o.forceRoots,o);n.onKeyUp.add(o.forceRoots,o);n.onPreProcess.add(o.forceRoots,o)}if(q.force_br_newlines){if(c){n.onKeyPress.add(function(s,t){var v;if(t.keyCode==13&&p.getNode().nodeName!="LI"){p.setContent('<br id="__" /> ',{format:"raw"});v=u.get("__");v.removeAttribute("id");p.select(v);p.collapse();return k.cancel(t)}})}}if(q.force_p_newlines){if(!c){n.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!o.insertPara(t)){k.cancel(t)}})}else{m.addUnload(function(){o._previousFormats=0});n.onKeyPress.add(function(s,t){o._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&q.keep_styles){o._previousFormats=l(s.selection.getStart())}});n.onKeyUp.add(function(t,x){if(x.keyCode==13&&!x.shiftKey){var v=t.selection.getStart(),s=o._previousFormats;if(!v.hasChildNodes()&&s){v=u.getParent(v,u.isBlock);if(v&&v.nodeName!="LI"){v.innerHTML="";if(o._previousFormats){v.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{v.innerHTML="\uFEFF"}p.select(v,1);p.collapse(true);t.getDoc().execCommand("Delete",false,null);o._previousFormats=0}}}})}if(a){n.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){o.backspaceDelete(t,t.keyCode==8)}})}}if(m.isWebKit){function r(t){var s=p.getRng(),v,z=u.create("div",null," "),y,x=u.getViewPort(t.getWin()).h;s.insertNode(v=u.create("br"));s.setStartAfter(v);s.setEndAfter(v);p.setRng(s);if(p.getSel().focusNode==v.previousSibling){p.select(u.insertAfter(u.doc.createTextNode("\u00a0"),v));p.collapse(d)}u.insertAfter(z,v);y=u.getPos(z).y;u.remove(z);if(y>x){t.getWin().scrollTo(0,y)}}n.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(q.force_br_newlines&&!u.getParent(p.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);k.cancel(t)}})}if(c){if(q.element!="P"){n.onKeyPress.add(function(s,t){o.lastElm=p.getNode().nodeName});n.onKeyUp.add(function(t,v){var y,x=p.getNode(),s=t.getBody();if(s.childNodes.length===1&&x.nodeName=="P"){x=u.rename(x,q.element);p.select(x);p.collapse();t.nodeChanged()}else{if(v.keyCode==13&&!v.shiftKey&&o.lastElm!="P"){y=u.getParent(x,"p");if(y){u.rename(y,q.element);t.nodeChanged()}}}})}}},find:function(v,q,r){var p=this.editor,o=p.getDoc().createTreeWalker(v,4,null,h),u=-1;while(v=o.nextNode()){u++;if(q==0&&v==r){return u}if(q==1&&u==r){return v}}return -1},forceRoots:function(x,I){var z=this,x=z.editor,M=x.getBody(),J=x.getDoc(),P=x.selection,A=P.getSel(),B=P.getRng(),N=-2,v,G,o,p,K=-16777215;var L,q,O,F,C,u=M.childNodes,E,D,y;for(E=u.length-1;E>=0;E--){L=u[E];if(L.nodeType===1&&L.getAttribute("data-mce-type")){q=null;continue}if(L.nodeType===3||(!z.dom.isBlock(L)&&L.nodeType!==8&&!/^(script|mce:script|style|mce:style)$/i.test(L.nodeName))){if(!q){if(L.nodeType!=3||/[^\s]/g.test(L.nodeValue)){if(N==-2&&B){if(!c||B.setStart){if(B.startContainer.nodeType==1&&(D=B.startContainer.childNodes[B.startOffset])&&D.nodeType==1){y=D.getAttribute("id");D.setAttribute("id","__mce")}else{if(x.dom.getParent(B.startContainer,function(n){return n===M})){G=B.startOffset;o=B.endOffset;N=z.find(M,0,B.startContainer);v=z.find(M,0,B.endContainer)}}}else{if(B.item){p=J.body.createTextRange();p.moveToElementText(B.item(0));B=p}p=J.body.createTextRange();p.moveToElementText(M);p.collapse(1);O=p.move("character",K)*-1;p=B.duplicate();p.collapse(1);F=p.move("character",K)*-1;p=B.duplicate();p.collapse(0);C=(p.move("character",K)*-1)-F;N=F-O;v=C}}q=x.dom.create(x.settings.forced_root_block);L.parentNode.replaceChild(q,L);q.appendChild(L)}}else{if(q.hasChildNodes()){q.insertBefore(L,q.firstChild)}else{q.appendChild(L)}}}else{q=null}}if(N!=-2){if(!c||B.setStart){q=M.getElementsByTagName(x.settings.element)[0];B=J.createRange();if(N!=-1){B.setStart(z.find(M,1,N),G)}else{B.setStart(q,0)}if(v!=-1){B.setEnd(z.find(M,1,v),o)}else{B.setEnd(q,0)}if(A){A.removeAllRanges();A.addRange(B)}}else{try{B=A.createRange();B.moveToElementText(M);B.collapse(1);B.moveStart("character",N);B.moveEnd("character",v);B.select()}catch(H){}}}else{if((!c||B.setStart)&&(D=x.dom.get("__mce"))){if(y){D.setAttribute("id",y)}else{D.removeAttribute("id")}B=J.createRange();B.setStartBefore(D);B.setEndBefore(D);P.setRng(B)}}},getParentBlock:function(p){var o=this.dom;return o.getParent(p,o.isBlock)},insertPara:function(S){var G=this,x=G.editor,O=x.dom,T=x.getDoc(),X=x.settings,H=x.selection.getSel(),I=H.getRangeAt(0),W=T.body;var L,M,J,Q,P,u,p,v,A,o,E,V,q,z,K,N=O.getViewPort(x.getWin()),D,F,C;x.undoManager.beforeChange();L=T.createRange();L.setStart(H.anchorNode,H.anchorOffset);L.collapse(d);M=T.createRange();M.setStart(H.focusNode,H.focusOffset);M.collapse(d);J=L.compareBoundaryPoints(L.START_TO_END,M)<0;Q=J?H.anchorNode:H.focusNode;P=J?H.anchorOffset:H.focusOffset;u=J?H.focusNode:H.anchorNode;p=J?H.focusOffset:H.anchorOffset;if(Q===u&&/^(TD|TH)$/.test(Q.nodeName)){if(Q.firstChild.nodeName=="BR"){O.remove(Q.firstChild)}if(Q.childNodes.length==0){x.dom.add(Q,X.element,null,"<br />");V=x.dom.add(Q,X.element,null,"<br />")}else{K=Q.innerHTML;Q.innerHTML="";x.dom.add(Q,X.element,null,K);V=x.dom.add(Q,X.element,null,"<br />")}I=T.createRange();I.selectNodeContents(V);I.collapse(1);x.selection.setRng(I);return h}if(Q==W&&u==W&&W.firstChild&&x.dom.isBlock(W.firstChild)){Q=u=Q.firstChild;P=p=0;L=T.createRange();L.setStart(Q,0);M=T.createRange();M.setStart(u,0)}Q=Q.nodeName=="HTML"?T.body:Q;Q=Q.nodeName=="BODY"?Q.firstChild:Q;u=u.nodeName=="HTML"?T.body:u;u=u.nodeName=="BODY"?u.firstChild:u;v=G.getParentBlock(Q);A=G.getParentBlock(u);o=v?v.nodeName:X.element;if(K=G.dom.getParent(v,"li,pre")){if(K.nodeName=="LI"){return e(x.selection,G.dom,K)}return d}if(v&&(v.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;v=null}if(A&&(A.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;A=null}if(/(TD|TABLE|TH|CAPTION)/.test(o)||(v&&o=="DIV"&&/left|right/gi.test(O.getStyle(v,"float",1)))){o=X.element;v=A=null}E=(v&&v.nodeName==o)?v.cloneNode(0):x.dom.create(o);V=(A&&A.nodeName==o)?A.cloneNode(0):x.dom.create(o);V.removeAttribute("id");if(/^(H[1-6])$/.test(o)&&g(I,v)){V=x.dom.create(X.element)}K=q=Q;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}q=K}while((K=K.previousSibling?K.previousSibling:K.parentNode));K=z=u;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}z=K}while((K=K.nextSibling?K.nextSibling:K.parentNode));if(q.nodeName==o){L.setStart(q,0)}else{L.setStartBefore(q)}L.setEnd(Q,P);E.appendChild(L.cloneContents()||T.createTextNode(""));try{M.setEndAfter(z)}catch(R){}M.setStart(u,p);V.appendChild(M.cloneContents()||T.createTextNode(""));I=T.createRange();if(!q.previousSibling&&q.parentNode.nodeName==o){I.setStartBefore(q.parentNode)}else{if(L.startContainer.nodeName==o&&L.startOffset==0){I.setStartBefore(L.startContainer)}else{I.setStart(L.startContainer,L.startOffset)}}if(!z.nextSibling&&z.parentNode.nodeName==o){I.setEndAfter(z.parentNode)}else{I.setEnd(M.endContainer,M.endOffset)}I.deleteContents();if(b){x.getWin().scrollTo(0,N.y)}if(E.firstChild&&E.firstChild.nodeName==o){E.innerHTML=E.firstChild.innerHTML}if(V.firstChild&&V.firstChild.nodeName==o){V.innerHTML=V.firstChild.innerHTML}if(f(E)){E.innerHTML="<br />"}function U(y,s){var r=[],Z,Y,t;y.innerHTML="";if(X.keep_styles){Y=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(Y.nodeName)){Z=Y.cloneNode(h);O.setAttrib(Z,"id","");r.push(Z)}}while(Y=Y.parentNode)}if(r.length>0){for(t=r.length-1,Z=y;t>=0;t--){Z=Z.appendChild(r[t])}r[0].innerHTML=b?"\u00a0":"<br />";return r[0]}else{y.innerHTML=b?"\u00a0":"<br />"}}if(f(V)){C=U(V,u)}if(b&&parseFloat(opera.version())<9.5){I.insertNode(E);I.insertNode(V)}else{I.insertNode(V);I.insertNode(E)}V.normalize();E.normalize();function B(r){return T.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,h).nextNode()||r}I=T.createRange();I.selectNodeContents(a?B(C||V):C||V);I.collapse(1);H.removeAllRanges();H.addRange(I);D=x.dom.getPos(V).y;if(D<N.y||D+25>N.y+N.h){x.getWin().scrollTo(0,D<N.y?D:D-N.h+25)}x.undoManager.add();return h},backspaceDelete:function(v,C){var D=this,u=D.editor,z=u.getBody(),s=u.dom,q,x=u.selection,p=x.getRng(),y=p.startContainer,q,A,B,o;if(!C&&p.collapsed&&y.nodeType==1&&p.startOffset==y.childNodes.length){o=new m.dom.TreeWalker(y.lastChild,y);for(q=y.lastChild;q;q=o.prev()){if(q.nodeType==3){p.setStart(q,q.nodeValue.length);p.collapse(true);x.setRng(p);return}}}if(y&&u.dom.isBlock(y)&&!/^(TD|TH)$/.test(y.nodeName)&&C){if(y.childNodes.length==0||(y.childNodes.length==1&&y.firstChild.nodeName=="BR")){q=y;while((q=q.previousSibling)&&!u.dom.isBlock(q)){}if(q){if(y!=z.firstChild){A=u.dom.doc.createTreeWalker(q,NodeFilter.SHOW_TEXT,null,h);while(B=A.nextNode()){q=B}p=u.getDoc().createRange();p.setStart(q,q.nodeValue?q.nodeValue.length:0);p.setEnd(q,q.nodeValue?q.nodeValue.length:0);x.setRng(p);u.dom.remove(y)}return k.cancel(v)}}}}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){if(p.cmd){i.execCommand(p.cmd,p.ui||false,p.value)}}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;if(g.settings.use_native_selects){k=new c.ui.NativeListBox(m,i)}else{f=l||h._cls.listbox||c.ui.ListBox;k=new f(m,i,g)}h.controls[m]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){g.bookmark=g.selection.getBookmark(1)});a.add(o,"focus",function(){g.selection.moveToBookmark(g.bookmark);g.bookmark=null})})}if(k.hideMenu){g.onMouseDown.add(k.hideMenu,k)}return h.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i,g);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i,g));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n,j);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onShowMenu.add(function(){j.focus();g=j.selection.getBookmark(1)});k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createToolbarGroup:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||this._cls.toolbarGroup||c.ui.ToolbarGroup;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},resizeBy:function(f,g,h){h.resizeBy(f,g)},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){a.Formatter=function(V){var M={},O=a.each,c=V.dom,q=V.selection,t=a.dom.TreeWalker,K=new a.dom.RangeUtils(c),d=V.schema.isValidChild,F=c.isBlock,l=V.settings.forced_root_block,s=c.nodeIndex,E="\uFEFF",e=/^(src|href|style)$/,S=false,B=true,p,P={apply:[],remove:[]};function z(W){return W instanceof Array}function m(X,W){return c.getParents(X,W,c.getRoot())}function b(W){return W.nodeType===1&&(W.face==="mceinline"||W.style.fontFamily==="mceinline")}function R(W){return W?M[W]:M}function k(W,X){if(W){if(typeof(W)!=="string"){O(W,function(Z,Y){k(Y,Z)})}else{X=X.length?X:[X];O(X,function(Y){if(Y.deep===p){Y.deep=!Y.selector}if(Y.split===p){Y.split=!Y.selector||Y.inline}if(Y.remove===p&&Y.selector&&!Y.inline){Y.remove="none"}if(Y.selector&&Y.inline){Y.mixed=true;Y.block_expand=true}if(typeof(Y.classes)==="string"){Y.classes=Y.classes.split(/\s+/)}});M[W]=X}}}var i=function(X){var W;V.dom.getParent(X,function(Y){W=V.dom.getStyle(Y,"text-decoration");return W&&W!=="none"});return W};var I=function(W){var X;if(W.nodeType===1&&W.parentNode&&W.parentNode.nodeType===1){X=i(W.parentNode);if(V.dom.getStyle(W,"color")&&X){V.dom.setStyle(W,"text-decoration",X)}else{if(V.dom.getStyle(W,"textdecoration")===X){V.dom.setStyle(W,"text-decoration",null)}}}};function T(Y,af,aa){var ab=R(Y),ag=ab[0],ae,X,ad,ac=q.isCollapsed();function Z(ak){var aj=ak.startContainer,an=ak.startOffset,am,al;if(aj.nodeType==1||aj.nodeValue===""){aj=aj.nodeType==1?aj.childNodes[an]:aj;if(aj){am=new t(aj,aj.parentNode);for(al=am.current();al;al=am.next()){if(al.nodeType==3&&!f(al)){ak.setStart(al,0);break}}}}return ak}function W(ak,aj){aj=aj||ag;if(ak){O(aj.styles,function(am,al){c.setStyle(ak,al,r(am,af))});O(aj.attributes,function(am,al){c.setAttrib(ak,al,r(am,af))});O(aj.classes,function(al){al=r(al,af);if(!c.hasClass(ak,al)){c.addClass(ak,al)}})}}function ah(ak){var aj=[],am,al;am=ag.inline||ag.block;al=c.create(am);W(al);K.walk(ak,function(an){var ao;function ap(aq){var au=aq.nodeName.toLowerCase(),at=aq.parentNode.nodeName.toLowerCase(),ar;if(g(au,"br")){ao=0;if(ag.block){c.remove(aq)}return}if(ag.wrapper&&x(aq,Y,af)){ao=0;return}if(ag.block&&!ag.wrapper&&G(au)){aq=c.rename(aq,am);W(aq);aj.push(aq);ao=0;return}if(ag.selector){O(ab,function(av){if("collapsed" in av&&av.collapsed!==ac){return}if(c.is(aq,av.selector)&&!b(aq)){W(aq,av);ar=true}});if(!ag.inline||ar){ao=0;return}}if(d(am,au)&&d(at,am)&&!(aq.nodeType===3&&aq.nodeValue.length===1&&aq.nodeValue.charCodeAt(0)===65279)){if(!ao){ao=al.cloneNode(S);aq.parentNode.insertBefore(ao,aq);aj.push(ao)}ao.appendChild(aq)}else{ao=0;O(a.grep(aq.childNodes),ap);ao=0}}O(an,ap)});if(ag.wrap_links===false){O(aj,function(an){function ao(at){var ar,aq,ap;if(at.nodeName==="A"){aq=al.cloneNode(S);aj.push(aq);ap=a.grep(at.childNodes);for(ar=0;ar<ap.length;ar++){aq.appendChild(ap[ar])}at.appendChild(aq)}O(a.grep(at.childNodes),ao)}ao(an)})}O(aj,function(ap){var an;function aq(at){var ar=0;O(at.childNodes,function(au){if(!f(au)&&!H(au)){ar++}});return ar}function ao(ar){var au,at;O(ar.childNodes,function(av){if(av.nodeType==1&&!H(av)&&!b(av)){au=av;return S}});if(au&&h(au,ag)){at=au.cloneNode(S);W(at);c.replace(at,ar,B);c.remove(au,1)}return at||ar}an=aq(ap);if((aj.length>1||!F(ap))&&an===0){c.remove(ap,1);return}if(ag.inline||ag.wrapper){if(!ag.exact&&an===1){ap=ao(ap)}O(ab,function(ar){O(c.select(ar.inline,ap),function(au){var at;if(ar.wrap_links===false){at=au.parentNode;do{if(at.nodeName==="A"){return}}while(at=at.parentNode)}U(ar,af,au,ar.exact?au:null)})});if(x(ap.parentNode,Y,af)){c.remove(ap,1);ap=0;return B}if(ag.merge_with_parents){c.getParent(ap.parentNode,function(ar){if(x(ar,Y,af)){c.remove(ap,1);ap=0;return B}})}if(ap){ap=u(C(ap),ap);ap=u(ap,C(ap,B))}}})}if(ag){if(aa){X=c.createRng();X.setStartBefore(aa);X.setEndAfter(aa);ah(o(X,ab))}else{if(!ac||!ag.inline||c.select("td.mceSelected,th.mceSelected").length){var ai=V.selection.getNode();ae=q.getBookmark();ah(o(q.getRng(B),ab));if(ag.styles&&(ag.styles.color||ag.styles.textDecoration)){a.walk(ai,I,"childNodes");I(ai)}q.moveToBookmark(ae);q.setRng(Z(q.getRng(B)));V.nodeChanged()}else{Q("apply",Y,af)}}}}function A(Y,ah,ab){var ac=R(Y),aj=ac[0],ag,af,X;function aa(am){var al=am.startContainer,ar=am.startOffset,aq,ap,an,ao;if(al.nodeType==3&&ar>=al.nodeValue.length-1){al=al.parentNode;ar=s(al)+1}if(al.nodeType==1){an=al.childNodes;al=an[Math.min(ar,an.length-1)];aq=new t(al);if(ar>an.length-1){aq.next()}for(ap=aq.current();ap;ap=aq.next()){if(ap.nodeType==3&&!f(ap)){ao=c.create("a",null,E);ap.parentNode.insertBefore(ao,ap);am.setStart(ap,0);q.setRng(am);c.remove(ao);return}}}}function Z(ao){var an,am,al;an=a.grep(ao.childNodes);for(am=0,al=ac.length;am<al;am++){if(U(ac[am],ah,ao,ao)){break}}if(aj.deep){for(am=0,al=an.length;am<al;am++){Z(an[am])}}}function ad(al){var am;O(m(al.parentNode).reverse(),function(an){var ao;if(!am&&an.id!="_start"&&an.id!="_end"){ao=x(an,Y,ah);if(ao&&ao.split!==false){am=an}}});return am}function W(ao,al,aq,au){var av,at,ar,an,ap,am;if(ao){am=ao.parentNode;for(av=al.parentNode;av&&av!=am;av=av.parentNode){at=av.cloneNode(S);for(ap=0;ap<ac.length;ap++){if(U(ac[ap],ah,at,at)){at=0;break}}if(at){if(ar){at.appendChild(ar)}if(!an){an=at}ar=at}}if(au&&(!aj.mixed||!F(ao))){al=c.split(ao,al)}if(ar){aq.parentNode.insertBefore(ar,aq);an.appendChild(aq)}}return al}function ai(al){return W(ad(al),al,al,true)}function ae(an){var am=c.get(an?"_start":"_end"),al=am[an?"firstChild":"lastChild"];if(H(al)){al=al[an?"firstChild":"lastChild"]}c.remove(am,true);return al}function ak(al){var am,an;al=o(al,ac,B);if(aj.split){am=J(al,B);an=J(al);if(am!=an){am=N(am,"span",{id:"_start","data-mce-type":"bookmark"});an=N(an,"span",{id:"_end","data-mce-type":"bookmark"});ai(am);ai(an);am=ae(B);an=ae()}else{am=an=ai(am)}al.startContainer=am.parentNode;al.startOffset=s(am);al.endContainer=an.parentNode;al.endOffset=s(an)+1}K.walk(al,function(ao){O(ao,function(ap){Z(ap);if(ap.nodeType===1&&V.dom.getStyle(ap,"text-decoration")==="underline"&&ap.parentNode&&i(ap.parentNode)==="underline"){U({deep:false,exact:true,inline:"span",styles:{textDecoration:"underline"}},null,ap)}})})}if(ab){X=c.createRng();X.setStartBefore(ab);X.setEndAfter(ab);ak(X);return}if(!q.isCollapsed()||!aj.inline||c.select("td.mceSelected,th.mceSelected").length){ag=q.getBookmark();ak(q.getRng(B));q.moveToBookmark(ag);if(j(Y,ah,q.getStart())){aa(q.getRng(true))}V.nodeChanged()}else{Q("remove",Y,ah)}}function D(X,Z,Y){var W=R(X);if(j(X,Z,Y)&&(!("toggle" in W[0])||W[0]["toggle"])){A(X,Z,Y)}else{T(X,Z,Y)}}function x(X,W,ac,aa){var Y=R(W),ad,ab,Z;function ae(ai,ak,al){var ah,aj,af=ak[al],ag;if(af){if(af.length===p){for(ah in af){if(af.hasOwnProperty(ah)){if(al==="attributes"){aj=c.getAttrib(ai,ah)}else{aj=L(ai,ah)}if(aa&&!aj&&!ak.exact){return}if((!aa||ak.exact)&&!g(aj,r(af[ah],ac))){return}}}}else{for(ag=0;ag<af.length;ag++){if(al==="attributes"?c.getAttrib(ai,af[ag]):L(ai,af[ag])){return ak}}}}return ak}if(Y&&X){for(ab=0;ab<Y.length;ab++){ad=Y[ab];if(h(X,ad)&&ae(X,ad,"attributes")&&ae(X,ad,"styles")){if(Z=ad.classes){for(ab=0;ab<Z.length;ab++){if(!c.hasClass(X,Z[ab])){return}}}return ad}}}}function j(Y,ab,aa){var X,Z;function W(ac){ac=c.getParent(ac,function(ad){return !!x(ad,Y,ab,true)});return x(ac,Y,ab)}if(aa){return W(aa)}if(q.isCollapsed()){for(Z=P.apply.length-1;Z>=0;Z--){if(P.apply[Z].name==Y){return true}}for(Z=P.remove.length-1;Z>=0;Z--){if(P.remove[Z].name==Y){return false}}return W(q.getNode())}aa=q.getNode();if(W(aa)){return B}X=q.getStart();if(X!=aa){if(W(X)){return B}}return S}function v(ad,ac){var aa,ab=[],Z={},Y,X,W;if(q.isCollapsed()){for(X=0;X<ad.length;X++){for(Y=P.remove.length-1;Y>=0;Y--){W=ad[X];if(P.remove[Y].name==W){Z[W]=true;break}}}for(Y=P.apply.length-1;Y>=0;Y--){for(X=0;X<ad.length;X++){W=ad[X];if(!Z[W]&&P.apply[Y].name==W){Z[W]=true;ab.push(W)}}}}aa=q.getStart();c.getParent(aa,function(ag){var af,ae;for(af=0;af<ad.length;af++){ae=ad[af];if(!Z[ae]&&x(ag,ae,ac)){Z[ae]=true;ab.push(ae)}}});return ab}function y(aa){var ac=R(aa),Z,Y,ab,X,W;if(ac){Z=q.getStart();Y=m(Z);for(X=ac.length-1;X>=0;X--){W=ac[X].selector;if(!W){return B}for(ab=Y.length-1;ab>=0;ab--){if(c.is(Y[ab],W)){return B}}}}return S}a.extend(this,{get:R,register:k,apply:T,remove:A,toggle:D,match:j,matchAll:v,matchNode:x,canApply:y});function h(W,X){if(g(W,X.inline)){return B}if(g(W,X.block)){return B}if(X.selector){return c.is(W,X.selector)}}function g(X,W){X=X||"";W=W||"";X=""+(X.nodeName||X);W=""+(W.nodeName||W);return X.toLowerCase()==W.toLowerCase()}function L(X,W){var Y=c.getStyle(X,W);if(W=="color"||W=="backgroundColor"){Y=c.toHex(Y)}if(W=="fontWeight"&&Y==700){Y="bold"}return""+Y}function r(W,X){if(typeof(W)!="string"){W=W(X)}else{if(X){W=W.replace(/%(\w+)/g,function(Z,Y){return X[Y]||Z})}}return W}function f(W){return W&&W.nodeType===3&&/^([\s\r\n]+|)$/.test(W.nodeValue)}function N(Y,X,W){var Z=c.create(X,W);Y.parentNode.insertBefore(Z,Y);Z.appendChild(Y);return Z}function o(W,ag,Z){var Y=W.startContainer,ad=W.startOffset,aj=W.endContainer,ae=W.endOffset,ai,af,ac;function ah(am,an,ak,al){var ao,ap;al=al||c.getRoot();for(;;){ao=am.parentNode;if(ao==al||(!ag[0].block_expand&&F(ao))){return am}for(ai=ao[an];ai&&ai!=am;ai=ai[ak]){if(ai.nodeType==1&&!H(ai)){return am}if(ai.nodeType==3&&!f(ai)){return am}}am=am.parentNode}return am}function ab(ak,al){if(al===p){al=ak.nodeType===3?ak.length:ak.childNodes.length}while(ak&&ak.hasChildNodes()){ak=ak.childNodes[al];if(ak){al=ak.nodeType===3?ak.length:ak.childNodes.length}}return{node:ak,offset:al}}if(Y.nodeType==1&&Y.hasChildNodes()){af=Y.childNodes.length-1;Y=Y.childNodes[ad>af?af:ad];if(Y.nodeType==3){ad=0}}if(aj.nodeType==1&&aj.hasChildNodes()){af=aj.childNodes.length-1;aj=aj.childNodes[ae>af?af:ae-1];if(aj.nodeType==3){ae=aj.nodeValue.length}}if(H(Y.parentNode)){Y=Y.parentNode}if(H(Y)){Y=Y.nextSibling||Y}if(H(aj.parentNode)){ae=c.nodeIndex(aj);aj=aj.parentNode}if(H(aj)&&aj.previousSibling){aj=aj.previousSibling;ae=aj.length}if(ag[0].inline){ac=ab(aj,ae);if(ac.node){while(ac.node&&ac.offset===0&&ac.node.previousSibling){ac=ab(ac.node.previousSibling)}if(ac.node&&ac.offset>0&&ac.node.nodeType===3&&ac.node.nodeValue.charAt(ac.offset-1)===" "){if(ac.offset>1){aj=ac.node;aj.splitText(ac.offset-1)}else{if(ac.node.previousSibling){aj=ac.node.previousSibling}}}}}if(ag[0].inline||ag[0].block_expand){Y=ah(Y,"firstChild","nextSibling");aj=ah(aj,"lastChild","previousSibling")}if(ag[0].selector&&ag[0].expand!==S&&!ag[0].inline){function aa(al,ak){var am,an,ap,ao;if(al.nodeType==3&&al.nodeValue.length==0&&al[ak]){al=al[ak]}am=m(al);for(an=0;an<am.length;an++){for(ap=0;ap<ag.length;ap++){ao=ag[ap];if("collapsed" in ao&&ao.collapsed!==W.collapsed){continue}if(c.is(am[an],ao.selector)){return am[an]}}}return al}Y=aa(Y,"previousSibling");aj=aa(aj,"nextSibling")}if(ag[0].block||ag[0].selector){function X(al,ak,an){var am;if(!ag[0].wrapper){am=c.getParent(al,ag[0].block)}if(!am){am=c.getParent(al.nodeType==3?al.parentNode:al,F)}if(am&&ag[0].wrapper){am=m(am,"ul,ol").reverse()[0]||am}if(!am){am=al;while(am[ak]&&!F(am[ak])){am=am[ak];if(g(am,"br")){break}}}return am||al}Y=X(Y,"previousSibling");aj=X(aj,"nextSibling");if(ag[0].block){if(!F(Y)){Y=ah(Y,"firstChild","nextSibling")}if(!F(aj)){aj=ah(aj,"lastChild","previousSibling")}}}if(Y.nodeType==1){ad=s(Y);Y=Y.parentNode}if(aj.nodeType==1){ae=s(aj)+1;aj=aj.parentNode}return{startContainer:Y,startOffset:ad,endContainer:aj,endOffset:ae}}function U(ac,ab,Z,W){var Y,X,aa;if(!h(Z,ac)){return S}if(ac.remove!="all"){O(ac.styles,function(ae,ad){ae=r(ae,ab);if(typeof(ad)==="number"){ad=ae;W=0}if(!W||g(L(W,ad),ae)){c.setStyle(Z,ad,"")}aa=1});if(aa&&c.getAttrib(Z,"style")==""){Z.removeAttribute("style");Z.removeAttribute("data-mce-style")}O(ac.attributes,function(af,ad){var ae;af=r(af,ab);if(typeof(ad)==="number"){ad=af;W=0}if(!W||g(c.getAttrib(W,ad),af)){if(ad=="class"){af=c.getAttrib(Z,ad);if(af){ae="";O(af.split(/\s+/),function(ag){if(/mce\w+/.test(ag)){ae+=(ae?" ":"")+ag}});if(ae){c.setAttrib(Z,ad,ae);return}}}if(ad=="class"){Z.removeAttribute("className")}if(e.test(ad)){Z.removeAttribute("data-mce-"+ad)}Z.removeAttribute(ad)}});O(ac.classes,function(ad){ad=r(ad,ab);if(!W||c.hasClass(W,ad)){c.removeClass(Z,ad)}});X=c.getAttribs(Z);for(Y=0;Y<X.length;Y++){if(X[Y].nodeName.indexOf("_")!==0){return S}}}if(ac.remove!="none"){n(Z,ac);return B}}function n(Y,Z){var W=Y.parentNode,X;if(Z.block){if(!l){function aa(ac,ab,ad){ac=C(ac,ab,ad);return !ac||(ac.nodeName=="BR"||F(ac))}if(F(Y)&&!F(W)){if(!aa(Y,S)&&!aa(Y.firstChild,B,1)){Y.insertBefore(c.create("br"),Y.firstChild)}if(!aa(Y,B)&&!aa(Y.lastChild,S,1)){Y.appendChild(c.create("br"))}}}else{if(W==c.getRoot()){if(!Z.list_block||!g(Y,Z.list_block)){O(a.grep(Y.childNodes),function(ab){if(d(l,ab.nodeName.toLowerCase())){if(!X){X=N(ab,l)}else{X.appendChild(ab)}}else{X=0}})}}}}if(Z.selector&&Z.inline&&!g(Z.inline,Y)){return}c.remove(Y,1)}function C(X,W,Y){if(X){W=W?"nextSibling":"previousSibling";for(X=Y?X:X[W];X;X=X[W]){if(X.nodeType==1||!f(X)){return X}}}}function H(W){return W&&W.nodeType==1&&W.getAttribute("data-mce-type")=="bookmark"}function u(aa,Z){var W,Y,X;function ac(af,ae){if(af.nodeName!=ae.nodeName){return S}function ad(ah){var ai={};O(c.getAttribs(ah),function(aj){var ak=aj.nodeName.toLowerCase();if(ak.indexOf("_")!==0&&ak!=="style"){ai[ak]=c.getAttrib(ah,ak)}});return ai}function ag(ak,aj){var ai,ah;for(ah in ak){if(ak.hasOwnProperty(ah)){ai=aj[ah];if(ai===p){return S}if(ak[ah]!=ai){return S}delete aj[ah]}}for(ah in aj){if(aj.hasOwnProperty(ah)){return S}}return B}if(!ag(ad(af),ad(ae))){return S}if(!ag(c.parseStyle(c.getAttrib(af,"style")),c.parseStyle(c.getAttrib(ae,"style")))){return S}return B}if(aa&&Z){function ab(ae,ad){for(Y=ae;Y;Y=Y[ad]){if(Y.nodeType==3&&Y.nodeValue.length!==0){return ae}if(Y.nodeType==1&&!H(Y)){return Y}}return ae}aa=ab(aa,"previousSibling");Z=ab(Z,"nextSibling");if(ac(aa,Z)){for(Y=aa.nextSibling;Y&&Y!=Z;){X=Y;Y=Y.nextSibling;aa.appendChild(X)}c.remove(Z);O(a.grep(Z.childNodes),function(ad){aa.appendChild(ad)});return aa}}return Z}function G(W){return/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(W)}function J(X,aa){var W,Z,Y;W=X[aa?"startContainer":"endContainer"];Z=X[aa?"startOffset":"endOffset"];if(W.nodeType==1){Y=W.childNodes.length-1;if(!aa&&Z){Z--}W=W.childNodes[Z>Y?Y:Z]}return W}function Q(ab,X,aa){var Y,W=P[ab],ac=P[ab=="apply"?"remove":"apply"];function ad(){return P.apply.length||P.remove.length}function Z(){P.apply=[];P.remove=[]}function ae(af){O(P.apply.reverse(),function(ag){T(ag.name,ag.vars,af);if(ag.name==="forecolor"&&ag.vars.value){I(af.parentNode)}});O(P.remove.reverse(),function(ag){A(ag.name,ag.vars,af)});c.remove(af,1);Z()}for(Y=W.length-1;Y>=0;Y--){if(W[Y].name==X){return}}W.push({name:X,vars:aa});for(Y=ac.length-1;Y>=0;Y--){if(ac[Y].name==X){ac.splice(Y,1)}}if(ad()){V.getDoc().execCommand("FontName",false,"mceinline");P.lastRng=q.getRng();O(c.select("font,span"),function(ag){var af;if(b(ag)){af=q.getBookmark();ae(ag);q.moveToBookmark(af);V.nodeChanged()}});if(!P.isListening&&ad()){P.isListening=true;O("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(af){V[af].addToTop(function(ag,ah){if(ad()&&!a.dom.RangeUtils.compareRanges(P.lastRng,q.getRng())){O(c.select("font,span"),function(aj){var ak,ai;if(b(aj)){ak=aj.firstChild;if(ak){ae(aj);ai=c.createRng();ai.setStart(ak,ak.nodeValue.length);ai.setEnd(ak,ak.nodeValue.length);q.setRng(ai);ag.nodeChanged()}else{c.remove(aj)}}});if(ah.type=="keyup"||ah.type=="mouseup"){Z()}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});
\ No newline at end of file
+(function(d){var a=/^\s*|\s*$/g,e,c="B".replace(/A(.)|B/,"$1")==="$1";var b={majorVersion:"3",minorVersion:"4.7",releaseDate:"2011-11-03",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=d.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isIE7=s.isIE&&/MSIE [7]/.test(g);s.isIE8=s.isIE&&/MSIE [8]/.test(g);s.isIE9=s.isIE&&/MSIE [9]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(d.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m<f.length;m++){if(r=f[m].href){if(/^https?:\/\/[^\/]+$/.test(r)){r+="/"}k=r?r.match(/.*\//)[0]:""}}function h(i){if(i.src&&/tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(i.src)){if(/_(src|dev)\.js/g.test(i.src)){s.suffix="_src"}if((j=i.src.indexOf("?"))!=-1){s.query=i.src.substring(j+1)}s.baseURL=i.src.substring(0,i.src.lastIndexOf("/"));if(k&&s.baseURL.indexOf("://")==-1&&s.baseURL.indexOf("/")!==0){s.baseURL=k+s.baseURL}return s.baseURL}return null}f=q.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}l=q.getElementsByTagName("head")[0];if(l){f=l.getElementsByTagName("script");for(m=0;m<f.length;m++){if(h(f[m])){return}}}return},is:function(g,f){if(!f){return g!==e}if(f=="array"&&(g.hasOwnProperty&&g instanceof Array)){return true}return typeof(g)==f},makeMap:function(f,j,h){var g;f=f||[];j=j||",";if(typeof(f)=="string"){f=f.split(j)}h=h||{};g=f.length;while(g--){h[f[g]]={}}return h},each:function(i,f,h){var j,g;if(!i){return 0}h=h||i;if(i.length!==e){for(j=0,g=i.length;j<g;j++){if(f.call(h,i[j],j,i)===false){return 0}}}else{for(j in i){if(i.hasOwnProperty(j)){if(f.call(h,i[j],j,i)===false){return 0}}}}return 1},map:function(g,h){var i=[];b.each(g,function(f){i.push(h(f))});return i},grep:function(g,h){var i=[];b.each(g,function(f){if(!h||h(f)){i.push(f)}});return i},inArray:function(g,h){var j,f;if(g){for(j=0,f=g.length;j<f;j++){if(g[j]===h){return j}}}return -1},extend:function(k,j){var h,g,f=arguments;for(h=1,g=f.length;h<g;h++){j=f[h];b.each(j,function(i,l){if(i!==e){k[l]=i}})}return k},trim:function(f){return(f?""+f:"").replace(a,"")},create:function(o,f,j){var n=this,g,i,k,l,h,m=0;o=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(o);k=o[3].match(/(^|\.)(\w+)$/i)[2];i=n.createNS(o[3].replace(/\.\w+$/,""),j);if(i[k]){return}if(o[2]=="static"){i[k]=f;if(this.onCreate){this.onCreate(o[2],o[3],i[k])}return}if(!f[k]){f[k]=function(){};m=1}i[k]=f[k];n.extend(i[k].prototype,f);if(o[5]){g=n.resolve(o[5]).prototype;l=o[5].match(/\.(\w+)$/i)[1];h=i[k];if(m){i[k]=function(){return g[l].apply(this,arguments)}}else{i[k]=function(){this.parent=g[l];return h.apply(this,arguments)}}i[k].prototype[k]=i[k];n.each(g,function(p,q){i[k].prototype[q]=g[q]});n.each(f,function(p,q){if(g[q]){i[k].prototype[q]=function(){this.parent=g[q];return p.apply(this,arguments)}}else{if(q!=k){i[k].prototype[q]=p}}})}n.each(f["static"],function(p,q){i[k][q]=p});if(this.onCreate){this.onCreate(o[2],o[3],i[k].prototype)}},walk:function(i,h,j,g){g=g||this;if(i){if(j){i=i[j]}b.each(i,function(k,f){if(h.call(g,k,f,j)===false){return false}b.walk(k,h,j,g)})}},createNS:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0;g<j.length;g++){f=j[g];if(!h[f]){h[f]={}}h=h[f]}return h},resolve:function(j,h){var g,f;h=h||d;j=j.split(".");for(g=0,f=j.length;g<f;g++){h=h[j[g]];if(!h){break}}return h},addUnload:function(j,i){var h=this;j={func:j,scope:i||this};if(!h.unloads){function g(){var f=h.unloads,l,m;if(f){for(m in f){l=f[m];if(l&&l.func){l.func.call(l.scope,1)}}if(d.detachEvent){d.detachEvent("onbeforeunload",k);d.detachEvent("onunload",g)}else{if(d.removeEventListener){d.removeEventListener("unload",g,false)}}h.unloads=l=f=w=g=0;if(d.CollectGarbage){CollectGarbage()}}}function k(){var l=document;if(l.readyState=="interactive"){function f(){l.detachEvent("onstop",f);if(g){g()}l=0}if(l){l.attachEvent("onstop",f)}d.setTimeout(function(){if(l){l.detachEvent("onstop",f)}},0)}}if(d.attachEvent){d.attachEvent("onunload",g);d.attachEvent("onbeforeunload",k)}else{if(d.addEventListener){d.addEventListener("unload",g,false)}}h.unloads=[j]}else{h.unloads.push(j)}return j},removeUnload:function(i){var g=this.unloads,h=null;b.each(g,function(j,f){if(j&&j.func==i){g.splice(f,1);h=i;return false}});return h},explode:function(f,g){return f?b.map(f.split(g||","),b.trim):f},_addVer:function(g){var f;if(!this.query){return g}f=(g.indexOf("?")==-1?"?":"&")+this.query;if(g.indexOf("#")==-1){return g+f}return g.replace("#",f+"#")},_replace:function(h,f,g){if(c){return g.replace(h,function(){var l=f,j=arguments,k;for(k=0;k<j.length-2;k++){if(j[k]===e){l=l.replace(new RegExp("\\$"+k,"g"),"")}else{l=l.replace(new RegExp("\\$"+k,"g"),j[k])}}return l})}return g.replace(h,f)}};b._init();d.tinymce=d.tinyMCE=b})(window);tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,i,d,c,h;e=tinymce.trim(e);g=f.settings=g||{};if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^[\w-]*:?\/\//.test(e)){h=g.base_uri?g.base_uri.path:new tinymce.util.URI(location.href).directory;e=((g.base_uri&&g.base_uri.protocol)||"http")+"://mce_host"+f.toAbsPath(h,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,h=[],d,g;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(i){if(i){h.push(i)}});e=h;for(c=f.length-1,h=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();(function(){function serialize(o,quote){var i,v,t;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i<o.length;i++){v+=(i>0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(i in o){if(o.hasOwnProperty(i)){v+=typeof o[i]!="function"?(v.length>1?","+quote:quote)+i+quote+":"+serialize(o[i],quote):""}}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(a){a.VK={DELETE:46,BACKSPACE:8,ENTER:13,TAB:9,SPACEBAR:32,UP:38,DOWN:40}})(tinymce);(function(k){var i=k.VK,j=i.BACKSPACE,h=i.DELETE;function c(m){var o=m.dom,n=m.selection;m.onKeyDown.add(function(q,u){var p,v,s,t,r;r=u.keyCode==h;if(r||u.keyCode==j){u.preventDefault();p=n.getRng();v=o.getParent(p.startContainer,o.isBlock);if(r){v=o.getNext(v,o.isBlock)}if(v){s=v.firstChild;while(s&&s.nodeType==3&&s.nodeValue.length==0){s=s.nextSibling}if(s&&s.nodeName==="SPAN"){t=s.cloneNode(false)}}q.getDoc().execCommand(r?"ForwardDelete":"Delete",false,null);v=o.getParent(p.startContainer,o.isBlock);k.each(o.select("span.Apple-style-span,font.Apple-style-span",v),function(x){var y=n.getBookmark();if(t){o.replace(t.cloneNode(false),x,true)}else{o.remove(x,true)}n.moveToBookmark(y)})}})}function d(m){m.onKeyUp.add(function(n,p){var o=p.keyCode;if(o==h||o==j){if(n.dom.isEmpty(n.getBody())){n.setContent("",{format:"raw"});n.nodeChanged();return}}})}function b(m){m.dom.bind(m.getDoc(),"focusin",function(){m.selection.setRng(m.selection.getRng())})}function e(m){m.onKeyDown.add(function(n,q){if(q.keyCode===j){if(n.selection.isCollapsed()&&n.selection.getRng(true).startOffset===0){var p=n.selection.getNode();var o=p.previousSibling;if(o&&o.nodeName&&o.nodeName.toLowerCase()==="hr"){n.dom.remove(o);k.dom.Event.cancel(q)}}}})}function g(m){if(!Range.prototype.getClientRects){m.onMouseDown.add(function(o,p){if(p.target.nodeName==="HTML"){var n=o.getBody();n.blur();setTimeout(function(){n.focus()},0)}})}}function f(m){m.onClick.add(function(n,o){o=o.target;if(/^(IMG|HR)$/.test(o.nodeName)){n.selection.getSel().setBaseAndExtent(o,0,o,1)}if(o.nodeName=="A"&&n.dom.hasClass(o,"mceItemAnchor")){n.selection.select(o)}n.nodeChanged()})}function l(m){var o,n;m.dom.bind(m.getDoc(),"selectionchange",function(){if(n){clearTimeout(n);n=0}n=window.setTimeout(function(){var p=m.selection.getRng();if(!o||!k.dom.RangeUtils.compareRanges(p,o)){m.nodeChanged();o=p}},50)})}function a(m){document.body.setAttribute("role","application")}k.create("tinymce.util.Quirks",{Quirks:function(m){if(k.isWebKit){c(m);d(m);b(m);f(m);if(k.isIDevice){l(m)}}if(k.isIE){e(m);d(m);a(m)}if(k.isGecko){e(m);g(m)}}})})(tinymce);(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;"};d={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n<m.length;n+=2){o=String.fromCharCode(parseInt(m[n],p));if(!g[o]){l="&"+m[n+1]+";";q[o]=l;q[l]=o}}return q}}a=e("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);j.html=j.html||{};j.html.Entities={encodeRaw:function(m,l){return m.replace(l?k:b,function(n){return g[n]||n})},encodeAllRaw:function(l){return(""+l).replace(f,function(m){return g[m]||m})},encodeNumeric:function(m,l){return m.replace(l?k:b,function(n){if(n.length>1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g<j.length;g++){a[j[g]]="\uFEFF"+g;a["\uFEFF"+g]=j[g]}function c(n,q,p,i){function o(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(r){var y={},p,n,v,q,u=d.url_converter,x=d.url_converter_scope||this;function o(C,F){var E,B,A,D;E=y[C+"-top"+F];if(!E){return}B=y[C+"-right"+F];if(E!=B){return}A=y[C+"-bottom"+F];if(B!=A){return}D=y[C+"-left"+F];if(A!=D){return}y[C+F]=D;delete y[C+"-top"+F];delete y[C+"-right"+F];delete y[C+"-bottom"+F];delete y[C+"-left"+F]}function t(B){var C=y[B],A;if(!C||C.indexOf(" ")<0){return}C=C.split(" ");A=C.length;while(A--){if(C[A]!==C[0]){return false}}y[B]=C[0];return true}function z(C,B,A,D){if(!t(B)){return}if(!t(A)){return}if(!t(D)){return}y[C]=y[B]+" "+y[A]+" "+y[D];delete y[B];delete y[A];delete y[D]}function s(A){q=true;return a[A]}function i(B,A){if(q){B=B.replace(/\uFEFF[0-9]/g,function(C){return a[C]})}if(!A){B=B.replace(/\\([\'\";:])/g,"$1")}return B}if(r){r=r.replace(/\\[\"\';:\uFEFF]/g,s).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(A){return A.replace(/[;:]/g,s)});while(p=b.exec(r)){n=p[1].replace(l,"").toLowerCase();v=p[2].replace(l,"");if(n&&v.length>0){if(n==="font-weight"&&v==="700"){v="bold"}else{if(n==="color"||n==="background-color"){v=v.toLowerCase()}}v=v.replace(k,c);v=v.replace(h,function(B,A,E,D,F,C){F=F||C;if(F){F=i(F);return"'"+F.replace(/\'/g,"\\'")+"'"}A=i(A||E||D);if(u){A=u.call(x,A,"style")}return"url('"+A.replace(/\'/g,"\\'")+"')"});y[n]=q?i(v,true):v}b.lastIndex=p.index+p[0].length}o("border","");o("border","-width");o("border","-color");o("border","-style");o("padding","");o("margin","");z("border","border-width","border-style","border-color");if(y.border==="medium none"){delete y.border}}return y},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u<s;u++){t=x[u];v=p[t];if(v!==e&&v.length>0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(m){var h={},j,l,g,f,c={},b,e,d=m.makeMap,k=m.each;function i(o,n){return o.split(n||",")}function a(r,q){var o,p={};function n(s){return s.replace(/[A-Z]+/g,function(t){return n(r[t])})}for(o in r){if(r.hasOwnProperty(o)){r[o]=n(r[o])}}n(q).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(v,t,s,u){s=i(s,"|");p[t]={attributes:d(s),attributesOrder:s,children:d(u,"|",{"#comment":{}})}});return p}l="h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup";l=d(l,",",d(l.toUpperCase()));h=a({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]");j=d("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls");g=d("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source");f=m.extend(d("td,th,iframe,video,audio,object"),g);b=d("pre,script,style,textarea");e=d("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");m.html.Schema=function(r){var A=this,n={},o={},y=[],q,p;r=r||{};if(r.verify_html===false){r.valid_elements="*[*]"}if(r.valid_styles){q={};k(r.valid_styles,function(C,B){q[B]=m.explode(C)})}p=r.whitespace_elements?d(r.whitespace_elements):b;function z(B){return new RegExp("^"+B.replace(/([?+*])/g,".$1")+"$")}function t(I){var H,D,W,S,X,C,F,R,U,N,V,Z,L,G,T,B,P,E,Y,aa,M,Q,K=/^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,O=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,J=/[*?+]/;if(I){I=i(I);if(n["@"]){P=n["@"].attributes;E=n["@"].attributesOrder}for(H=0,D=I.length;H<D;H++){C=K.exec(I[H]);if(C){T=C[1];N=C[2];B=C[3];U=C[4];L={};G=[];F={attributes:L,attributesOrder:G};if(T==="#"){F.paddEmpty=true}if(T==="-"){F.removeEmpty=true}if(P){for(aa in P){L[aa]=P[aa]}G.push.apply(G,E)}if(U){U=i(U,"|");for(W=0,S=U.length;W<S;W++){C=O.exec(U[W]);if(C){R={};Z=C[1];V=C[2].replace(/::/g,":");T=C[3];Q=C[4];if(Z==="!"){F.attributesRequired=F.attributesRequired||[];F.attributesRequired.push(V);R.required=true}if(Z==="-"){delete L[V];G.splice(m.inArray(G,V),1);continue}if(T){if(T==="="){F.attributesDefault=F.attributesDefault||[];F.attributesDefault.push({name:V,value:Q});R.defaultValue=Q}if(T===":"){F.attributesForced=F.attributesForced||[];F.attributesForced.push({name:V,value:Q});R.forcedValue=Q}if(T==="<"){R.validValues=d(Q,"?")}}if(J.test(V)){F.attributePatterns=F.attributePatterns||[];R.pattern=z(V);F.attributePatterns.push(R)}else{if(!L[V]){G.push(V)}L[V]=R}}}}if(!P&&N=="@"){P=L;E=G}if(B){F.outputName=N;n[B]=F}if(J.test(N)){F.pattern=z(N);y.push(F)}else{n[N]=F}}}}}function v(B){n={};y=[];t(B);k(h,function(D,C){o[C]=D.children})}function s(C){var B=/^(~)?(.+)$/;if(C){k(i(C),function(G){var E=B.exec(G),F=E[1]==="~",H=F?"span":"div",D=E[2];o[D]=o[H];c[D]=H;if(!F){l[D]={}}k(o,function(I,J){if(I[H]){I[D]=I[H]}})})}}function u(C){var B=/^([+\-]?)(\w+)\[([^\]]+)\]$/;if(C){k(i(C),function(G){var F=B.exec(G),D,E;if(F){E=F[1];if(E){D=o[F[2]]}else{D=o[F[2]]={"#comment":{}}}D=o[F[2]];k(i(F[3],"|"),function(H){if(E==="-"){delete D[H]}else{D[H]={}}})}})}}function x(B){var D=n[B],C;if(D){return D}C=y.length;while(C--){D=y[C];if(D.pattern.test(B)){return D}}}if(!r.valid_elements){k(h,function(C,B){n[B]={attributes:C.attributes,attributesOrder:C.attributesOrder};o[B]=C.children});k(i("strong/b,em/i"),function(B){B=i(B,"/");n[B[1]].outputName=B[0]});n.img.attributesDefault=[{name:"alt",value:""}];k(i("ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr"),function(B){n[B].removeEmpty=true});k(i("p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption"),function(B){n[B].paddEmpty=true})}else{v(r.valid_elements)}s(r.custom_elements);u(r.valid_children);t(r.extended_valid_elements);u("+ol[ul|ol],+ul[ul|ol]");if(!x("span")){t("span[!data-mce-type|*]")}if(r.invalid_elements){m.each(m.explode(r.invalid_elements),function(B){if(n[B]){delete n[B]}})}A.children=o;A.styles=q;A.getBoolAttrs=function(){return j};A.getBlockElements=function(){return l};A.getShortEndedElements=function(){return g};A.getSelfClosingElements=function(){return e};A.getNonEmptyElements=function(){return f};A.getWhiteSpaceElements=function(){return p};A.isValidChild=function(B,D){var C=o[B];return !!(C&&C[D])};A.getElementRule=x;A.getCustomElements=function(){return c};A.addValidElements=t;A.setValidElements=v;A.addCustomElements=s;A.addValidChildren=u};m.html.Schema.boolAttrMap=j;m.html.Schema.blockElementsMap=l})(tinymce);(function(a){a.html.SaxParser=function(c,e){var b=this,d=function(){};c=c||{};b.schema=e=e||new a.html.Schema();if(c.fix_self_closing!==false){c.fix_self_closing=true}a.each("comment cdata text start end pi doctype".split(" "),function(f){if(f){b[f]=c[f]||d}});b.parse=function(D){var n=this,g,F=0,H,A,z=[],M,P,B,q,y,r,L,G,N,u,m,k,s,Q,o,O,E,R,K,f,I,l,C,J,h,v=0,j=a.html.Entities.decode,x,p;function t(S){var U,T;U=z.length;while(U--){if(z[U].name===S){break}}if(U>=0){for(T=z.length-1;T>=U;T--){S=z[T];if(S.valid){n.end(S.name)}}z.length=U}}l=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/)>))","g");C=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;J={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};L=e.getShortEndedElements();I=e.getSelfClosingElements();G=e.getBoolAttrs();u=c.validate;r=c.remove_internals;x=c.fix_self_closing;p=a.isIE;o=/^:/;while(g=l.exec(D)){if(F<g.index){n.text(j(D.substr(F,g.index-F)))}if(H=g[6]){H=H.toLowerCase();if(p&&o.test(H)){H=H.substr(1)}t(H)}else{if(H=g[7]){H=H.toLowerCase();if(p&&o.test(H)){H=H.substr(1)}N=H in L;if(x&&I[H]&&z.length>0&&z[z.length-1].name===H){t(H)}if(!u||(m=e.getElementRule(H))){k=true;if(u){O=m.attributes;E=m.attributePatterns}if(Q=g[8]){y=Q.indexOf("data-mce-type")!==-1;if(y&&r){k=false}M=[];M.map={};Q.replace(C,function(T,S,X,W,V){var Y,U;S=S.toLowerCase();X=S in G?S:j(X||W||V||"");if(u&&!y&&S.indexOf("data-")!==0){Y=O[S];if(!Y&&E){U=E.length;while(U--){Y=E[U];if(Y.pattern.test(S)){break}}if(U===-1){Y=null}}if(!Y){return}if(Y.validValues&&!(X in Y.validValues)){return}}M.map[S]=X;M.push({name:S,value:X})})}else{M=[];M.map={}}if(u&&!y){R=m.attributesRequired;K=m.attributesDefault;f=m.attributesForced;if(f){P=f.length;while(P--){s=f[P];q=s.name;h=s.value;if(h==="{$uid}"){h="mce_"+v++}M.map[q]=h;M.push({name:q,value:h})}}if(K){P=K.length;while(P--){s=K[P];q=s.name;if(!(q in M.map)){h=s.value;if(h==="{$uid}"){h="mce_"+v++}M.map[q]=h;M.push({name:q,value:h})}}}if(R){P=R.length;while(P--){if(R[P] in M.map){break}}if(P===-1){k=false}}if(M.map["data-mce-bogus"]){k=false}}if(k){n.start(H,M,N)}}else{k=false}if(A=J[H]){A.lastIndex=F=g.index+g[0].length;if(g=A.exec(D)){if(k){B=D.substr(F,g.index-F)}F=g.index+g[0].length}else{B=D.substr(F);F=D.length}if(k&&B.length>0){n.text(B,true)}if(k){n.end(H)}l.lastIndex=F;continue}if(!N){if(!Q||Q.indexOf("/")!=Q.length-1){z.push({name:H,valid:k})}else{if(k){n.end(H)}}}}else{if(H=g[1]){n.comment(H)}else{if(H=g[2]){n.cdata(H)}else{if(H=g[3]){n.doctype(H)}else{if(H=g[4]){n.pi(H,g[5])}}}}}}F=g.index+g[0].length}if(F<D.length){n.text(j(D.substr(F)))}for(P=z.length-1;P>=0;P--){H=z[P];if(H.valid){n.end(H.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h<f;h++){j=m[h];if(j.name!=="id"){k[k.length]={name:j.name,value:j.value};k.map[j.name]=j.value}}n.attributes=k}n.value=g.value;n.shortEnded=g.shortEnded;return n},wrap:function(g){var f=this;f.parent.insert(g,f);g.append(f);return f},unwrap:function(){var f=this,h,g;for(h=f.firstChild;h;){g=h.next;f.insert(h,f,true);h=g}f.remove()},remove:function(){var f=this,h=f.parent,g=f.next,i=f.prev;if(h){if(h.firstChild===f){h.firstChild=g;if(g){g.prev=null}}else{i.next=g}if(h.lastChild===f){h.lastChild=i;if(i){i.next=null}}else{g.prev=i}f.parent=f.next=f.prev=null}return f},append:function(h){var f=this,g;if(h.parent){h.remove()}g=f.lastChild;if(g){g.next=h;h.prev=g;f.lastChild=h}else{f.lastChild=f.firstChild=h}h.parent=f;return h},insert:function(h,f,i){var g;if(h.parent){h.remove()}g=f.parent||this;if(i){if(f===g.firstChild){g.firstChild=h}else{f.prev.next=h}h.prev=f.prev;h.next=f;f.prev=h}else{if(f===g.lastChild){g.lastChild=h}else{f.next.prev=h}h.next=f.next;h.prev=f;f.next=h}h.parent=g;return h},getAll:function(g){var f=this,h,i=[];for(h=f.firstChild;h;h=a(h,f)){if(h.name===g){i.push(h)}}return i},empty:function(){var g=this,f,h,j;if(g.firstChild){f=[];for(j=g.firstChild;j;j=a(j,g)){f.push(j)}h=f.length;while(h--){j=f[h];j.parent=j.firstChild=j.lastChild=j.next=j.prev=null}}g.firstChild=g.lastChild=null;return g},isEmpty:function(k){var f=this,j=f.firstChild,h,g;if(j){do{if(j.type===1){if(j.attributes.map["data-mce-bogus"]){continue}if(k[j.name]){return false}h=j.attributes.length;while(h--){g=j.attributes[h].name;if(g==="name"||g.indexOf("data-")===0){return false}}}if((j.type===3&&!c.test(j.value))){return false}}while(j=a(j,f))}return true},walk:function(f){return a(this,null,f)}});d.extend(b,{create:function(g,f){var i,h;i=new b(g,e[g]||1);if(f){for(h in f){i.attr(h,f[h])}}return i}});d.html.Node=b})(tinymce);(function(b){var a=b.html.Node;b.html.DomParser=function(g,h){var f=this,e={},d=[],i={},c={};g=g||{};g.validate="validate" in g?g.validate:true;g.root_name=g.root_name||"body";f.schema=h=h||new b.html.Schema();function j(m){var o,p,x,v,z,n,q,l,t,u,k,s,y,r;s=b.makeMap("tr,td,th,tbody,thead,tfoot,table");k=h.getNonEmptyElements();for(o=0;o<m.length;o++){p=m[o];if(!p.parent){continue}v=[p];for(x=p.parent;x&&!h.isValidChild(x.name,p.name)&&!s[x.name];x=x.parent){v.push(x)}if(x&&v.length>1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t<v.length-1;t++){if(h.isValidChild(n.name,v[t].name)){q=f.filterNode(v[t].clone());n.append(q)}else{q=n}for(l=v[t].firstChild;l&&l!=v[t+1];){r=l.next;q.append(l);l=r}n=q}if(!z.isEmpty(k)){x.insert(z,v[0],true);x.insert(p,z)}else{x.insert(p,v[0],true)}x=v[0];if(x.isEmpty(k)||x.firstChild===x.lastChild&&x.firstChild.name==="br"){x.empty().remove()}}else{if(p.parent){if(p.name==="li"){y=p.prev;if(y&&(y.name==="ul"||y.name==="ul")){y.append(p);continue}y=p.next;if(y&&(y.name==="ul"||y.name==="ul")){y.insert(p,y.firstChild,true);continue}p.wrap(f.filterNode(new a("ul",1)));continue}if(h.isValidChild(p.parent.name,"div")&&h.isValidChild("div",p.name)){p.wrap(f.filterNode(new a("div",1)))}else{if(p.name==="style"||p.name==="script"){p.empty().remove()}else{p.unwrap()}}}}}}f.filterNode=function(m){var l,k,n;if(k in e){n=i[k];if(n){n.push(m)}else{i[k]=[m]}}l=d.length;while(l--){k=d[l].name;if(k in m.attributes.map){n=c[k];if(n){n.push(m)}else{c[k]=[m]}}}return m};f.addNodeFilter=function(k,l){b.each(b.explode(k),function(m){var n=e[m];if(!n){e[m]=n=[]}n.push(l)})};f.addAttributeFilter=function(k,l){b.each(b.explode(k),function(m){var n;for(n=0;n<d.length;n++){if(d[n].name===m){d[n].callbacks.push(l);return}}d.push({name:m,callbacks:[l]})})};f.parse=function(v,m){var n,H,A,z,C,B,x,r,E,K,y,o,D,J=[],t,k,s,p,u,q;m=m||{};i={};c={};o=b.extend(b.makeMap("script,style,head,html,body,title,meta,param"),h.getBlockElements());u=h.getNonEmptyElements();p=h.children;y=g.validate;q="forced_root_block" in m?m.forced_root_block:g.forced_root_block;s=h.getWhiteSpaceElements();D=/^[ \t\r\n]+/;t=/[ \t\r\n]+$/;k=/[ \t\r\n]+/g;function F(){var L=H.firstChild,l,M;while(L){l=L.next;if(L.type==3||(L.type==1&&L.name!=="p"&&!o[L.name]&&!L.attr("data-mce-type"))){if(!M){M=I(q,1);H.insert(M,L);M.append(L)}else{M.append(L)}}else{M=null}L=l}}function I(l,L){var M=new a(l,L),N;if(l in e){N=i[l];if(N){N.push(M)}else{i[l]=[M]}}return M}function G(M){var N,l,L;for(N=M.prev;N&&N.type===3;){l=N.value.replace(t,"");if(l.length>0){N.value=l;N=N.prev}else{L=N.prev;N.remove();N=L}}}n=new b.html.SaxParser({validate:y,fix_self_closing:!y,cdata:function(l){A.append(I("#cdata",4)).value=l},text:function(M,l){var L;if(!s[A.name]){M=M.replace(k," ");if(A.lastChild&&o[A.lastChild.name]){M=M.replace(D,"")}}if(M.length!==0){L=I("#text",3);L.raw=!!l;A.append(L).value=M}},comment:function(l){A.append(I("#comment",8)).value=l},pi:function(l,L){A.append(I(l,7)).value=L;G(A)},doctype:function(L){var l;l=A.append(I("#doctype",10));l.value=L;G(A)},start:function(l,T,M){var R,O,N,L,P,U,S,Q;N=y?h.getElementRule(l):{};if(N){R=I(N.outputName||l,1);R.attributes=T;R.shortEnded=M;A.append(R);Q=p[A.name];if(Q&&p[R.name]&&!Q[R.name]){J.push(R)}O=d.length;while(O--){P=d[O].name;if(P in T.map){E=c[P];if(E){E.push(R)}else{c[P]=[R]}}}if(o[l]){G(R)}if(!M){A=R}}},end:function(l){var P,M,O,L,N;M=y?h.getElementRule(l):{};if(M){if(o[l]){if(!s[A.name]){for(P=A.firstChild;P&&P.type===3;){O=P.value.replace(D,"");if(O.length>0){P.value=O;P=P.next}else{L=P.next;P.remove();P=L}}for(P=A.lastChild;P&&P.type===3;){O=P.value.replace(t,"");if(O.length>0){P.value=O;P=P.prev}else{L=P.prev;P.remove();P=L}}}P=A.prev;if(P&&P.type===3){O=P.value.replace(D,"");if(O.length>0){P.value=O}else{P.remove()}}}if(M.removeEmpty||M.paddEmpty){if(A.isEmpty(u)){if(M.paddEmpty){A.empty().append(new a("#text","3")).value="\u00a0"}else{if(!A.attributes.map.name){N=A.parent;A.empty().remove();A=N;return}}}}A=A.parent}}},h);H=A=new a(m.context||g.root_name,11);n.parse(v);if(y&&J.length){if(!m.context){j(J)}else{m.invalid=true}}if(q&&H.name=="body"){F()}if(!m.invalid){for(K in i){E=e[K];z=i[K];x=z.length;while(x--){if(!z[x].parent){z.splice(x,1)}}for(C=0,B=E.length;C<B;C++){E[C](z,K,m)}}for(C=0,B=d.length;C<B;C++){E=d[C];if(E.name in c){z=c[E.name];x=z.length;while(x--){if(!z[x].parent){z.splice(x,1)}}for(x=0,r=E.callbacks.length;x<r;x++){E.callbacks[x](z,E.name,m)}}}}return H};if(g.remove_trailing_brs){f.addNodeFilter("br",function(n,m){var r,q=n.length,o,u=h.getBlockElements(),k=h.getNonEmptyElements(),s,p,t;u.body=1;for(r=0;r<q;r++){o=n[r];s=o.parent;if(u[o.parent.name]&&o===s.lastChild){p=o.prev;while(p){t=p.name;if(t!=="span"||p.attr("data-mce-type")!=="bookmark"){if(t!=="br"){break}if(t==="br"){o=null;break}}p=p.prev}if(o){o.remove();if(s.isEmpty(k)){elementRule=h.getElementRule(s.name);if(elementRule){if(elementRule.removeEmpty){s.remove()}else{if(elementRule.paddEmpty){s.empty().append(new b.html.Node("#text",3)).value="\u00a0"}}}}}}}})}}})(tinymce);tinymce.html.Writer=function(e){var c=[],a,b,d,f,g;e=e||{};a=e.indent;b=tinymce.makeMap(e.indent_before||"");d=tinymce.makeMap(e.indent_after||"");f=tinymce.html.Entities.getEncodeFunc(e.entity_encoding||"raw",e.entities);g=e.element_format=="html";return{start:function(m,k,p){var n,j,h,o;if(a&&b[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n<j;n++){h=k[n];c.push(" ",h.name,'="',f(h.value,true),'"')}}if(!p||g){c[c.length]=">"}else{c[c.length]=" />"}if(p&&a&&d[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("</",h,">");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("<![CDATA[",h,"]]>")},comment:function(h){c.push("<!--",h,"-->")},pi:function(h,i){if(i){c.push("<?",h," ",i,"?>")}else{c.push("<?",h,"?>")}if(a){c.push("\n")}},doctype:function(h){c.push("<!DOCTYPE",h,">",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n<m;n++){r=q.attributesOrder[n];if(r in s.map){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}for(n=0,m=s.length;n<m;n++){r=s[n].name;if(!(r in u.map)){p=s.map[r];u.map[r]=p;u.push({name:r,value:p})}}s=u}e.start(k.name,s,o);if(!o){if((k=k.firstChild)){do{f(k)}while(k=k.next)}e.end(j)}}else{t(k)}}if(h.type==1&&!c.inner){f(h)}else{g[11](h)}return e.getContent()}}})(tinymce);(function(h){var f=h.each,e=h.is,d=h.isWebKit,b=h.isIE,c=h.html.Entities,a=/^([a-z0-9],?)+$/i,g=h.html.Schema.blockElementsMap,i=/^[ \t\r\n]*$/;h.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(o,m){var l=this,j,k;l.doc=o;l.win=window;l.files={};l.cssFlicker=false;l.counter=0;l.stdMode=!h.isIE||o.documentMode>=8;l.boxModel=!h.isIE||o.compatMode=="CSS1Compat"||l.stdMode;l.hasOuterHTML="outerHTML" in o.createElement("a");l.settings=m=h.extend({keep_values:false,hex_colors:1},m);l.schema=m.schema;l.styles=new h.html.Styles({url_converter:m.url_converter,url_converter_scope:m.url_converter_scope},m.schema);if(h.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(n){l.cssFlicker=true}}if(b&&m.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(p){o.createElement(p)});for(k in m.schema.getCustomElements()){o.createElement(k)}}h.addUnload(l.destroy,l)},getRoot:function(){var j=this,k=j.settings;return(k&&j.get(k.root_element))||j.doc.body},getViewPort:function(k){var l,j;k=!k?this.win:k;l=k.document;j=this.boxModel?l.documentElement:l.body;return{x:k.pageXOffset||j.scrollLeft,y:k.pageYOffset||j.scrollTop,w:k.innerWidth||j.clientWidth,h:k.innerHeight||j.clientHeight}},getRect:function(m){var l,j=this,k;m=j.get(m);l=j.getPos(m);k=j.getSize(m);return{x:l.x,y:l.y,w:k.w,h:k.h}},getSize:function(m){var k=this,j,l;m=k.get(m);j=k.getStyle(m,"width");l=k.getStyle(m,"height");if(j.indexOf("px")===-1){j=0}if(l.indexOf("px")===-1){l=0}return{w:parseInt(j)||m.offsetWidth||m.clientWidth,h:parseInt(l)||m.offsetHeight||m.clientHeight}},getParent:function(l,k,j){return this.getParents(l,k,j,false)},getParents:function(u,p,l,s){var k=this,j,m=k.settings,q=[];u=k.get(u);s=s===undefined;if(m.strict_root){l=l||k.getRoot()}if(e(p,"string")){j=p;if(p==="*"){p=function(o){return o.nodeType==1}}else{p=function(o){return k.is(o,j)}}}while(u){if(u==l||!u.nodeType||u.nodeType===9){break}if(!p||p(u)){if(s){q.push(u)}else{return u}}u=u.parentNode}return s?q:null},get:function(j){var k;if(j&&this.doc&&typeof(j)=="string"){k=j;j=this.doc.getElementById(j);if(j&&j.id!==k){return this.doc.getElementsByName(k)[1]}}return j},getNext:function(k,j){return this._findSib(k,j,"nextSibling")},getPrev:function(k,j){return this._findSib(k,j,"previousSibling")},select:function(l,k){var j=this;return h.dom.Sizzle(l,j.get(k)||j.get(j.settings.root_element)||j.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(a.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return h.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(m,q,j,l,o){var k=this;return this.run(m,function(s){var r,n;r=e(q,"string")?k.doc.createElement(q):q;k.setAttribs(r,j);if(l){if(l.nodeType){r.appendChild(l)}else{k.setHTML(r,l)}}return !o?s.appendChild(r):r})},create:function(l,j,k){return this.add(this.doc.createElement(l),l,j,k,1)},createHTML:function(r,j,p){var q="",m=this,l;q+="<"+r;for(l in j){if(j.hasOwnProperty(l)){q+=" "+l+'="'+m.encode(j[l])+'"'}}if(typeof(p)!="undefined"){return q+">"+p+"</"+r+">"}return q+" />"},remove:function(j,k){return this.run(j,function(m){var n,l=m.parentNode;if(!l){return null}if(k){while(n=m.firstChild){if(!h.isIE||n.nodeType!==3||n.nodeValue){l.insertBefore(n,m)}else{m.removeChild(n)}}}return l.removeChild(m)})},setStyle:function(m,j,k){var l=this;return l.run(m,function(p){var o,n;o=p.style;j=j.replace(/-(\D)/g,function(r,q){return q.toUpperCase()});if(l.pixelStyles.test(j)&&(h.is(k,"number")||/^[\-0-9\.]+$/.test(k))){k+="px"}switch(j){case"opacity":if(b){o.filter=k===""?"":"alpha(opacity="+(k*100)+")";if(!m.currentStyle||!m.currentStyle.hasLayout){o.display="inline-block"}}o[j]=o["-moz-opacity"]=o["-khtml-opacity"]=k||"";break;case"float":b?o.styleFloat=k:o.cssFloat=k;break;default:o[j]=k||""}if(l.settings.update_styles){l.setAttrib(p,"data-mce-style")}})},getStyle:function(m,j,l){m=this.get(m);if(!m){return}if(this.doc.defaultView&&l){j=j.replace(/[A-Z]/g,function(n){return"-"+n});try{return this.doc.defaultView.getComputedStyle(m,null).getPropertyValue(j)}catch(k){return null}}j=j.replace(/-(\D)/g,function(o,n){return n.toUpperCase()});if(j=="float"){j=b?"styleFloat":"cssFloat"}if(m.currentStyle&&l){return m.currentStyle[j]}return m.style?m.style[j]:undefined},setStyles:function(m,n){var k=this,l=k.settings,j;j=l.update_styles;l.update_styles=0;f(n,function(o,p){k.setStyle(m,p,o)});l.update_styles=j;if(l.update_styles){k.setAttrib(m,l.cssText)}},removeAllAttribs:function(j){return this.run(j,function(m){var l,k=m.attributes;for(l=k.length-1;l>=0;l--){m.removeAttributeNode(k.item(l))}})},setAttrib:function(l,m,j){var k=this;if(!l||!m){return}if(k.settings.strict){m=m.toLowerCase()}return this.run(l,function(o){var n=k.settings;if(j!==null){switch(m){case"style":if(!e(j,"string")){f(j,function(p,q){k.setStyle(o,q,p)});return}if(n.keep_values){if(j&&!k._isRes(j)){o.setAttribute("data-mce-style",j,2)}else{o.removeAttribute("data-mce-style",2)}}o.style.cssText=j;break;case"class":o.className=j||"";break;case"src":case"href":if(n.keep_values){if(n.url_converter){j=n.url_converter.call(n.url_converter_scope||k,j,m,o)}k.setAttrib(o,"data-mce-"+m,j,2)}break;case"shape":o.setAttribute("data-mce-style",j);break}}if(e(j)&&j!==null&&j.length!==0){o.setAttribute(m,""+j,2)}else{o.removeAttribute(m,2)}})},setAttribs:function(k,l){var j=this;return this.run(k,function(m){f(l,function(o,p){j.setAttrib(m,p,o)})})},getAttrib:function(o,p,l){var j,k=this,m;o=k.get(o);if(!o||o.nodeType!==1){return l===m?false:l}if(!e(l)){l=""}if(/^(src|href|style|coords|shape)$/.test(p)){j=o.getAttribute("data-mce-"+p);if(j){return j}}if(b&&k.props[p]){j=o[k.props[p]];j=j&&j.nodeValue?j.nodeValue:j}if(!j){j=o.getAttribute(p,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(p)){if(o[k.props[p]]===true&&j===""){return p}return j?p:""}if(o.nodeName==="FORM"&&o.getAttributeNode(p)){return o.getAttributeNode(p).nodeValue}if(p==="style"){j=j||o.style.cssText;if(j){j=k.serializeStyle(k.parseStyle(j),o.nodeName);if(k.settings.keep_values&&!k._isRes(j)){o.setAttribute("data-mce-style",j)}}}if(d&&p==="class"&&j){j=j.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(p){case"rowspan":case"colspan":if(j===1){j=""}break;case"size":if(j==="+0"||j===20||j===0){j=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(j===0){j=""}break;case"hspace":if(j===-1){j=""}break;case"maxlength":case"tabindex":if(j===32768||j===2147483647||j==="32768"){j=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(j===65535){return p}return l;case"shape":j=j.toLowerCase();break;default:if(p.indexOf("on")===0&&j){j=h._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+j)}}}return(j!==m&&j!==null&&j!=="")?""+j:l},getPos:function(s,m){var k=this,j=0,q=0,o,p=k.doc,l;s=k.get(s);m=m||p.body;if(s){if(s.getBoundingClientRect){s=s.getBoundingClientRect();o=k.boxModel?p.documentElement:p.body;j=s.left+(p.documentElement.scrollLeft||p.body.scrollLeft)-o.clientTop;q=s.top+(p.documentElement.scrollTop||p.body.scrollTop)-o.clientLeft;return{x:j,y:q}}l=s;while(l&&l!=m&&l.nodeType){j+=l.offsetLeft||0;q+=l.offsetTop||0;l=l.offsetParent}l=s.parentNode;while(l&&l!=m&&l.nodeType){j-=l.scrollLeft||0;q-=l.scrollTop||0;l=l.parentNode}}return{x:j,y:q}},parseStyle:function(j){return this.styles.parse(j)},serializeStyle:function(k,j){return this.styles.serialize(k,j)},loadCSS:function(j){var l=this,m=l.doc,k;if(!j){j=""}k=l.select("head")[0];f(j.split(","),function(n){var o;if(l.files[n]){return}l.files[n]=true;o=l.create("link",{rel:"stylesheet",href:h._addVer(n)});if(b&&m.documentMode&&m.recalc){o.onload=function(){if(m.recalc){m.recalc()}o.onload=null}}k.appendChild(o)})},addClass:function(j,k){return this.run(j,function(l){var m;if(!k){return 0}if(this.hasClass(l,k)){return l.className}m=this.removeClass(l,k);return l.className=(m!=""?(m+" "):"")+k})},removeClass:function(l,m){var j=this,k;return j.run(l,function(o){var n;if(j.hasClass(o,m)){if(!k){k=new RegExp("(^|\\s+)"+m+"(\\s+|$)","g")}n=o.className.replace(k," ");n=h.trim(n!=" "?n:"");o.className=n;if(!n){o.removeAttribute("class");o.removeAttribute("className")}return n}return o.className})},hasClass:function(k,j){k=this.get(k);if(!k||!j){return false}return(" "+k.className+" ").indexOf(" "+j+" ")!==-1},show:function(j){return this.setStyle(j,"display","block")},hide:function(j){return this.setStyle(j,"display","none")},isHidden:function(j){j=this.get(j);return !j||j.style.display=="none"||this.getStyle(j,"display")=="none"},uniqueId:function(j){return(!j?"mce_":j)+(this.counter++)},setHTML:function(l,k){var j=this;return j.run(l,function(n){if(b){while(n.firstChild){n.removeChild(n.firstChild)}try{n.innerHTML="<br />"+k;n.removeChild(n.firstChild)}catch(m){n=j.create("div");n.innerHTML="<br />"+k;f(n.childNodes,function(p,o){if(o){n.appendChild(p)}})}}else{n.innerHTML=k}return k})},getOuterHTML:function(l){var k,j=this;l=j.get(l);if(!l){return null}if(l.nodeType===1&&j.hasOuterHTML){return l.outerHTML}k=(l.ownerDocument||j.doc).createElement("body");k.appendChild(l.cloneNode(true));return k.innerHTML},setOuterHTML:function(m,k,n){var j=this;function l(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){j.insertAfter(s.cloneNode(true),p);s=s.previousSibling}j.remove(p)}return this.run(m,function(p){p=j.get(p);if(p.nodeType==1){n=n||p.ownerDocument||j.doc;if(b){try{if(b&&p.nodeType==1){p.outerHTML=k}else{l(p,k,n)}}catch(o){l(p,k,n)}}else{l(p,k,n)}}})},decode:c.decode,encode:c.encodeAllRaw,insertAfter:function(j,k){k=this.get(k);return this.run(j,function(m){var l,n;l=k.parentNode;n=k.nextSibling;if(n){l.insertBefore(m,n)}else{l.appendChild(m)}return m})},isBlock:function(k){var j=k.nodeType;if(j){return !!(j===1&&g[k.nodeName])}return !!g[k]},replace:function(p,m,j){var l=this;if(e(m,"array")){p=p.cloneNode(true)}return l.run(m,function(k){if(j){f(h.grep(k.childNodes),function(n){p.appendChild(n)})}return k.parentNode.replaceChild(p,k)})},rename:function(m,j){var l=this,k;if(m.nodeName!=j.toUpperCase()){k=l.create(j);f(l.getAttribs(m),function(n){l.setAttrib(k,n.nodeName,l.getAttrib(m,n.nodeName))});l.replace(k,m,1)}return k||m},findCommonAncestor:function(l,j){var m=l,k;while(m){k=j;while(k&&m!=k){k=k.parentNode}if(m==k){break}m=m.parentNode}if(!m&&l.ownerDocument){return l.ownerDocument.documentElement}return m},toHex:function(j){var l=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(j);function k(m){m=parseInt(m).toString(16);return m.length>1?m:"0"+m}if(l){j="#"+k(l[1])+k(l[2])+k(l[3]);return j}return j},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(r){f(r.imports,function(s){q(s)});f(r.cssRules||r.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){f(s.selectorText.split(","),function(t){t=t.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(t)||!/\.[\w\-]+$/.test(t)){return}l=t;t=h._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",t);if(p&&!(t=p(t,l))){return}if(!o[t]){j.push({"class":t});o[t]=1}})}break;case 3:q(s.styleSheet);break}})}try{f(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(m,l,k){var j=this,n;if(j.doc&&typeof(m)==="string"){m=j.get(m)}if(!m){return false}k=k||this;if(!m.nodeType&&(m.length||m.length===0)){n=[];f(m,function(p,o){if(p){if(typeof(p)=="string"){p=j.doc.getElementById(p)}n.push(l.call(k,p,o))}});return n}return l.call(k,m)},getAttribs:function(k){var j;k=this.get(k);if(!k){return[]}if(b){j=[];if(k.nodeName=="OBJECT"){return k.attributes}if(k.nodeName==="OPTION"&&this.getAttrib(k,"selected")){j.push({specified:1,nodeName:"selected"})}k.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(l){j.push({specified:1,nodeName:l})});return j}return k.attributes},isEmpty:function(m,k){var r=this,o,n,q,j,l,p;m=m.firstChild;if(m){j=new h.dom.TreeWalker(m);k=k||r.schema?r.schema.getNonEmptyElements():null;do{q=m.nodeType;if(q===1){if(m.getAttribute("data-mce-bogus")){continue}l=m.nodeName.toLowerCase();if(k&&k[l]){p=m.parentNode;if(l==="br"&&r.isBlock(p)&&p.firstChild===m&&p.lastChild===m){continue}return false}n=r.getAttribs(m);o=m.attributes.length;while(o--){l=m.attributes[o].nodeName;if(l==="name"||l==="data-mce-bookmark"){return false}}}if((q===3&&!i.test(m.nodeValue))){return false}}while(m=j.next())}return true},destroy:function(k){var j=this;if(j.events){j.events.destroy()}j.win=j.doc=j.root=j.events=null;if(!k){h.removeUnload(j.destroy)}},createRng:function(){var j=this.doc;return j.createRange?j.createRange():new h.dom.Range(this)},nodeIndex:function(n,o){var j=0,l,m,k;if(n){for(l=n.nodeType,n=n.previousSibling,m=n;n;n=n.previousSibling){k=n.nodeType;if(o&&k==3){if(k==l||!n.nodeValue.length){continue}}j++;l=k}}return j},split:function(n,m,q){var s=this,j=s.createRng(),o,l,p;function k(v){var t,r=v.childNodes,u=v.nodeType;if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){k(r[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){if(!s.isBlock(v.parentNode)||h.trim(v.nodeValue).length>0){return}}else{if(u==1){r=v.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(r[0],v)}if(r.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}s.remove(v)}return v}if(n&&m){j.setStart(n.parentNode,s.nodeIndex(n));j.setEnd(m.parentNode,s.nodeIndex(m));o=j.extractContents();j=s.createRng();j.setStart(m.parentNode,s.nodeIndex(m)+1);j.setEnd(n.parentNode,s.nodeIndex(n)+1);l=j.extractContents();p=n.parentNode;p.insertBefore(k(o),n);if(q){p.replaceChild(q,m)}else{p.insertBefore(m,n)}p.insertBefore(k(l),n);s.remove(n);return q||m}},bind:function(n,j,m,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.add(n,j,m,l||this)},unbind:function(m,j,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.remove(m,j,l)},_findSib:function(m,j,k){var l=this,n=j;if(m){if(e(n,"string")){n=function(o){return l.is(o,j)}}for(m=m[k];m;m=m[k]){if(n(m)){return m}}}return null},_isRes:function(j){return/^(top|left|bottom|right|width|height)/i.test(j)||/;\s*(top|left|bottom|right|width|height)/i.test(j)}});h.DOM=new h.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(Y,t){var ab=N[h],W=N[U],aa=N[P],V=N[z],Z=t.startContainer,ad=t.startOffset,X=t.endContainer,ac=t.endOffset;if(Y===0){return G(ab,W,Z,ad)}if(Y===1){return G(aa,V,Z,ad)}if(Y===2){return G(aa,V,X,ac)}if(Y===3){return G(ab,W,X,ac)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z<Y){return -1}return 1}aa=V;while(aa&&aa.parentNode!=X){aa=aa.parentNode}if(aa){W=0;t=X.firstChild;while(t!=aa&&W<Z){W++;t=t.nextSibling}if(Z<=W){return -1}return 1}aa=X;while(aa&&aa.parentNode!=V){aa=aa.parentNode}if(aa){W=0;t=V.firstChild;while(t!=aa&&W<Y){W++;t=t.nextSibling}if(W<Y){return -1}return 1}ab=c.findCommonAncestor(X,V);ad=X;while(ad&&ad.parentNode!=ab){ad=ad.parentNode}if(!ad){ad=ab}ac=V;while(ac&&ac.parentNode!=ab){ac=ac.parentNode}if(!ac){ac=ab}if(ad==ac){return 0}t=ab.firstChild;while(t){if(t==ad){return -1}if(t==ac){return 1}t=t.nextSibling}}function B(V,Y,X){var t,W;if(V){N[h]=Y;N[U]=X}else{N[P]=Y;N[z]=X}t=N[P];while(t.parentNode){t=t.parentNode}W=N[h];while(W.parentNode){W=W.parentNode}if(W==t){if(G(N[h],N[U],N[P],N[z])>0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}k.setEndPoint(j?"EndToStart":"EndToEnd",i);if(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)>0){k=i.duplicate();k.collapse(j);o=-1;while(s==k.parentElement()){if(k.move("character",-1)==0){break}o++}}o=o||k.text.replace("\r\n"," ").length}else{k.collapse(true);k.setEndPoint(j?"StartToStart":"StartToEnd",i);o=k.text.replace("\r\n"," ").length}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var u,t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p&&t.nodeType!==9){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,s,q,r=d.dom.doc,m=r.body;function j(z){var u,y,t,x,v;t=h.create("a");u=z?k:s;y=z?p:q;x=n.duplicate();if(u==r||u==r.documentElement){u=m;y=0}if(u.nodeType==3){u.parentNode.insertBefore(t,u);x.moveToElementText(t);x.moveStart("character",y);h.remove(t);n.setEndPoint(z?"StartToStart":"EndToEnd",x)}else{v=u.childNodes;if(v.length){if(y>=v.length){h.insertAfter(t,v[v.length-1])}else{u.insertBefore(t,v[y])}x.moveToElementText(t)}else{t=r.createTextNode("\uFEFF");u.appendChild(t);x.moveToElementText(t.parentNode);x.collapse(c)}n.setEndPoint(z?"StartToStart":"EndToEnd",x);h.remove(t)}}k=i.startContainer;p=i.startOffset;s=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==s&&k.nodeType==1&&p==q-1){if(p==q-1){try{l=m.createControlRange();l.addElement(k.childNodes[p]);l.select();return}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e<r.length;e++){if(r[e]===r[e-1]){r.splice(e--,1)}}}}return r};b.matches=function(e,r){return b(e,null,null,r)};b.find=function(y,e,z){var x;if(!y){return[]}for(var t=0,s=f.order.length;t<s;t++){var v=f.order[t],u;if((u=f.leftMatch[v].exec(y))){var r=u[1];u.splice(1,1);if(r.substr(r.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");x=f.find[v](u,e,z);if(x!=null){y=y.replace(f.match[v],"");break}}}}if(!x){x=e.getElementsByTagName("*")}return{set:x,expr:y}};b.filter=function(C,B,F,u){var s=C,H=[],z=B,x,e,y=B&&B[0]&&b.isXML(B[0]);while(C&&B.length){for(var A in f.filter){if((x=f.leftMatch[A].exec(C))!=null&&x[2]){var r=f.filter[A],G,E,t=x[1];e=false;x.splice(1,1);if(t.substr(t.length-1)==="\\"){continue}if(z===H){H=[]}if(f.preFilter[A]){x=f.preFilter[A](x,z,F,H,u,y);if(!x){e=G=true}else{if(x===true){continue}}}if(x){for(var v=0;(E=z[v])!=null;v++){if(E){G=r(E,x,v,z);var D=u^!!G;if(F&&G!=null){if(D){e=true}else{z[v]=false}}else{if(D){H.push(E);e=true}}}}}if(G!==undefined){if(!F){z=H}C=C.replace(f.match[A],"");if(!e){return[]}break}}}if(C===s){if(e==null){b.error(C)}else{break}}s=C}return z};b.error=function(e){throw"Syntax error, unrecognized expression: "+e};var f=b.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(x,r){var t=typeof r==="string",v=t&&!/\W/.test(r),y=t&&!v;if(v){r=r.toLowerCase()}for(var s=0,e=x.length,u;s<e;s++){if((u=x[s])){while((u=u.previousSibling)&&u.nodeType!==1){}x[s]=y||u&&u.nodeName.toLowerCase()===r?u||false:u===r}}if(y){b.filter(r,x,true)}},">":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s<e;s++){v=x[s];if(v){var t=v.parentNode;x[s]=t.nodeName.toLowerCase()===r?t:false}}}else{for(;s<e;s++){v=x[s];if(v){x[s]=u?v.parentNode:v.parentNode===r}}if(u){b.filter(r,x,true)}}},"":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("parentNode",r,s,t,u,v)},"~":function(t,r,v){var s=j++,e=q,u;if(typeof r==="string"&&!/\W/.test(r)){r=r.toLowerCase();u=r;e=n}e("previousSibling",r,s,t,u,v)}},find:{ID:function(r,s,t){if(typeof s.getElementById!=="undefined"&&!t){var e=s.getElementById(r[1]);return e?[e]:[]}},NAME:function(s,v){if(typeof v.getElementsByName!=="undefined"){var r=[],u=v.getElementsByName(s[1]);for(var t=0,e=u.length;t<e;t++){if(u[t].getAttribute("name")===s[1]){r.push(u[t])}}return r.length===0?null:r}},TAG:function(e,r){return r.getElementsByTagName(e[1])}},preFilter:{CLASS:function(t,r,s,e,x,y){t=" "+t[1].replace(/\\/g,"")+" ";if(y){return t}for(var u=0,v;(v=r[u])!=null;u++){if(v){if(x^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(t)>=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return r<e[3]-0},gt:function(s,r,e){return r>e[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v<u;v++){if(t[v]===s){return false}}return true}else{b.error("Syntax error, unrecognized expression: "+e)}}}},CHILD:function(e,t){var x=t[1],r=e;switch(x){case"only":case"first":while((r=r.previousSibling)){if(r.nodeType===1){return false}}if(x==="first"){return true}r=e;case"last":while((r=r.nextSibling)){if(r.nodeType===1){return false}}return true;case"nth":var s=t[2],A=t[3];if(s===1&&A===0){return true}var v=t[0],z=e.parentNode;if(z&&(z.sizcache!==v||!e.nodeIndex)){var u=0;for(r=z.firstChild;r;r=r.nextSibling){if(r.nodeType===1){r.nodeIndex=++u}}z.sizcache=v}var y=e.nodeIndex-A;if(s===0){return y===0}else{return(y%s===0&&y/s>=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s<e;s++){r.push(u[s])}}else{for(;u[s];s++){r.push(u[s])}}}return r}}var c;if(document.documentElement.compareDocumentPosition){c=function(r,e){if(!r.compareDocumentPosition||!e.compareDocumentPosition){if(r==e){o=true}return r.compareDocumentPosition?-1:1}var s=r.compareDocumentPosition(e)&4?-1:r===e?0:1;if(s===0){o=true}return s}}else{if("sourceIndex" in document.documentElement){c=function(r,e){if(!r.sourceIndex||!e.sourceIndex){if(r==e){o=true}return r.sourceIndex?-1:1}var s=r.sourceIndex-e.sourceIndex;if(s===0){o=true}return s}}else{if(document.createRange){c=function(t,r){if(!t.ownerDocument||!r.ownerDocument){if(t==r){o=true}return t.ownerDocument?-1:1}var s=t.ownerDocument.createRange(),e=r.ownerDocument.createRange();s.setStart(t,0);s.setEnd(t,0);e.setStart(r,0);e.setEnd(r,0);var u=s.compareBoundaryPoints(Range.START_TO_END,e);if(u===0){o=true}return u}}}}b.getText=function(e){var r="",t;for(var s=0;e[s];s++){t=e[s];if(t.nodeType===3||t.nodeType===4){r+=t.nodeValue}else{if(t.nodeType!==8){r+=b.getText(t.childNodes)}}}return r};(function(){var r=document.createElement("div"),s="script"+(new Date()).getTime();r.innerHTML="<a name='"+s+"'/>";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="<p class='TEST'></p>";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1&&!z){e.sizcache=v;e.sizset=t}if(e.nodeName.toLowerCase()===x){u=e;break}e=e[r]}A[t]=u}}}function q(r,x,v,A,y,z){for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1){if(!z){e.sizcache=v;e.sizset=t}if(typeof x!=="string"){if(e===x){u=true;break}}else{if(b.filter(x,[e]).length>0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x<r;x++){b(e,s[x],t)}return b.filter(u,t)};window.tinymce.dom.Sizzle=b})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j<arguments.length;j++){h.push(arguments[j])}h=e[g].apply(e,h);b.update(g);return h}});a.extend(b,{on:function(i,h,g){return a.dom.Event.add(b.id,i,h,g)},getXY:function(){return{x:parseInt(b.getStyle("left")),y:parseInt(b.getStyle("top"))}},getSize:function(){var g=e.get(b.id);return{w:parseInt(b.getStyle("width")||g.clientWidth),h:parseInt(b.getStyle("height")||g.clientHeight)}},moveTo:function(g,h){b.setStyles({left:g,top:h})},moveBy:function(g,i){var h=b.getXY();b.moveTo(h.x+g,h.y+i)},resizeTo:function(g,i){b.setStyles({width:g,height:i})},resizeBy:function(g,j){var i=b.getSize();b.resizeTo(i.w+g,i.h+j)},update:function(h){var g;if(a.isIE6&&d.blocker){h=h||"";if(h.indexOf("get")===0||h.indexOf("has")===0||h.indexOf("is")===0){return}if(h=="remove"){e.remove(b.blocker);return}if(!b.blocker){b.blocker=e.uniqueId();g=e.add(d.container||e.getRoot(),"iframe",{id:b.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});e.setStyle(g,"opacity",0)}else{g=e.get(b.blocker)}e.setStyles(g,{left:b.getStyle("left",1),top:b.getStyle("top",1),width:b.getStyle("width",1),height:b.getStyle("height",1),display:b.getStyle("display",1),zIndex:parseInt(b.getStyle("zIndex",1)||0)-1})}}})}})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}if(c.isIE&&i.boxModel){this._fixIESelection()}c.addUnload(f.destroy,f)},setCursorLocation:function(h,i){var f=this;var g=f.dom.createRng();g.setStart(h,i);g.setEnd(h,i);f.setRng(g);f.collapse(false)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";g.forced_root_block="";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML="<br>"+(h.item?h.item(0).outerHTML:h.htmlText);l.removeChild(l.firstChild)}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(g,i){var n=this,f=n.getRng(),j,k=n.win.document,m,l;i=i||{format:"html"};i.set=true;g=i.content=g;if(!i.no_events){n.onBeforeSetContent.dispatch(n,i)}g=i.content;if(f.insertNode){g+='<span id="__caret">_</span>';if(f.startContainer==k&&f.endContainer==k){k.body.innerHTML=g}else{f.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=g}else{if(f.createContextualFragment){f.insertNode(f.createContextualFragment(g))}else{m=k.createDocumentFragment();l=k.createElement("div");m.appendChild(l);l.outerHTML=g;f.insertNode(m)}}}j=n.dom.get("__caret");f=k.createRange();f.setStartBefore(j);f.setEndBefore(j);n.setRng(f);n.dom.remove("__caret");try{n.setRng(f)}catch(h){}}else{if(f.item){k.execCommand("Delete",false,null);f=n.getRng()}if(/^\s+/.test(g)){f.pasteHTML('<span id="__mce_tmp">_</span>'+g);n.dom.remove("__mce_tmp")}else{f.pasteHTML(g)}}if(!i.no_events){n.onSetContent.dispatch(n,i)}},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(r,s){var v=this,m=v.dom,g,j,i,n,h,o,p,l="\uFEFF",u;function f(x,y){var t=0;d(m.select(x),function(A,z){if(A==y){t=z}});return t}if(r==2){function k(){var x=v.getRng(true),t=m.getRoot(),y={};function z(C,H){var B=C[H?"startContainer":"endContainer"],G=C[H?"startOffset":"endOffset"],A=[],D,F,E=0;if(B.nodeType==3){if(s){for(D=B.previousSibling;D&&D.nodeType==3;D=D.previousSibling){G+=D.nodeValue.length}}A.push(G)}else{F=B.childNodes;if(G>=F.length&&F.length){E=1;G=Math.max(0,F.length-1)}A.push(v.dom.nodeIndex(F[G],s)+E)}for(;B&&B!=t;B=B.parentNode){A.push(v.dom.nodeIndex(B,s))}return A}y.start=z(x,true);if(!v.isCollapsed()){y.end=z(x)}return y}if(v.tridentSel){return v.tridentSel.getBookmark(r)}return k()}if(r){return{rng:v.getRng()}}g=v.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();u="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();try{g.collapse();g.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_start" style="'+u+'">'+l+"</span>");if(!n){j.collapse(false);g.moveToElementText(j.parentElement());if(g.compareEndPoints("StartToEnd",j)==0){j.move("character",-1)}j.pasteHTML('<span data-mce-type="bookmark" id="'+i+'_end" style="'+u+'">'+l+"</span>")}}catch(q){return null}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=v.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_end",style:u},l))}g.collapse(true);g.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_start",style:u},l))}v.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){y=t[0];for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(t[v]>u.length-1){return}x=u[t[v]]}if(x.nodeType===3){y=Math.min(t[0],x.nodeValue.length)}if(x.nodeType===1){y=Math.min(t[0],x.childNodes.length)}if(z){f.setStart(x,y)}else{f.setEnd(x,y)}}return true}if(r.tridentSel){return r.tridentSel.moveToBookmark(n)}if(g(true)&&g()){r.setRng(f)}}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3&&!c.isOpera){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(l.isBlock(t)&&!t.innerHTML){t.innerHTML=!a?'<br data-mce-bogus="1" />':" "}return t}k("start");k("end");if(j){f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;if(k){f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g)}return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var h=this,g=h.getRng(),i;if(g.item){i=g.item(0);g=h.win.document.body.createTextRange();g.moveToElementText(i)}g.collapse(!!f);h.setRng(g)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(l){var g=this,h,i,k,j=g.win.document;if(l&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():j.createRange())}}catch(f){}if(c.isIE&&i&&i.setStart&&j.selection.createRange().item){k=j.selection.createRange().item(0);i=j.createRange();i.setStartBefore(k);i.setEndAfter(k)}if(!i){i=j.createRange?j.createRange():j.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;try{h.removeAllRanges()}catch(f){}h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var h=this,g=h.getRng(),i=h.getSel(),l,k=g.startContainer,f=g.endContainer;if(!g){return h.dom.getRoot()}if(g.setStart){l=g.commonAncestorContainer;if(!g.collapsed){if(g.startContainer==g.endContainer){if(g.endOffset-g.startOffset<2){if(g.startContainer.hasChildNodes()){l=g.startContainer.childNodes[g.startOffset]}}}if(k.nodeType===3&&f.nodeType===3){function j(p,m){var o=p;while(p&&p.nodeType===3&&p.length===0){p=m?p.nextSibling:p.previousSibling}return p||o}if(k.length===g.startOffset){k=j(k.nextSibling,true)}else{k=k.parentNode}if(g.endOffset===0){f=j(f.previousSibling,false)}else{f=f.parentNode}if(k&&k===f){return k}}}if(l&&l.nodeType==3){return l.parentNode}return l}return g.item?g.item(0):g.parentElement()},getSelectedBlocks:function(o,g){var m=this,j=m.dom,l,k,h,i=[];l=j.getParent(o||m.getStart(),j.isBlock);k=j.getParent(g||m.getEnd(),j.isBlock);if(l){i.push(l)}if(l&&k&&l!=k){h=l;var f=new c.dom.TreeWalker(l,j.getRoot());while((h=f.next())&&h!=k){if(j.isBlock(h)){i.push(h)}}}if(k&&l!=k){i.push(k)}return i},normalize:function(){var g=this,f,i;if(c.isIE){return}function h(p){var k,o,n,m=g.dom,j=m.getRoot(),l;k=f[(p?"start":"end")+"Container"];o=f[(p?"start":"end")+"Offset"];if(k.nodeType===9){k=k.body;o=0}if(k===j){if(k.hasChildNodes()){k=k.childNodes[Math.min(!p&&o>0?o-1:o,k.childNodes.length-1)];o=0;if(k.hasChildNodes()){l=k;n=new c.dom.TreeWalker(k,j);do{if(l.nodeType===3){o=p?0:l.nodeValue.length-1;k=l;break}if(l.nodeName==="BR"){o=m.nodeIndex(l);k=l.parentNode;break}}while(l=(p?n.next():n.prev()));i=true}}}if(i){f["set"+(p?"Start":"End")](k,o)}}f=g.getRng();h(true);if(f.collapsed){h()}if(i){g.setRng(f)}},destroy:function(g){var f=this;f.win=null;if(!g){c.removeUnload(f.destroy)}},_fixIESelection:function(){var g=this.dom,m=g.doc,h=m.body,j,n,f;m.documentElement.unselectable=true;function i(o,r){var p=h.createTextRange();try{p.moveToPoint(o,r)}catch(q){p=null}return p}function l(p){var o;if(p.button){o=i(p.x,p.y);if(o){if(o.compareEndPoints("StartToStart",n)>0){o.setEndPoint("StartToStart",n)}else{o.setEndPoint("EndToEnd",n)}o.select()}}else{k()}}function k(){var o=m.selection.createRange();if(n&&!o.item&&o.compareEndPoints("StartToEnd",o)===0){n.select()}g.unbind(m,"mouseup",k);g.unbind(m,"mousemove",l);n=j=0}g.bind(m,["mousedown","contextmenu"],function(o){if(o.target.nodeName==="HTML"){if(j){k()}f=m.documentElement;if(f.scrollHeight>f.clientHeight){return}j=1;n=i(o.x,o.y);if(n){g.bind(m,"mouseup",k);g.bind(m,"mousemove",l);g.win.focus();n.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}e.remove_trailing_brs=true;i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"").replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// <![CDATA[\n"+j(o)+"\n// ]]>"}}else{if(o.length>0){n.firstChild.value="<!--\n"+j(o)+"\n-->"}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select,map").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(m.getInner?o.innerHTML:a.trim(i.getOuterHTML(o),m),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF|\u200B/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","previousSibling",e))}};(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,s){var i=d.startContainer,l=d.startOffset,t=d.endContainer,m=d.endOffset,j,g,o,h,r,q,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(u){s([u])});return}function f(u){var v;v=u[0];if(v.nodeType===3&&v===i&&l>=v.nodeValue.length){u.splice(0,1)}v=u[u.length-1];if(m===0&&u.length>0&&v===t&&v.nodeType===3){u.splice(u.length-1,1)}return u}function p(x,v,u){var y=[];for(;x&&x!=u;x=x[v]){y.push(x)}return y}function n(v,u){do{if(v.parentNode==u){return v}v=v.parentNode}while(v)}function k(x,v,y){var u=y?"nextSibling":"previousSibling";for(h=x,r=h.parentNode;h&&h!=v;h=r){r=h.parentNode;q=p(h==x?h:h[u],u);if(q.length){if(!y){q.reverse()}s(f(q))}}}if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[l]}if(t.nodeType==1&&t.hasChildNodes()){t=t.childNodes[Math.min(m-1,t.childNodes.length-1)]}if(i==t){return s(f([i]))}j=c.findCommonAncestor(i,t);for(h=i;h;h=h.parentNode){if(h===t){return k(i,j,true)}if(h===j){break}}for(h=t;h;h=h.parentNode){if(h===i){return k(t,j)}if(h===j){break}}g=n(i,j)||i;o=n(t,j)||t;k(i,g,true);q=p(g==i?g:g.nextSibling,"nextSibling",o==t?o.nextSibling:o);if(q.length){s(f(q))}k(t,o)};this.split=function(e){var h=e.startContainer,d=e.startOffset,i=e.endContainer,g=e.endOffset;function f(j,k){return j.splitText(k)}if(h==i&&h.nodeType==3){if(d>0&&d<h.nodeValue.length){i=f(h,d);h=i.previousSibling;if(g>d){g=g-d;h=i=f(i,g).previousSibling;g=i.nodeValue.length;d=0}else{g=0}}}else{if(h.nodeType==3&&d>0&&d<h.nodeValue.length){h=f(h,d);d=0}if(i.nodeType==3&&g>0&&g<i.nodeValue.length){i=f(i,g).previousSibling;g=i.nodeValue.length}}return{startContainer:h,startOffset:d,endContainer:i,endOffset:g}}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(b){var a=b.dom.Event,c=b.each;b.create("tinymce.ui.KeyboardNavigation",{KeyboardNavigation:function(e,f){var p=this,m=e.root,l=e.items,n=e.enableUpDown,i=e.enableLeftRight||!e.enableUpDown,k=e.excludeFromTabOrder,j,h,o,d,g;f=f||b.DOM;j=function(q){g=q.target.id};h=function(q){f.setAttrib(q.target.id,"tabindex","-1")};d=function(q){var r=f.get(g);f.setAttrib(r,"tabindex","0");r.focus()};p.focus=function(){f.get(g).focus()};p.destroy=function(){c(l,function(q){f.unbind(f.get(q.id),"focus",j);f.unbind(f.get(q.id),"blur",h)});f.unbind(f.get(m),"focus",d);f.unbind(f.get(m),"keydown",o);l=f=m=p.focus=j=h=o=d=null;p.destroy=function(){}};p.moveFocus=function(u,r){var q=-1,t=p.controls,s;if(!g){return}c(l,function(x,v){if(x.id===g){q=v;return false}});q+=u;if(q<0){q=l.length-1}else{if(q>=l.length){q=0}}s=l[q];f.setAttrib(g,"tabindex","-1");f.setAttrib(s.id,"tabindex","0");f.get(s.id).focus();if(e.actOnFocus){e.onAction(s.id)}if(r){a.cancel(r)}};o=function(y){var u=37,t=39,x=38,z=40,q=27,s=14,r=13,v=32;switch(y.keyCode){case u:if(i){p.moveFocus(-1)}break;case t:if(i){p.moveFocus(1)}break;case x:if(n){p.moveFocus(-1)}break;case z:if(n){p.moveFocus(1)}break;case q:if(e.onCancel){e.onCancel();a.cancel(y)}break;case s:case r:case v:if(e.onAction){e.onAction(g);a.cancel(y)}break}};c(l,function(s,q){var r;if(!s.id){s.id=f.uniqueId("_mce_item_")}if(k){f.bind(s.id,"blur",h);r="-1"}else{r=(q===0?"0":"-1")}f.setAttrib(s.id,"tabindex",r);f.bind(f.get(s.id),"focus",j)});if(l[0]){g=l[0].id}f.setAttrib(m,"tabindex","-1");f.bind(f.get(m),"focus",d);f.bind(f.get(m),"keydown",o)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.select("#menu_"+g.id)[0];h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a role="button" id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" aria-labelledby="'+this.id+'_voice" title="'+a.encode(e.title)+'">';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+='<img class="mceIcon" src="'+e.image+'" alt="'+a.encode(e.title)+'" />'+c}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")}d+='<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="'+this.id+'_voice">'+e.title+"</span>";d+="</a>";return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(i,h,f){var g=this;g.parent(i,h,f);g.items=[];g.onChange=new a(g);g.onPostRender=new a(g);g.onAdd=new a(g);g.onRenderMenu=new d.util.Dispatcher(this);g.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var h=this,i,j,g;if(f!=h.selectedIndex){i=c.get(h.id+"_text");g=c.get(h.id+"_voiceDesc");j=h.items[f];if(j){h.selectedValue=j.value;h.selectedIndex=f;c.setHTML(i,c.encode(j.title));c.setHTML(g,h.settings.title+" - "+j.title);c.removeClass(i,"mceTitle");c.setAttrib(h.id,"aria-valuenow",j.title)}else{c.setHTML(i,c.encode(h.settings.title));c.setHTML(g,c.encode(h.settings.title));c.addClass(i,"mceTitle");h.selectedValue=h.selectedIndex=null;c.setAttrib(h.id,"aria-valuenow",h.settings.title)}i=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<span role="listbox" aria-haspopup="true" aria-labelledby="'+f.id+'_voiceDesc" aria-describedby="'+f.id+'_voiceDesc"><table role="presentation" tabindex="0" id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("span",{id:f.id+"_voiceDesc","class":"voiceLabel",style:"display:none;"},f.settings.title);i+=c.createHTML("a",{id:f.id+"_text",tabindex:-1,href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},'<span><span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>')+"</td>";i+="</tr></tbody></table></span>";return i},showMenu:function(){var g=this,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(j){if(j.value===g.selectedValue){f.items[j.id].setSelected(1);g.oldID=j.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){c.removeClass(f.id,f.classPrefix+"Selected");if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(function(){g.hideMenu();g.focus()});f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,role:"option","class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.role="option";h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id,"keydown",function(h){if(h.keyCode==32){f.showMenu(h);b.cancel(h)}});b.add(f.id,"focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id,"keydown",function(h){if(h.keyCode==40){f.showMenu();b.cancel(h)}});f.keyPressHandler=b.add(f.id,"keypress",function(i){var h;if(i.keyCode==13){h=f.selectedValue;f.selectedValue=null;b.cancel(i);f.settings.onselect(h)}})}f._focused=1});b.add(f.id,"blur",function(){b.remove(f.id,"keydown",f.keyDownHandler);b.remove(f.id,"keypress",f.keyPressHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f;this.setAriaProperty("disabled",f)},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox","aria-labelledby":f.id+"_aria"},g);g+=c.createHTML("span",{id:f.id+"_aria",style:"display: none"},f.settings.title);return g},postRender:function(){var g=this,h,i=true;g.rendered=true;function f(k){var j=g.items[k.target.selectedIndex-1];if(j&&(j=j.value)){g.onChange.dispatch(g,j);if(g.settings.onselect){g.settings.onselect(j)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(k){var j;b.remove(g.id,"change",h);i=false;j=b.add(g.id,"blur",function(){if(i){return}i=true;b.add(g.id,"change",f);b.remove(g.id,"blur",j)});if(d.isWebKit&&(k.keyCode==37||k.keyCode==39)){return b.prevent(k)}if(k.keyCode==13||k.keyCode==32){f(k);return b.cancel(k)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>');i+="<td >"+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";i=b.createHTML("table",{role:"presentation","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("div",{id:f.id,role:"button",tabindex:"0","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.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"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0;f.onHideMenu.dispatch()}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(i){i=i.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");g=c.add(g,"a",{role:"option",href:"javascript:;",style:{backgroundColor:"#"+i},title:p.editor.getLang("colors."+i,i),"data-mce-color":"#"+i});if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+i;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return a.cancel(i)});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('<div id="'+f.id+'" role="group" aria-labelledby="'+f.id+'_voice">');i.push("<span role='application'>");i.push('<span id="'+f.id+'_voice" class="mceVoiceLabel" style="display:none;">'+d.encode(g.name)+"</span>");j(e,function(h){i.push(h.renderHTML())});i.push("</span>");i.push("</div>");return i.join("")},focus:function(){var e=this;d.get(e.id).focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){if(b.isWebKit){d.get(f.editor.id+"_ifr").focus()}f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e<l.length;e++){k=l[e];d=l[e-1];g=l[e+1];if(e===0){j="mceToolbarStart";if(k.Button){j+=" mceToolbarStartButton"}else{if(k.SplitButton){j+=" mceToolbarStartSplitButton"}else{if(k.ListBox){j+=" mceToolbarStartListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,"<!-- IE -->"))}}if(c.stdMode){f+='<td style="position: relative">'+k.renderHTML()+"</td>"}else{f+="<td>"+k.renderHTML()+"</td>"}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,"<!-- IE -->"))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,"<!-- IE -->"));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},"<tbody><tr>"+f+"</tr></tbody>")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l<o.length;l++){if(o[l]==n){o.splice(l,1);break}}if(m.activeEditor==n){m._setActive(o[0])}n.destroy();m.onRemoveEditor.dispatch(m,n);return n},execCommand:function(r,p,o){var q=this,n=q.get(o),l;switch(r){case"mceFocus":n.focus();return true;case"mceAddEditor":case"mceAddControl":if(!q.get(o)){new j.Editor(o,q.settings).render()}return true;case"mceAddFrameControl":l=o.window;l.tinyMCE=tinyMCE;l.tinymce=j;j.DOM.doc=l.document;j.DOM.win=l;n=new j.Editor(o.element_id,o);n.render();if(j.isIE){function m(){n.destroy();l.detachEvent("onunload",m);l=l.tinyMCE=l.tinymce=null}l.attachEvent("onunload",m)}o.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(n){n.remove()}return true;case"mceToggleEditor":if(!n){q.execCommand("mceAddControl",0,o);return true}if(n.isHidden()){n.show()}else{n.hide()}return true}if(q.activeEditor){return q.activeEditor.execCommand(r,p,o)}return false},execInstanceCommand:function(p,o,n,m){var l=this.get(p);if(l){return l.execCommand(o,n,m)}return false},triggerSave:function(){g(this.editors,function(l){l.save()})},addI18n:function(n,q){var l,m=this.i18n;if(!j.is(n,"string")){g(n,function(r,p){g(r,function(t,s){g(t,function(v,u){if(s==="common"){m[p+"."+u]=v}else{m[p+"."+s+"."+u]=v}})})})}else{g(q,function(r,p){m[n+"."+p]=r})}},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);(function(m){var n=m.DOM,j=m.dom.Event,f=m.extend,k=m.util.Dispatcher,i=m.each,a=m.isGecko,b=m.isIE,e=m.isWebKit,d=m.is,h=m.ThemeManager,c=m.PluginManager,o=m.inArray,l=m.grep,g=m.explode;m.create("tinymce.Editor",{Editor:function(r,q){var p=this;p.id=p.editorId=r;p.execCommands={};p.queryStateCommands={};p.queryValueCommands={};p.isNotDirty=false;p.plugins={};i(["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(s){p[s]=new k(p)});p.settings=q=f({id:r,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.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:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",validate:true,entity_encoding:"named",url_converter:p.convertURL,url_converter_scope:p,ie7_compat:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.contentCSS=[];p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice&&!m.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language&&v.language_load!==false){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(z){var y={prefix:"plugins/",resource:z,suffix:"/editor_plugin"+m.suffix+".js"};var z=c.createUrl(y,z);c.load(z.resource,z)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+m.suffix+".js"})}}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,H=this,I=H.settings,E,A,D=H.getElement(),q,p,F,y,C,G,z,v=[];m.add(H);I.aria_label=I.aria_label||n.getAttrib(D,"aria-label",H.getLang("aria.rich_text_area"));if(I.theme){I.theme=I.theme.replace(/-/,"");q=h.get(I.theme);H.theme=new q();if(H.theme.init&&I.init_theme){H.theme.init(H,h.urls[I.theme]||m.documentBaseURL.replace(/\/$/,""))}}function B(J){var K=c.get(J),t=c.urls[J]||m.documentBaseURL.replace(/\/$/,""),s;if(K&&m.inArray(v,J)===-1){i(c.dependencies(J),function(u){B(u)});s=new K(H,t);H.plugins[J]=s;if(s.init){s.init(H,t);v.push(J)}}}i(g(I.plugins.replace(/\-/g,"")),B);if(I.popup_css!==false){if(I.popup_css){I.popup_css=H.documentBaseURI.toAbsolute(I.popup_css)}else{I.popup_css=H.baseURI.toAbsolute("themes/"+I.theme+"/skins/"+I.skin+"/dialog.css")}}if(I.popup_css_add){I.popup_css+=","+H.documentBaseURI.toAbsolute(I.popup_css_add)}H.controlManager=new m.ControlManager(H);if(I.custom_undo_redo){H.onBeforeExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.beforeChange()}});H.onExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.add()}})}H.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){H.nodeChanged()}});if(a){function x(s,t){if(!t||!t.initial){H.execCommand("mceRepaint")}}H.onUndo.add(x);H.onRedo.add(x);H.onSetContent.add(x)}H.onBeforeRenderUI.dispatch(H,H.controlManager);if(I.render_ui){E=I.width||D.style.width||D.offsetWidth;A=I.height||D.style.height||D.offsetHeight;H.orgDisplay=D.style.display;G=/^[0-9\.]+(|px)$/i;if(G.test(""+E)){E=Math.max(parseInt(E)+(q.deltaWidth||0),100)}if(G.test(""+A)){A=Math.max(parseInt(A)+(q.deltaHeight||0),100)}q=H.theme.renderUI({targetNode:D,width:E,height:A,deltaWidth:I.delta_width,deltaHeight:I.delta_height});H.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:E,height:A});if(I.content_css){m.each(g(I.content_css),function(s){H.contentCSS.push(H.documentBaseURI.toAbsolute(s))})}A=(q.iframeHeight||A)+(typeof(A)=="number"?(q.deltaHeight||0):"");if(A<100){A=100}H.iframeHTML=I.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(I.document_base_url!=m.documentBaseURL){H.iframeHTML+='<base href="'+H.documentBaseURI.getURI()+'" />'}if(I.ie7_compat){H.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" />'}else{H.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=edge" />'}H.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';for(z=0;z<H.contentCSS.length;z++){H.iframeHTML+='<link type="text/css" rel="stylesheet" href="'+H.contentCSS[z]+'" />'}y=I.body_id||"tinymce";if(y.indexOf("=")!=-1){y=H.getParam("body_id","","hash");y=y[H.id]||y}C=I.body_class||"";if(C.indexOf("=")!=-1){C=H.getParam("body_class","","hash");C=C[H.id]||""}H.iframeHTML+='</head><body id="'+y+'" class="mceContentBody '+C+'"><br></body></html>';if(m.relaxedDomain&&(b||(m.isOpera&&parseFloat(opera.version())<11))){F='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+H.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}r=n.add(q.iframeContainer,"iframe",{id:H.id+"_ifr",src:F||'javascript:""',frameBorder:"0",allowTransparency:"true",title:I.aria_label,style:{width:"100%",height:A,display:"block"}});H.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=H.orgDisplay;n.get(H.id).style.display="none";n.setAttrib(H.id,"aria-hidden",true);if(!m.relaxedDomain||!F){H.setupIframe()}D=r=q=null},setupIframe:function(){var q=this,v=q.settings,x=n.get(q.id),y=q.getDoc(),u,p;if(!b||!m.relaxedDomain){y.open();y.write(q.iframeHTML);y.close();if(m.relaxedDomain){y.domain=m.relaxedDomain}}p=q.getBody();p.disabled=true;if(!v.readonly){p.contentEditable=true}p.disabled=false;q.schema=new m.html.Schema(v);q.dom=new m.dom.DOMUtils(q.getDoc(),{keep_values:true,url_converter:q.convertURL,url_converter_scope:q,hex_colors:v.force_hex_style_colors,class_filter:v.class_filter,update_styles:1,fix_ie_paragraphs:1,schema:q.schema});q.parser=new m.html.DomParser(v,q.schema);if(!q.settings.allow_html_in_named_anchor){q.parser.addAttributeFilter("name",function(s,t){var A=s.length,C,z,B,D;while(A--){D=s[A];if(D.name==="a"&&D.firstChild){B=D.parent;C=D.lastChild;do{z=C.prev;B.insert(C,D);C=z}while(C)}}})}q.parser.addAttributeFilter("src,href,style",function(s,t){var z=s.length,B,D=q.dom,C,A;while(z--){B=s[z];C=B.attr(t);A="data-mce-"+t;if(!B.attributes.map[A]){if(t==="style"){B.attr(A,D.serializeStyle(D.parseStyle(C),B.name))}else{B.attr(A,q.convertURL(C,t,B.name))}}}});q.parser.addNodeFilter("script",function(s,t){var z=s.length,A;while(z--){A=s[z];A.attr("type","mce-"+(A.attr("type")||"text/javascript"))}});q.parser.addNodeFilter("#cdata",function(s,t){var z=s.length,A;while(z--){A=s[z];A.type=8;A.name="#comment";A.value="[CDATA["+A.value+"]]"}});q.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,z){var A=t.length,B,s=q.schema.getNonEmptyElements();while(A--){B=t[A];if(B.isEmpty(s)){B.empty().append(new m.html.Node("br",1)).shortEnded=true}}});q.serializer=new m.dom.Serializer(v,q.dom,q.schema);q.selection=new m.dom.Selection(q.dom,q.getWin(),q.serializer);q.formatter=new m.Formatter(this);q.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",collapsed:false,styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",collapsed:false,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:false,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",collapsed:false,styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},wrap_links:false},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},wrap_links:false},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},link:{inline:"a",selector:"a",remove:"all",split:true,deep:true,onmatch:function(s){return true},onformat:function(z,s,t){i(t,function(B,A){q.dom.setAttrib(z,A,B)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){q.formatter.register(s,{block:s,remove:"all"})});q.formatter.register(q.settings.formats);q.undoManager=new m.UndoManager(q);q.undoManager.onAdd.add(function(t,s){if(t.hasUndo()){return q.onChange.dispatch(q,s,t)}});q.undoManager.onUndo.add(function(t,s){return q.onUndo.dispatch(q,s,t)});q.undoManager.onRedo.add(function(t,s){return q.onRedo.dispatch(q,s,t)});q.forceBlocks=new m.ForceBlocks(q,{forced_root_block:v.forced_root_block});q.editorCommands=new m.EditorCommands(q);q.serializer.onPreProcess.add(function(s,t){return q.onPreProcess.dispatch(q,t,s)});q.serializer.onPostProcess.add(function(s,t){return q.onPostProcess.dispatch(q,t,s)});q.onPreInit.dispatch(q);if(!v.gecko_spellcheck){q.getBody().spellcheck=0}if(!v.readonly){q._addEvents()}q.controlManager.onPostRender.dispatch(q,q.controlManager);q.onPostRender.dispatch(q);q.quirks=new m.util.Quirks(this);if(v.directionality){q.getBody().dir=v.directionality}if(v.nowrap){q.getBody().style.whiteSpace="nowrap"}if(v.handle_node_change_callback){q.onNodeChange.add(function(t,s,z){q.execCallback("handle_node_change_callback",q.id,z,-1,-1,true,q.selection.isCollapsed())})}if(v.save_callback){q.onSaveContent.add(function(s,z){var t=q.execCallback("save_callback",q.id,z.content,q.getBody());if(t){z.content=t}})}if(v.onchange_callback){q.onChange.add(function(t,s){q.execCallback("onchange_callback",q,s)})}if(v.protect){q.onBeforeSetContent.add(function(s,t){if(v.protect){i(v.protect,function(z){t.content=t.content.replace(z,function(A){return"<!--mce:protected "+escape(A)+"-->"})})}})}if(v.convert_newlines_to_brs){q.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(v.preformatted){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(v.verify_css_classes){q.serializer.attribValueFilter=function(B,z){var A,t;if(B=="class"){if(!q.classesRE){t=q.dom.getClasses();if(t.length>0){A="";i(t,function(s){A+=(A?"|":"")+s["class"]});q.classesRE=new RegExp("("+A+")","gi")}}return !q.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(z)||q.classesRE.test(z)?z:""}return z}}if(v.cleanup_callback){q.onBeforeSetContent.add(function(s,t){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)});q.onPreProcess.add(function(s,t){if(t.set){q.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){q.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});q.onPostProcess.add(function(s,t){if(t.set){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=q.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(v.save_callback){q.onGetContent.add(function(s,t){if(t.save){t.content=q.execCallback("save_callback",q.id,t.content,q.getBody())}})}if(v.handle_event_callback){q.onEvent.add(function(s,t,z){if(q.execCallback("handle_event_callback",t,s,z)===false){j.cancel(t)}})}q.onSetContent.add(function(){q.addVisual(q.getBody())});if(v.padd_empty_editor){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function r(s,t){i(s.dom.select("a"),function(A){var z=A.parentNode;if(s.dom.isBlock(z)&&z.lastChild===A){s.dom.add(z,"br",{"data-mce-bogus":1})}})}q.onExecCommand.add(function(s,t){if(t==="CreateLink"){r(s)}});q.onSetContent.add(q.selection.onSetContent.add(r))}q.load({initial:true,format:"html"});q.startContent=q.getContent({format:"raw"});q.undoManager.add();q.initialized=true;q.onInit.dispatch(q);q.execCallback("setupcontent_callback",q.id,q.getBody(),q.getDoc());q.execCallback("init_instance_callback",q);q.focus(true);q.nodeChanged({initial:1});i(q.contentCSS,function(s){q.dom.loadCSS(s)});if(v.auto_focus){setTimeout(function(){var s=m.get(v.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getBody().focus();s.getWin().focus()},100)}x=null},focus:function(u){var y,q=this,s=q.selection,x=q.settings.content_editable,r,p,v=q.getDoc();if(!u){r=s.getRng();if(r.item){p=r.item(0)}q._refreshContentEditable();s.normalize();if(!x){q.getWin().focus()}if(m.isGecko){q.getBody().focus()}if(p&&p.ownerDocument==v){r=v.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((y=m.activeEditor)!=null){y.onDeactivate.dispatch(y,q)}q.onActivate.dispatch(q,y)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=q.getStart()||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(p,r,q){this.execCommands[p]={func:r,scope:q||this}},addQueryStateHandler:function(p,r,q){this.queryStateCommands[p]={func:r,scope:q||this}},addQueryValueHandler:function(p,r,q){this.queryValueCommands[p]={func:r,scope:q||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=false;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(u,s){var r=this,q,p=r.getBody(),t;s=s||{};s.format=s.format||"html";s.set=true;s.content=u;if(!s.no_events){r.onBeforeSetContent.dispatch(r,s)}u=s.content;if(!m.isIE&&(u.length===0||/^\s+$/.test(u))){t=r.settings.forced_root_block;if(t){u="<"+t+'><br data-mce-bogus="1"></'+t+">"}else{u='<br data-mce-bogus="1">'}p.innerHTML=u;r.selection.select(p,true);r.selection.collapse(true);return}if(s.format!=="raw"){u=new m.html.Serializer({},r.schema).serialize(r.parser.parse(u))}s.content=m.trim(u);r.dom.setHTML(p,s.content);if(!s.no_events){r.onSetContent.dispatch(r,s)}r.selection.normalize();return s.content},getContent:function(q){var p=this,r;q=q||{};q.format=q.format||"html";q.get=true;if(!q.no_events){p.onBeforeGetContent.dispatch(p,q)}if(q.format=="raw"){r=p.getBody().innerHTML}else{r=p.serializer.serialize(p.getBody(),q)}q.content=m.trim(r);if(!q.no_events){p.onGetContent.dispatch(p,q)}return q.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var B=this,r,C=B.settings,q=B.dom,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function p(t,D){var s=t.type;if(B.removed){return}if(B.onEvent.dispatch(B,t,D)!==false){B[x[t.fakeType||t.type]].dispatch(B,t,D)}}i(x,function(t,s){switch(s){case"contextmenu":q.bind(B.getDoc(),s,p);break;case"paste":q.bind(B.getBody(),s,function(D){p(D)});break;case"submit":case"reset":q.bind(B.getElement().form||n.getParent(B.id,"form"),s,p);break;default:q.bind(C.content_editable?B.getBody():B.getDoc(),s,p)}});q.bind(C.content_editable?B.getBody():(a?B.getDoc():B.getWin()),"focus",function(s){B.focus(true)});if(m.isGecko){q.bind(B.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("data-mce-src"))){t.src=B.documentBaseURI.toAbsolute(s)}})}if(a){function u(){var E=this,G=E.getDoc(),F=E.settings;if(a&&!F.readonly){E._refreshContentEditable();try{G.execCommand("styleWithCSS",0,false)}catch(D){if(!E._isHidden()){try{G.execCommand("useCSS",0,true)}catch(D){}}}if(!F.table_inline_editing){try{G.execCommand("enableInlineTableEditing",false,false)}catch(D){}}if(!F.object_resizing){try{G.execCommand("enableObjectResizing",false,false)}catch(D){}}}}B.onBeforeExecCommand.add(u);B.onMouseDown.add(u)}B.onMouseUp.add(B.nodeChanged);B.onKeyUp.add(function(s,t){var D=t.keyCode;if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45||D==46||D==8||(m.isMac&&(D==91||D==93))||t.ctrlKey){B.nodeChanged()}});B.onKeyDown.add(function(t,D){if(D.keyCode!=8){return}var F=t.selection.getRng().startContainer;var E=t.selection.getRng().startOffset;while(F&&F.nodeType&&F.nodeType!=1&&F.parentNode){F=F.parentNode}if(F&&F.parentNode&&F.parentNode.tagName==="BLOCKQUOTE"&&F.parentNode.firstChild==F&&E==0){t.formatter.toggle("blockquote",null,F.parentNode);var s=t.selection.getRng();s.setStart(F,0);s.setEnd(F,0);t.selection.setRng(s);t.selection.collapse(false)}});B.onReset.add(function(){B.setContent(B.startContent,{format:"raw"})});if(C.custom_shortcuts){if(C.custom_undo_redo_keyboard_shortcuts){B.addShortcut("ctrl+z",B.getLang("undo_desc"),"Undo");B.addShortcut("ctrl+y",B.getLang("redo_desc"),"Redo")}B.addShortcut("ctrl+b",B.getLang("bold_desc"),"Bold");B.addShortcut("ctrl+i",B.getLang("italic_desc"),"Italic");B.addShortcut("ctrl+u",B.getLang("underline_desc"),"Underline");for(r=1;r<=6;r++){B.addShortcut("ctrl+"+r,"",["FormatBlock",false,"h"+r])}B.addShortcut("ctrl+7","",["FormatBlock",false,"p"]);B.addShortcut("ctrl+8","",["FormatBlock",false,"div"]);B.addShortcut("ctrl+9","",["FormatBlock",false,"address"]);function v(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(B.shortcuts,function(D){if(m.isMac&&D.ctrl!=t.metaKey){return}else{if(!m.isMac&&D.ctrl!=t.ctrlKey){return}}if(D.alt!=t.altKey){return}if(D.shift!=t.shiftKey){return}if(t.keyCode==D.keyCode||(t.charCode&&t.charCode==D.charCode)){s=D;return false}});return s}B.onKeyUp.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyPress.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyDown.add(function(s,t){var D=v(t);if(D){D.func.call(D.scope);return j.cancel(t)}})}if(m.isIE){q.bind(B.getDoc(),"controlselect",function(D){var t=B.resizeInfo,s;D=D.target;if(D.nodeName!=="IMG"){return}if(t){q.unbind(t.node,t.ev,t.cb)}if(!q.hasClass(D,"mceItemNoResize")){ev="resizeend";s=q.bind(D,ev,function(F){var E;F=F.target;if(E=q.getStyle(F,"width")){q.setAttrib(F,"width",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"width","")}if(E=q.getStyle(F,"height")){q.setAttrib(F,"height",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"height","")}})}else{ev="resizestart";s=q.bind(D,"resizestart",j.cancel,j)}t=B.resizeInfo={node:D,ev:ev,cb:s}})}if(m.isOpera){B.onClick.add(function(s,t){j.prevent(t)})}if(C.custom_undo_redo){function y(){B.undoManager.typing=false;B.undoManager.add()}q.bind(B.getDoc(),"focusout",function(s){if(!B.removed&&B.undoManager.typing){y()}});B.dom.bind(B.dom.getRoot(),"dragend",function(s){y()});B.onKeyUp.add(function(s,D){var t=D.keyCode;if((t>=33&&t<=36)||(t>=37&&t<=40)||t==13||t==45||D.ctrlKey){y()}});B.onKeyDown.add(function(s,E){var D=E.keyCode,t;if(D==8){t=B.getDoc().selection;if(t&&t.createRange&&t.createRange().item){B.undoManager.beforeChange();s.dom.remove(t.createRange().item(0));y();return j.cancel(E)}}if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45){if(m.isIE&&D==13){B.undoManager.beforeChange()}if(B.undoManager.typing){y()}return}if((D<16||D>20)&&D!=224&&D!=91&&!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.typing=true;B.undoManager.add()}});B.onMouseDown.add(function(){if(B.undoManager.typing){y()}})}if(m.isGecko){function A(){var s=B.dom.getAttribs(B.selection.getStart().cloneNode(false));return function(){var t=B.selection.getStart();if(t!==B.getBody()){B.dom.setAttrib(t,"style",null);i(s,function(D){t.setAttributeNode(D.cloneNode(true))})}}}function z(){var t=B.selection;return !t.isCollapsed()&&t.getStart()!=t.getEnd()}B.onKeyPress.add(function(s,D){var t;if((D.keyCode==8||D.keyCode==46)&&z()){t=A();B.getDoc().execCommand("delete",false,null);t();return j.cancel(D)}});B.dom.bind(B.getDoc(),"cut",function(t){var s;if(z()){s=A();B.onKeyUp.addToTop(j.cancel,j);setTimeout(function(){s();B.onKeyUp.remove(j.cancel,j)},0)}})}},_refreshContentEditable:function(){var q=this,p,r;if(q._isHidden()){p=q.getBody();r=p.parentNode;r.removeChild(p);r.appendChild(p);p.focus()}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var m=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,q=n.formatter,o;function r(z,y,x){var v;z=z.toLowerCase();if(v=j.exec[z]){v(z,y,x);return a}return b}function l(x){var v;x=x.toLowerCase();if(v=j.state[x]){return v(x)}return -1}function h(x){var v;x=x.toLowerCase();if(v=j.value[x]){return v(x)}return b}function u(v,x){x=x||"exec";d(v,function(z,y){d(y.toLowerCase().split(","),function(A){j[x][A]=z})})}c.extend(this,{execCommand:r,queryCommandState:l,queryCommandValue:h,addCommands:u});function f(y,x,v){if(x===e){x=b}if(v===e){v=null}return n.getDoc().execCommand(y,x,v)}function t(v){return q.match(v)}function s(v,x){q.toggle(v,x?{value:x}:e)}function i(v){o=p.getBookmark(v)}function g(){p.moveToBookmark(o)}u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(z){var y=n.getDoc(),v;try{f(z)}catch(x){v=a}if(v||!y.queryCommandSupported(z)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(A){if(A){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(v){if(p.isCollapsed()){p.select(p.getNode())}f(v);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){var x=v.substring(7);d("left,center,right,full".split(","),function(y){if(x!=y){q.remove("align"+y)}});s("align"+x);r("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(y){var v,x;f(y);v=m.getParent(p.getNode(),"ol,ul");if(v){x=v.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(x.nodeName)){i();m.split(x,v);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){s(v)},"ForeColor,HiliteColor,FontName":function(y,x,v){s(y,v)},FontSize:function(z,y,x){var v,A;if(x>=1&&x<=7){A=c.explode(k.font_size_style_values);v=c.explode(k.font_size_classes);if(v){x=v[x-1]||x}else{x=A[x-1]||x}}s(z,x)},RemoveFormat:function(v){q.remove(v)},mceBlockQuote:function(v){s("blockquote")},FormatBlock:function(y,x,v){return s(v||"p")},mceCleanup:function(){var v=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(v)},mceRemoveNode:function(z,y,x){var v=x||p.getNode();if(v!=n.getBody()){i();n.dom.remove(v,a);g()}},mceSelectNodeDepth:function(z,y,x){var v=0;m.getParent(p.getNode(),function(A){if(A.nodeType==1&&v++==x){p.select(A);return b}},n.getBody())},mceSelectNode:function(y,x,v){p.select(v)},mceInsertContent:function(B,I,K){var y,J,E,z,F,G,D,C,L,x,A,M,v,H;y=n.parser;J=new c.html.Serializer({},n.schema);v='<span id="mce_marker" data-mce-type="bookmark">\uFEFF</span>';G={content:K,format:"html"};p.onBeforeSetContent.dispatch(p,G);K=G.content;if(K.indexOf("{$caret}")==-1){K+="{$caret}"}K=K.replace(/\{\$caret\}/,v);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}E=p.getNode();G={context:E.nodeName.toLowerCase()};F=y.parse(K,G);A=F.lastChild;if(A.attr("id")=="mce_marker"){D=A;for(A=A.prev;A;A=A.walk(true)){if(A.type==3||!m.isBlock(A.name)){A.parent.insert(D,A,A.name==="br");break}}}if(!G.invalid){K=J.serialize(F);A=E.firstChild;M=E.lastChild;if(!A||(A===M&&A.nodeName==="BR")){m.setHTML(E,K)}else{p.setContent(K)}}else{p.setContent(v);E=n.selection.getNode();z=n.getBody();if(E.nodeType==9){E=A=z}else{A=E}while(A!==z){E=A;A=A.parentNode}K=E==z?z.innerHTML:m.getOuterHTML(E);K=J.serialize(y.parse(K.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return J.serialize(F)})));if(E==z){m.setHTML(z,K)}else{m.setOuterHTML(E,K)}}D=m.get("mce_marker");C=m.getRect(D);L=m.getViewPort(n.getWin());if((C.y+C.h>L.y+L.h||C.y<L.y)||(C.x>L.x+L.w||C.x<L.x)){H=c.isIE?n.getDoc().documentElement:n.getBody();H.scrollLeft=C.x;H.scrollTop=C.y-L.h+25}x=m.createRng();A=D.previousSibling;if(A&&A.nodeType==3){x.setStart(A,A.nodeValue.length)}else{x.setStartBefore(D);x.setEndBefore(D)}m.remove(D);p.setRng(x);p.onSetContent.dispatch(p,G);n.addVisual()},mceInsertRawHTML:function(y,x,v){p.setContent("tiny_mce_marker");n.setContent(n.getContent().replace(/tiny_mce_marker/g,function(){return v}))},mceSetContent:function(y,x,v){n.setContent(v)},"Indent,Outdent":function(z){var x,v,y;x=k.indentation;v=/[a-z%]+$/i.exec(x);x=parseInt(x);if(!l("InsertUnorderedList")&&!l("InsertOrderedList")){d(p.getSelectedBlocks(),function(A){if(z=="outdent"){y=Math.max(0,parseInt(A.style.paddingLeft||0)-x);m.setStyle(A,"paddingLeft",y?y+v:"")}else{m.setStyle(A,"paddingLeft",(parseInt(A.style.paddingLeft||0)+x)+v)}})}else{f(z)}},mceRepaint:function(){var x;if(c.isGecko){try{i(a);if(p.getSel()){p.getSel().selectAllChildren(n.getBody())}p.collapse(a);g()}catch(v){}}},mceToggleFormat:function(y,x,v){q.toggle(v)},InsertHorizontalRule:function(){n.execCommand("mceInsertContent",false,"<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(y,x,v){n.execCommand("mceInsertContent",false,v.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(z,y,x){var v;if(typeof(x)=="string"){x={href:x}}v=m.getParent(p.getNode(),"a");x.href=x.href.replace(" ","%20");if(!v||!x.href){q.remove("link")}if(x.href){q.apply("link",x,v)}},selectAll:function(){var x=m.getRoot(),v=m.createRng();v.setStart(x,0);v.setEnd(x,x.childNodes.length);n.selection.setRng(v)}});u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){return t("align"+v.substring(7))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){return t(v)},mceBlockQuote:function(){return t("blockquote")},Outdent:function(){var v;if(k.inline_styles){if((v=m.getParent(p.getStart(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}if((v=m.getParent(p.getEnd(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}}return l("InsertUnorderedList")||l("InsertOrderedList")||(!k.inline_styles&&!!m.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(v){return m.getParent(p.getNode(),v=="insertunorderedlist"?"UL":"OL")}},"state");u({"FontSize,FontName":function(y){var x=0,v;if(v=m.getParent(p.getNode(),"span")){if(y=="fontsize"){x=v.style.fontSize}else{x=v.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return x}},"value");if(k.custom_undo_redo){u({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(f){var d,e=0,h=[],c;function g(){return b.trim(f.getContent({format:"raw",no_events:1}))}return d={typing:false,onAdd:new a(d),onUndo:new a(d),onRedo:new a(d),beforeChange:function(){c=f.selection.getBookmark(2,true)},add:function(m){var j,k=f.settings,l;m=m||{};m.content=g();l=h[e];if(l&&l.content==m.content){return null}if(h[e]){h[e].beforeBookmark=c}if(k.custom_undo_redo_levels){if(h.length>k.custom_undo_redo_levels){for(j=0;j<h.length-1;j++){h[j]=h[j+1]}h.length--;e=h.length}}m.bookmark=f.selection.getBookmark(2,true);if(e<h.length-1){h.length=e+1}h.push(m);e=h.length-1;d.onAdd.dispatch(d,m);f.isNotDirty=0;return m},undo:function(){var k,j;if(d.typing){d.add();d.typing=false}if(e>0){k=h[--e];f.setContent(k.content,{format:"raw"});f.selection.moveToBookmark(k.beforeBookmark);d.onUndo.dispatch(d,k)}return k},redo:function(){var i;if(e<h.length-1){i=h[++e];f.setContent(i.content,{format:"raw"});f.selection.moveToBookmark(i.bookmark);d.onRedo.dispatch(d,i)}return i},clear:function(){h=[];e=0;d.typing=false},hasUndo:function(){return e>0||this.typing},hasRedo:function(){return e<h.length-1&&!this.typing}}}})(tinymce);(function(l){var j=l.dom.Event,c=l.isIE,a=l.isGecko,b=l.isOpera,i=l.each,h=l.extend,d=true,g=false;function k(o){var p,n,m;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(o.nodeName)){if(p){n=o.cloneNode(false);n.appendChild(p);p=n}else{p=m=o.cloneNode(false)}p.removeAttribute("id")}}while(o=o.parentNode);if(p){return{wrapper:p,inner:m}}}function f(n,o){var m=o.ownerDocument.createRange();m.setStart(n.endContainer,n.endOffset);m.setEndAfter(o);return m.cloneContents().textContent.length==0}function e(o,q,m){var n,p;if(q.isEmpty(m)){n=q.getParent(m,"ul,ol");if(!q.getParent(n.parentNode,"ul,ol")){q.split(n,m);p=q.create("p",0,'<br data-mce-bogus="1" />');q.replace(p,m);o.select(p,1)}return g}return d}l.create("tinymce.ForceBlocks",{ForceBlocks:function(m){var n=this,o=m.settings,p;n.editor=m;n.dom=m.dom;p=(o.forced_root_block||"p").toLowerCase();o.element=p.toUpperCase();m.onPreInit.add(n.setup,n)},setup:function(){var n=this,m=n.editor,p=m.settings,u=m.dom,o=m.selection,q=m.schema.getBlockElements();if(p.forced_root_block){function v(){var y=o.getStart(),t=m.getBody(),s,z,D,F,E,x,A,B=-16777215;if(!y||y.nodeType!==1){return}while(y!=t){if(q[y.nodeName]){return}y=y.parentNode}s=o.getRng();if(s.setStart){z=s.startContainer;D=s.startOffset;F=s.endContainer;E=s.endOffset}else{if(s.item){s=m.getDoc().body.createTextRange();s.moveToElementText(s.item(0))}tmpRng=s.duplicate();tmpRng.collapse(true);D=tmpRng.move("character",B)*-1;if(!tmpRng.collapsed){tmpRng=s.duplicate();tmpRng.collapse(false);E=(tmpRng.move("character",B)*-1)-D}}for(y=t.firstChild;y;y){if(y.nodeType===3||(y.nodeType==1&&!q[y.nodeName])){if(!x){x=u.create(p.forced_root_block);y.parentNode.insertBefore(x,y)}A=y;y=y.nextSibling;x.appendChild(A)}else{x=null;y=y.nextSibling}}if(s.setStart){s.setStart(z,D);s.setEnd(F,E);o.setRng(s)}else{try{s=m.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(true);s.moveStart("character",D);if(E>0){s.moveEnd("character",E)}s.select()}catch(C){}}m.nodeChanged()}m.onKeyUp.add(v);m.onClick.add(v)}if(p.force_br_newlines){if(c){m.onKeyPress.add(function(s,t){var x;if(t.keyCode==13&&o.getNode().nodeName!="LI"){o.setContent('<br id="__" /> ',{format:"raw"});x=u.get("__");x.removeAttribute("id");o.select(x);o.collapse();return j.cancel(t)}})}}if(p.force_p_newlines){if(!c){m.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!n.insertPara(t)){j.cancel(t)}})}else{l.addUnload(function(){n._previousFormats=0});m.onKeyPress.add(function(s,t){n._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&p.keep_styles){n._previousFormats=k(s.selection.getStart())}});m.onKeyUp.add(function(t,y){if(y.keyCode==13&&!y.shiftKey){var x=t.selection.getStart(),s=n._previousFormats;if(!x.hasChildNodes()&&s){x=u.getParent(x,u.isBlock);if(x&&x.nodeName!="LI"){x.innerHTML="";if(n._previousFormats){x.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{x.innerHTML="\uFEFF"}o.select(x,1);o.collapse(true);t.getDoc().execCommand("Delete",false,null);n._previousFormats=0}}}})}if(a){m.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){n.backspaceDelete(t,t.keyCode==8)}})}}if(l.isWebKit){function r(t){var s=o.getRng(),x,A=u.create("div",null," "),z,y=u.getViewPort(t.getWin()).h;s.insertNode(x=u.create("br"));s.setStartAfter(x);s.setEndAfter(x);o.setRng(s);if(o.getSel().focusNode==x.previousSibling){o.select(u.insertAfter(u.doc.createTextNode("\u00a0"),x));o.collapse(d)}u.insertAfter(A,x);z=u.getPos(A).y;u.remove(A);if(z>y){t.getWin().scrollTo(0,z)}}m.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(p.force_br_newlines&&!u.getParent(o.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);j.cancel(t)}})}if(c){if(p.element!="P"){m.onKeyPress.add(function(s,t){n.lastElm=o.getNode().nodeName});m.onKeyUp.add(function(t,x){var z,y=o.getNode(),s=t.getBody();if(s.childNodes.length===1&&y.nodeName=="P"){y=u.rename(y,p.element);o.select(y);o.collapse();t.nodeChanged()}else{if(x.keyCode==13&&!x.shiftKey&&n.lastElm!="P"){z=u.getParent(y,"p");if(z){u.rename(z,p.element);t.nodeChanged()}}}})}}},getParentBlock:function(o){var m=this.dom;return m.getParent(o,m.isBlock)},insertPara:function(Q){var E=this,v=E.editor,M=v.dom,R=v.getDoc(),V=v.settings,F=v.selection.getSel(),G=F.getRangeAt(0),U=R.body;var J,K,H,O,N,q,o,u,z,m,C,T,p,x,I,L=M.getViewPort(v.getWin()),B,D,A;v.undoManager.beforeChange();J=R.createRange();J.setStart(F.anchorNode,F.anchorOffset);J.collapse(d);K=R.createRange();K.setStart(F.focusNode,F.focusOffset);K.collapse(d);H=J.compareBoundaryPoints(J.START_TO_END,K)<0;O=H?F.anchorNode:F.focusNode;N=H?F.anchorOffset:F.focusOffset;q=H?F.focusNode:F.anchorNode;o=H?F.focusOffset:F.anchorOffset;if(O===q&&/^(TD|TH)$/.test(O.nodeName)){if(O.firstChild.nodeName=="BR"){M.remove(O.firstChild)}if(O.childNodes.length==0){v.dom.add(O,V.element,null,"<br />");T=v.dom.add(O,V.element,null,"<br />")}else{I=O.innerHTML;O.innerHTML="";v.dom.add(O,V.element,null,I);T=v.dom.add(O,V.element,null,"<br />")}G=R.createRange();G.selectNodeContents(T);G.collapse(1);v.selection.setRng(G);return g}if(O==U&&q==U&&U.firstChild&&v.dom.isBlock(U.firstChild)){O=q=O.firstChild;N=o=0;J=R.createRange();J.setStart(O,0);K=R.createRange();K.setStart(q,0)}if(!R.body.hasChildNodes()){R.body.appendChild(M.create("br"))}O=O.nodeName=="HTML"?R.body:O;O=O.nodeName=="BODY"?O.firstChild:O;q=q.nodeName=="HTML"?R.body:q;q=q.nodeName=="BODY"?q.firstChild:q;u=E.getParentBlock(O);z=E.getParentBlock(q);m=u?u.nodeName:V.element;if(I=E.dom.getParent(u,"li,pre")){if(I.nodeName=="LI"){return e(v.selection,E.dom,I)}return d}if(u&&(u.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;u=null}if(z&&(z.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;z=null}if(/(TD|TABLE|TH|CAPTION)/.test(m)||(u&&m=="DIV"&&/left|right/gi.test(M.getStyle(u,"float",1)))){m=V.element;u=z=null}C=(u&&u.nodeName==m)?u.cloneNode(0):v.dom.create(m);T=(z&&z.nodeName==m)?z.cloneNode(0):v.dom.create(m);T.removeAttribute("id");if(/^(H[1-6])$/.test(m)&&f(G,u)){T=v.dom.create(V.element)}I=p=O;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}p=I}while((I=I.previousSibling?I.previousSibling:I.parentNode));I=x=q;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}x=I}while((I=I.nextSibling?I.nextSibling:I.parentNode));if(p.nodeName==m){J.setStart(p,0)}else{J.setStartBefore(p)}J.setEnd(O,N);C.appendChild(J.cloneContents()||R.createTextNode(""));try{K.setEndAfter(x)}catch(P){}K.setStart(q,o);T.appendChild(K.cloneContents()||R.createTextNode(""));G=R.createRange();if(!p.previousSibling&&p.parentNode.nodeName==m){G.setStartBefore(p.parentNode)}else{if(J.startContainer.nodeName==m&&J.startOffset==0){G.setStartBefore(J.startContainer)}else{G.setStart(J.startContainer,J.startOffset)}}if(!x.nextSibling&&x.parentNode.nodeName==m){G.setEndAfter(x.parentNode)}else{G.setEnd(K.endContainer,K.endOffset)}G.deleteContents();if(b){v.getWin().scrollTo(0,L.y)}if(C.firstChild&&C.firstChild.nodeName==m){C.innerHTML=C.firstChild.innerHTML}if(T.firstChild&&T.firstChild.nodeName==m){T.innerHTML=T.firstChild.innerHTML}function S(y,s){var r=[],X,W,t;y.innerHTML="";if(V.keep_styles){W=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(W.nodeName)){X=W.cloneNode(g);M.setAttrib(X,"id","");r.push(X)}}while(W=W.parentNode)}if(r.length>0){for(t=r.length-1,X=y;t>=0;t--){X=X.appendChild(r[t])}r[0].innerHTML=b?"\u00a0":"<br />";return r[0]}else{y.innerHTML=b?"\u00a0":"<br />"}}if(M.isEmpty(C)){S(C,O)}if(M.isEmpty(T)){A=S(T,q)}if(b&&parseFloat(opera.version())<9.5){G.insertNode(C);G.insertNode(T)}else{G.insertNode(T);G.insertNode(C)}T.normalize();C.normalize();v.selection.select(T,true);v.selection.collapse(true);B=v.dom.getPos(T).y;if(B<L.y||B+25>L.y+L.h){v.getWin().scrollTo(0,B<L.y?B:B-L.h+25)}v.undoManager.add();return g},backspaceDelete:function(u,B){var C=this,s=C.editor,y=s.getBody(),q=s.dom,p,v=s.selection,o=v.getRng(),x=o.startContainer,p,z,A,m;if(!B&&o.collapsed&&x.nodeType==1&&o.startOffset==x.childNodes.length){m=new l.dom.TreeWalker(x.lastChild,x);for(p=x.lastChild;p;p=m.prev()){if(p.nodeType==3){o.setStart(p,p.nodeValue.length);o.collapse(true);v.setRng(o);return}}}if(x&&s.dom.isBlock(x)&&!/^(TD|TH)$/.test(x.nodeName)&&B){if(x.childNodes.length==0||(x.childNodes.length==1&&x.firstChild.nodeName=="BR")){p=x;while((p=p.previousSibling)&&!s.dom.isBlock(p)){}if(p){if(x!=y.firstChild){z=s.dom.doc.createTreeWalker(p,NodeFilter.SHOW_TEXT,null,g);while(A=z.nextNode()){p=A}o=s.getDoc().createRange();o.setStart(p,p.nodeValue?p.nodeValue.length:0);o.setEnd(p,p.nodeValue?p.nodeValue.length:0);v.setRng(o);s.dom.remove(x)}return j.cancel(u)}}}}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){if(p.cmd){i.execCommand(p.cmd,p.ui||false,p.value)}}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(f,n,h){var l=this,j=l.editor,i,k,m;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,scope:n.scope,control_manager:l},n);f=l.prefix+f;function g(o){return o.settings.use_accessible_selects&&!c.isGecko}if(j.settings.use_native_selects||g(j)){k=new c.ui.NativeListBox(f,n)}else{m=h||l._cls.listbox||c.ui.ListBox;k=new m(f,n,j)}l.controls[f]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){j.bookmark=j.selection.getBookmark(1)});a.add(o,"focus",function(){j.selection.moveToBookmark(j.bookmark);j.bookmark=null})})}if(k.hideMenu){j.onMouseDown.add(k.hideMenu,k)}return l.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i,g);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i,g)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i,g));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n,j);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onShowMenu.add(function(){j.focus();g=j.selection.getBookmark(1)});k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createToolbarGroup:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||this._cls.toolbarGroup||c.ui.ToolbarGroup;i=new f(k,h,g.editor);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},resizeBy:function(f,g,h){h.resizeBy(f,g)},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){a.Formatter=function(U){var M={},O=a.each,c=U.dom,q=U.selection,t=a.dom.TreeWalker,K=new a.dom.RangeUtils(c),d=U.schema.isValidChild,F=c.isBlock,l=U.settings.forced_root_block,s=c.nodeIndex,E="\uFEFF",e=/^(src|href|style)$/,R=false,B=true,p;function z(V){return V instanceof Array}function m(W,V){return c.getParents(W,V,c.getRoot())}function b(V){return V.nodeType===1&&(V.face==="mceinline"||V.style.fontFamily==="mceinline")}function Q(V){return V?M[V]:M}function k(V,W){if(V){if(typeof(V)!=="string"){O(V,function(Y,X){k(X,Y)})}else{W=W.length?W:[W];O(W,function(X){if(X.deep===p){X.deep=!X.selector}if(X.split===p){X.split=!X.selector||X.inline}if(X.remove===p&&X.selector&&!X.inline){X.remove="none"}if(X.selector&&X.inline){X.mixed=true;X.block_expand=true}if(typeof(X.classes)==="string"){X.classes=X.classes.split(/\s+/)}});M[V]=W}}}var i=function(W){var V;U.dom.getParent(W,function(X){V=U.dom.getStyle(X,"text-decoration");return V&&V!=="none"});return V};var I=function(V){var W;if(V.nodeType===1&&V.parentNode&&V.parentNode.nodeType===1){W=i(V.parentNode);if(U.dom.getStyle(V,"color")&&W){U.dom.setStyle(V,"text-decoration",W)}else{if(U.dom.getStyle(V,"textdecoration")===W){U.dom.setStyle(V,"text-decoration",null)}}}};function S(Y,ag,ab){var ac=Q(Y),ah=ac[0],af,W,ae,ad=q.isCollapsed();function Z(al){var ak=al.startContainer,ao=al.startOffset,an,am;if(ak.nodeType==1||ak.nodeValue===""){ak=ak.nodeType==1?ak.childNodes[ao]:ak;if(ak){an=new t(ak,ak.parentNode);for(am=an.current();am;am=an.next()){if(am.nodeType==3&&!f(am)){al.setStart(am,0);break}}}}return al}function V(al,ak){ak=ak||ah;if(al){if(ak.onformat){ak.onformat(al,ak,ag,ab)}O(ak.styles,function(an,am){c.setStyle(al,am,r(an,ag))});O(ak.attributes,function(an,am){c.setAttrib(al,am,r(an,ag))});O(ak.classes,function(am){am=r(am,ag);if(!c.hasClass(al,am)){c.addClass(al,am)}})}}function aa(){function am(at,aq){var ar=new t(aq);for(ab=ar.current();ab;ab=ar.prev()){if(ab.childNodes.length>1||ab==at){return ab}}}var al=U.selection.getRng();var ap=al.startContainer;var ak=al.endContainer;if(ap!=ak&&al.endOffset==0){var ao=am(ap,ak);var an=ao.nodeType==3?ao.length:ao.childNodes.length;al.setEnd(ao,an)}return al}function X(an,at,aq,ap,al){var ak=[],am=-1,ar,av=-1,ao=-1,au;O(an.childNodes,function(ax,aw){if(ax.nodeName==="UL"||ax.nodeName==="OL"){am=aw;ar=ax;return false}});O(an.childNodes,function(ax,aw){if(ax.nodeName==="SPAN"&&c.getAttrib(ax,"data-mce-type")=="bookmark"){if(ax.id==at.id+"_start"){av=aw}else{if(ax.id==at.id+"_end"){ao=aw}}}});if(am<=0||(av<am&&ao>am)){O(a.grep(an.childNodes),al);return 0}else{au=aq.cloneNode(R);O(a.grep(an.childNodes),function(ax,aw){if((av<am&&aw<am)||(av>am&&aw>am)){ak.push(ax);ax.parentNode.removeChild(ax)}});if(av<am){an.insertBefore(au,ar)}else{if(av>am){an.insertBefore(au,ar.nextSibling)}}ap.push(au);O(ak,function(aw){au.appendChild(aw)});return au}}function ai(al,an,ap){var ak=[],ao,am;ao=ah.inline||ah.block;am=c.create(ao);V(am);K.walk(al,function(aq){var ar;function at(au){var ax=au.nodeName.toLowerCase(),aw=au.parentNode.nodeName.toLowerCase(),av;if(g(ax,"br")){ar=0;if(ah.block){c.remove(au)}return}if(ah.wrapper&&x(au,Y,ag)){ar=0;return}if(ah.block&&!ah.wrapper&&G(ax)){au=c.rename(au,ao);V(au);ak.push(au);ar=0;return}if(ah.selector){O(ac,function(ay){if("collapsed" in ay&&ay.collapsed!==ad){return}if(c.is(au,ay.selector)&&!b(au)){V(au,ay);av=true}});if(!ah.inline||av){ar=0;return}}if(d(ao,ax)&&d(aw,ao)&&!(!ap&&au.nodeType===3&&au.nodeValue.length===1&&au.nodeValue.charCodeAt(0)===65279)&&au.id!=="_mce_caret"){if(!ar){ar=am.cloneNode(R);au.parentNode.insertBefore(ar,au);ak.push(ar)}ar.appendChild(au)}else{if(ax=="li"&&an){ar=X(au,an,am,ak,at)}else{ar=0;O(a.grep(au.childNodes),at);ar=0}}}O(aq,at)});if(ah.wrap_links===false){O(ak,function(aq){function ar(aw){var av,au,at;if(aw.nodeName==="A"){au=am.cloneNode(R);ak.push(au);at=a.grep(aw.childNodes);for(av=0;av<at.length;av++){au.appendChild(at[av])}aw.appendChild(au)}O(a.grep(aw.childNodes),ar)}ar(aq)})}O(ak,function(at){var aq;function au(aw){var av=0;O(aw.childNodes,function(ax){if(!f(ax)&&!H(ax)){av++}});return av}function ar(av){var ax,aw;O(av.childNodes,function(ay){if(ay.nodeType==1&&!H(ay)&&!b(ay)){ax=ay;return R}});if(ax&&h(ax,ah)){aw=ax.cloneNode(R);V(aw);c.replace(aw,av,B);c.remove(ax,1)}return aw||av}aq=au(at);if((ak.length>1||!F(at))&&aq===0){c.remove(at,1);return}if(ah.inline||ah.wrapper){if(!ah.exact&&aq===1){at=ar(at)}O(ac,function(av){O(c.select(av.inline,at),function(ax){var aw;if(av.wrap_links===false){aw=ax.parentNode;do{if(aw.nodeName==="A"){return}}while(aw=aw.parentNode)}T(av,ag,ax,av.exact?ax:null)})});if(x(at.parentNode,Y,ag)){c.remove(at,1);at=0;return B}if(ah.merge_with_parents){c.getParent(at.parentNode,function(av){if(x(av,Y,ag)){c.remove(at,1);at=0;return B}})}if(at&&ah.merge_siblings!==false){at=u(C(at),at);at=u(at,C(at,B))}}})}if(ah){if(ab){if(ab.nodeType){W=c.createRng();W.setStartBefore(ab);W.setEndAfter(ab);ai(o(W,ac),null,true)}else{ai(ab,null,true)}}else{if(!ad||!ah.inline||c.select("td.mceSelected,th.mceSelected").length){var aj=U.selection.getNode();U.selection.setRng(aa());af=q.getBookmark();ai(o(q.getRng(B),ac),af);if(ah.styles&&(ah.styles.color||ah.styles.textDecoration)){a.walk(aj,I,"childNodes");I(aj)}q.moveToBookmark(af);q.setRng(Z(q.getRng(B)));U.nodeChanged()}else{P("apply",Y,ag)}}}}function A(X,ag,aa){var ab=Q(X),ai=ab[0],af,ae,W;function Z(al){var ak=al.startContainer,aq=al.startOffset,ap,ao,am,an;if(ak.nodeType==3&&aq>=ak.nodeValue.length-1){ak=ak.parentNode;aq=s(ak)+1}if(ak.nodeType==1){am=ak.childNodes;ak=am[Math.min(aq,am.length-1)];ap=new t(ak);if(aq>am.length-1){ap.next()}for(ao=ap.current();ao;ao=ap.next()){if(ao.nodeType==3&&!f(ao)){an=c.create("a",null,E);ao.parentNode.insertBefore(an,ao);al.setStart(ao,0);q.setRng(al);c.remove(an);return}}}}function Y(an){var am,al,ak;am=a.grep(an.childNodes);for(al=0,ak=ab.length;al<ak;al++){if(T(ab[al],ag,an,an)){break}}if(ai.deep){for(al=0,ak=am.length;al<ak;al++){Y(am[al])}}}function ac(ak){var al;O(m(ak.parentNode).reverse(),function(am){var an;if(!al&&am.id!="_start"&&am.id!="_end"){an=x(am,X,ag);if(an&&an.split!==false){al=am}}});return al}function V(an,ak,ap,at){var au,ar,aq,am,ao,al;if(an){al=an.parentNode;for(au=ak.parentNode;au&&au!=al;au=au.parentNode){ar=au.cloneNode(R);for(ao=0;ao<ab.length;ao++){if(T(ab[ao],ag,ar,ar)){ar=0;break}}if(ar){if(aq){ar.appendChild(aq)}if(!am){am=ar}aq=ar}}if(at&&(!ai.mixed||!F(an))){ak=c.split(an,ak)}if(aq){ap.parentNode.insertBefore(aq,ap);am.appendChild(ap)}}return ak}function ah(ak){return V(ac(ak),ak,ak,true)}function ad(am){var al=c.get(am?"_start":"_end"),ak=al[am?"firstChild":"lastChild"];if(H(ak)){ak=ak[am?"firstChild":"lastChild"]}c.remove(al,true);return ak}function aj(ak){var al,am;ak=o(ak,ab,B);if(ai.split){al=J(ak,B);am=J(ak);if(al!=am){al=N(al,"span",{id:"_start","data-mce-type":"bookmark"});am=N(am,"span",{id:"_end","data-mce-type":"bookmark"});ah(al);ah(am);al=ad(B);am=ad()}else{al=am=ah(al)}ak.startContainer=al.parentNode;ak.startOffset=s(al);ak.endContainer=am.parentNode;ak.endOffset=s(am)+1}K.walk(ak,function(an){O(an,function(ao){Y(ao);if(ao.nodeType===1&&U.dom.getStyle(ao,"text-decoration")==="underline"&&ao.parentNode&&i(ao.parentNode)==="underline"){T({deep:false,exact:true,inline:"span",styles:{textDecoration:"underline"}},null,ao)}})})}if(aa){if(aa.nodeType){W=c.createRng();W.setStartBefore(aa);W.setEndAfter(aa);aj(W)}else{aj(aa)}return}if(!q.isCollapsed()||!ai.inline||c.select("td.mceSelected,th.mceSelected").length){af=q.getBookmark();aj(q.getRng(B));q.moveToBookmark(af);if(ai.inline&&j(X,ag,q.getStart())){Z(q.getRng(true))}U.nodeChanged()}else{P("remove",X,ag)}if(a.isWebKit){U.execCommand("mceCleanup")}}function D(W,Y,X){var V=Q(W);if(j(W,Y,X)&&(!("toggle" in V[0])||V[0]["toggle"])){A(W,Y,X)}else{S(W,Y,X)}}function x(W,V,ab,Z){var X=Q(V),ac,aa,Y;function ad(ah,aj,ak){var ag,ai,ae=aj[ak],af;if(aj.onmatch){return aj.onmatch(ah,aj,ak)}if(ae){if(ae.length===p){for(ag in ae){if(ae.hasOwnProperty(ag)){if(ak==="attributes"){ai=c.getAttrib(ah,ag)}else{ai=L(ah,ag)}if(Z&&!ai&&!aj.exact){return}if((!Z||aj.exact)&&!g(ai,r(ae[ag],ab))){return}}}}else{for(af=0;af<ae.length;af++){if(ak==="attributes"?c.getAttrib(ah,ae[af]):L(ah,ae[af])){return aj}}}}return aj}if(X&&W){for(aa=0;aa<X.length;aa++){ac=X[aa];if(h(W,ac)&&ad(W,ac,"attributes")&&ad(W,ac,"styles")){if(Y=ac.classes){for(aa=0;aa<Y.length;aa++){if(!c.hasClass(W,Y[aa])){return}}}return ac}}}}function j(X,Z,Y){var W;function V(aa){aa=c.getParent(aa,function(ab){return !!x(ab,X,Z,true)});return x(aa,X,Z)}if(Y){return V(Y)}Y=q.getNode();if(V(Y)){return B}W=q.getStart();if(W!=Y){if(V(W)){return B}}return R}function v(ac,ab){var Z,aa=[],Y={},X,W,V;Z=q.getStart();c.getParent(Z,function(af){var ae,ad;for(ae=0;ae<ac.length;ae++){ad=ac[ae];if(!Y[ad]&&x(af,ad,ab)){Y[ad]=true;aa.push(ad)}}});return aa}function y(Z){var ab=Q(Z),Y,X,aa,W,V;if(ab){Y=q.getStart();X=m(Y);for(W=ab.length-1;W>=0;W--){V=ab[W].selector;if(!V){return B}for(aa=X.length-1;aa>=0;aa--){if(c.is(X[aa],V)){return B}}}}return R}a.extend(this,{get:Q,register:k,apply:S,remove:A,toggle:D,match:j,matchAll:v,matchNode:x,canApply:y});function h(V,W){if(g(V,W.inline)){return B}if(g(V,W.block)){return B}if(W.selector){return c.is(V,W.selector)}}function g(W,V){W=W||"";V=V||"";W=""+(W.nodeName||W);V=""+(V.nodeName||V);return W.toLowerCase()==V.toLowerCase()}function L(W,V){var X=c.getStyle(W,V);if(V=="color"||V=="backgroundColor"){X=c.toHex(X)}if(V=="fontWeight"&&X==700){X="bold"}return""+X}function r(V,W){if(typeof(V)!="string"){V=V(W)}else{if(W){V=V.replace(/%(\w+)/g,function(Y,X){return W[X]||Y})}}return V}function f(V){return V&&V.nodeType===3&&/^([\t \r\n]+|)$/.test(V.nodeValue)}function N(X,W,V){var Y=c.create(W,V);X.parentNode.insertBefore(Y,X);Y.appendChild(X);return Y}function o(V,ah,Y){var X=V.startContainer,ac=V.startOffset,ak=V.endContainer,ae=V.endOffset,aj,ag,ab,af;function ai(aq){var al,ao,ap,an,am;al=ao=aq?X:ak;am=aq?"previousSibling":"nextSibling";root=c.getRoot();if(al.nodeType==3&&!f(al)){if(aq?ac>0:ae<al.nodeValue.length){return al}}for(;;){if(ao==root||(!ah[0].block_expand&&F(ao))){return ao}for(an=ao[am];an;an=an[am]){if(!H(an)&&!f(an)){return ao}}ao=ao.parentNode}return al}function aa(al,am){if(am===p){am=al.nodeType===3?al.length:al.childNodes.length}while(al&&al.hasChildNodes()){al=al.childNodes[am];if(al){am=al.nodeType===3?al.length:al.childNodes.length}}return{node:al,offset:am}}if(X.nodeType==1&&X.hasChildNodes()){ag=X.childNodes.length-1;X=X.childNodes[ac>ag?ag:ac];if(X.nodeType==3){ac=0}}if(ak.nodeType==1&&ak.hasChildNodes()){ag=ak.childNodes.length-1;ak=ak.childNodes[ae>ag?ag:ae-1];if(ak.nodeType==3){ae=ak.nodeValue.length}}if(H(X.parentNode)||H(X)){X=H(X)?X:X.parentNode;X=X.nextSibling||X;if(X.nodeType==3){ac=0}}if(H(ak.parentNode)||H(ak)){ak=H(ak)?ak:ak.parentNode;ak=ak.previousSibling||ak;if(ak.nodeType==3){ae=ak.length}}if(ah[0].inline){if(V.collapsed){function ad(am,aq,at){var ap,an,ar,al;function ao(av,ax){var ay,au,aw=av.nodeValue;if(typeof(ax)=="undefined"){ax=at?aw.length:0}if(at){ay=aw.lastIndexOf(" ",ax);au=aw.lastIndexOf("\u00a0",ax);ay=ay>au?ay:au;if(ay!==-1&&!Y){ay++}}else{ay=aw.indexOf(" ",ax);au=aw.indexOf("\u00a0",ax);ay=ay!==-1&&(au===-1||ay<au)?ay:au}return ay}if(am.nodeType===3){ar=ao(am,aq);if(ar!==-1){return{container:am,offset:ar}}al=am}ap=new t(am,c.getParent(am,F)||U.getBody());while(an=ap[at?"prev":"next"]()){if(an.nodeType===3){al=an;ar=ao(an);if(ar!==-1){return{container:an,offset:ar}}}else{if(F(an)){break}}}if(al){if(at){aq=0}else{aq=al.length}return{container:al,offset:aq}}}af=ad(X,ac,true);if(af){X=af.container;ac=af.offset}af=ad(ak,ae);if(af){ak=af.container;ae=af.offset}}ab=aa(ak,ae);if(ab.node){while(ab.node&&ab.offset===0&&ab.node.previousSibling){ab=aa(ab.node.previousSibling)}if(ab.node&&ab.offset>0&&ab.node.nodeType===3&&ab.node.nodeValue.charAt(ab.offset-1)===" "){if(ab.offset>1){ak=ab.node;ak.splitText(ab.offset-1)}else{if(ab.node.previousSibling){}}}}}if(ah[0].inline||ah[0].block_expand){if(!ah[0].inline||(X.nodeType!=3||ac===0)){X=ai(true)}if(!ah[0].inline||(ak.nodeType!=3||ae===ak.nodeValue.length)){ak=ai()}}if(ah[0].selector&&ah[0].expand!==R&&!ah[0].inline){function Z(am,al){var an,ao,aq,ap;if(am.nodeType==3&&am.nodeValue.length==0&&am[al]){am=am[al]}an=m(am);for(ao=0;ao<an.length;ao++){for(aq=0;aq<ah.length;aq++){ap=ah[aq];if("collapsed" in ap&&ap.collapsed!==V.collapsed){continue}if(c.is(an[ao],ap.selector)){return an[ao]}}}return am}X=Z(X,"previousSibling");ak=Z(ak,"nextSibling")}if(ah[0].block||ah[0].selector){function W(am,al,ao){var an;if(!ah[0].wrapper){an=c.getParent(am,ah[0].block)}if(!an){an=c.getParent(am.nodeType==3?am.parentNode:am,F)}if(an&&ah[0].wrapper){an=m(an,"ul,ol").reverse()[0]||an}if(!an){an=am;while(an[al]&&!F(an[al])){an=an[al];if(g(an,"br")){break}}}return an||am}X=W(X,"previousSibling");ak=W(ak,"nextSibling");if(ah[0].block){if(!F(X)){X=ai(true)}if(!F(ak)){ak=ai()}}}if(X.nodeType==1){ac=s(X);X=X.parentNode}if(ak.nodeType==1){ae=s(ak)+1;ak=ak.parentNode}return{startContainer:X,startOffset:ac,endContainer:ak,endOffset:ae}}function T(ab,aa,Y,V){var X,W,Z;if(!h(Y,ab)){return R}if(ab.remove!="all"){O(ab.styles,function(ad,ac){ad=r(ad,aa);if(typeof(ac)==="number"){ac=ad;V=0}if(!V||g(L(V,ac),ad)){c.setStyle(Y,ac,"")}Z=1});if(Z&&c.getAttrib(Y,"style")==""){Y.removeAttribute("style");Y.removeAttribute("data-mce-style")}O(ab.attributes,function(ae,ac){var ad;ae=r(ae,aa);if(typeof(ac)==="number"){ac=ae;V=0}if(!V||g(c.getAttrib(V,ac),ae)){if(ac=="class"){ae=c.getAttrib(Y,ac);if(ae){ad="";O(ae.split(/\s+/),function(af){if(/mce\w+/.test(af)){ad+=(ad?" ":"")+af}});if(ad){c.setAttrib(Y,ac,ad);return}}}if(ac=="class"){Y.removeAttribute("className")}if(e.test(ac)){Y.removeAttribute("data-mce-"+ac)}Y.removeAttribute(ac)}});O(ab.classes,function(ac){ac=r(ac,aa);if(!V||c.hasClass(V,ac)){c.removeClass(Y,ac)}});W=c.getAttribs(Y);for(X=0;X<W.length;X++){if(W[X].nodeName.indexOf("_")!==0){return R}}}if(ab.remove!="none"){n(Y,ab);return B}}function n(X,Y){var V=X.parentNode,W;if(Y.block){if(!l){function Z(ab,aa,ac){ab=C(ab,aa,ac);return !ab||(ab.nodeName=="BR"||F(ab))}if(F(X)&&!F(V)){if(!Z(X,R)&&!Z(X.firstChild,B,1)){X.insertBefore(c.create("br"),X.firstChild)}if(!Z(X,B)&&!Z(X.lastChild,R,1)){X.appendChild(c.create("br"))}}}else{if(V==c.getRoot()){if(!Y.list_block||!g(X,Y.list_block)){O(a.grep(X.childNodes),function(aa){if(d(l,aa.nodeName.toLowerCase())){if(!W){W=N(aa,l)}else{W.appendChild(aa)}}else{W=0}})}}}}if(Y.selector&&Y.inline&&!g(Y.inline,X)){return}c.remove(X,1)}function C(W,V,X){if(W){V=V?"nextSibling":"previousSibling";for(W=X?W:W[V];W;W=W[V]){if(W.nodeType==1||!f(W)){return W}}}}function H(V){return V&&V.nodeType==1&&V.getAttribute("data-mce-type")=="bookmark"}function u(Z,Y){var V,X,W;function ab(ae,ad){if(ae.nodeName!=ad.nodeName){return R}function ac(ag){var ah={};O(c.getAttribs(ag),function(ai){var aj=ai.nodeName.toLowerCase();if(aj.indexOf("_")!==0&&aj!=="style"){ah[aj]=c.getAttrib(ag,aj)}});return ah}function af(aj,ai){var ah,ag;for(ag in aj){if(aj.hasOwnProperty(ag)){ah=ai[ag];if(ah===p){return R}if(aj[ag]!=ah){return R}delete ai[ag]}}for(ag in ai){if(ai.hasOwnProperty(ag)){return R}}return B}if(!af(ac(ae),ac(ad))){return R}if(!af(c.parseStyle(c.getAttrib(ae,"style")),c.parseStyle(c.getAttrib(ad,"style")))){return R}return B}if(Z&&Y){function aa(ad,ac){for(X=ad;X;X=X[ac]){if(X.nodeType==3&&X.nodeValue.length!==0){return ad}if(X.nodeType==1&&!H(X)){return X}}return ad}Z=aa(Z,"previousSibling");Y=aa(Y,"nextSibling");if(ab(Z,Y)){for(X=Z.nextSibling;X&&X!=Y;){W=X;X=X.nextSibling;Z.appendChild(W)}c.remove(Y);O(a.grep(Y.childNodes),function(ac){Z.appendChild(ac)});return Z}}return Y}function G(V){return/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(V)}function J(W,aa){var V,Z,X,Y;V=W[aa?"startContainer":"endContainer"];Z=W[aa?"startOffset":"endOffset"];if(V.nodeType==1){X=V.childNodes.length-1;if(!aa&&Z){Z--}V=V.childNodes[Z>X?X:Z]}if(V.nodeType===3&&aa&&Z>=V.nodeValue.length){V=new t(V,U.getBody()).next()||V}if(V.nodeType===3&&!aa&&Z==0){V=new t(V,U.getBody()).prev()||V}return V}function P(ae,V,ac){var ah,af="_mce_caret",W=U.settings.caret_debug;ah=a.isGecko?"\u200B":E;function X(aj){var ai=c.create("span",{id:af,"data-mce-bogus":true,style:W?"color:red":""});if(aj){ai.appendChild(U.getDoc().createTextNode(ah))}return ai}function ad(aj,ai){while(aj){if((aj.nodeType===3&&aj.nodeValue!==ah)||aj.childNodes.length>1){return false}if(ai&&aj.nodeType===1){ai.push(aj)}aj=aj.firstChild}return true}function aa(ai){while(ai){if(ai.id===af){return ai}ai=ai.parentNode}}function Z(ai){var aj;if(ai){aj=new t(ai,ai);for(ai=aj.current();ai;ai=aj.next()){if(ai.nodeType===3){return ai}}}}function Y(ak,aj){var al,ai;if(!ak){ak=aa(q.getStart());if(!ak){while(ak=c.get(af)){Y(ak,false)}}}else{ai=q.getRng(true);if(ad(ak)){if(aj!==false){ai.setStartBefore(ak);ai.setEndBefore(ak)}c.remove(ak)}else{al=Z(ak);al=al.deleteData(0,1);c.remove(ak,1)}q.setRng(ai)}}function ab(){var ak,ai,ao,an,al,aj,am;ak=q.getRng(true);an=ak.startOffset;aj=ak.startContainer;am=aj.nodeValue;ai=aa(q.getStart());if(ai){ao=Z(ai)}if(am&&an>0&&an<am.length&&/\w/.test(am.charAt(an))&&/\w/.test(am.charAt(an-1))){al=q.getBookmark();ak.collapse(true);ak=o(ak,Q(V));ak=K.split(ak);S(V,ac,ak);q.moveToBookmark(al)}else{if(!ai||ao.nodeValue!==ah){ai=X(true);ao=ai.firstChild;ak.insertNode(ai);an=1;S(V,ac,ai)}else{S(V,ac,ai)}q.setCursorLocation(ao,an)}}function ag(){var ai=q.getRng(true),aj,al,ao,an,ak,ar,aq=[],am,ap;aj=ai.startContainer;al=ai.startOffset;ak=aj;if(aj.nodeType==3){if(al!=aj.nodeValue.length||aj.nodeValue===ah){an=true}ak=ak.parentNode}while(ak){if(x(ak,V,ac)){ar=ak;break}if(ak.nextSibling){an=true}aq.push(ak);ak=ak.parentNode}if(!ar){return}if(an){ao=q.getBookmark();ai.collapse(true);ai=o(ai,Q(V),true);ai=K.split(ai);A(V,ac,ai);q.moveToBookmark(ao)}else{ap=X();ak=ap;for(am=aq.length-1;am>=0;am--){ak.appendChild(aq[am].cloneNode(false));ak=ak.firstChild}ak.appendChild(c.doc.createTextNode(ah));ak=ak.firstChild;c.insertAfter(ap,ar);q.setCursorLocation(ak,1)}}U.onBeforeGetContent.addToTop(function(){var ai=[],aj;if(ad(aa(q.getStart()),ai)){aj=ai.length;while(aj--){c.setAttrib(ai[aj],"data-mce-bogus","1")}}});a.each("onMouseUp onKeyUp".split(" "),function(ai){U[ai].addToTop(function(){Y()})});U.onKeyDown.addToTop(function(ai,ak){var aj=ak.keyCode;if(aj==8||aj==37||aj==39){Y(aa(q.getStart()))}});if(ae=="apply"){ab()}else{ag()}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_legacy_values);function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/tiny_mce_src.js 1.0.2.src/e107_handlers/tiny_mce/tiny_mce_src.js
--- 1.0.0.src/e107_handlers/tiny_mce/tiny_mce_src.js	2012-10-30 15:39:55.579444555 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/tiny_mce_src.js	2012-10-30 15:40:38.401439922 +0000
@@ -5,9 +5,9 @@
 	var tinymce = {
 		majorVersion : '3',
 
-		minorVersion : '4.1',
+		minorVersion : '4.7',
 
-		releaseDate : '2011-03-24',
+		releaseDate : '2011-11-03',
 
 		_init : function() {
 			var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;
@@ -20,6 +20,12 @@
 
 			t.isIE6 = t.isIE && /MSIE [56]/.test(ua);
 
+			t.isIE7 = t.isIE && /MSIE [7]/.test(ua);
+
+			t.isIE8 = t.isIE && /MSIE [8]/.test(ua);
+
+			t.isIE9 = t.isIE && /MSIE [9]/.test(ua);
+
 			t.isGecko = !t.isWebKit && /Gecko/.test(ua);
 
 			t.isMac = ua.indexOf('Mac') != -1;
@@ -27,6 +33,8 @@
 			t.isAir = /adobeair/i.test(ua);
 
 			t.isIDevice = /(iPad|iPhone)/.test(ua);
+			
+			t.isIOS5 = t.isIDevice && ua.match(/AppleWebKit\/(\d*)/)[1]>=534;
 
 			// TinyMCE .NET webcontrol might be setting the values for TinyMCE
 			if (win.tinyMCEPreInit) {
@@ -484,6 +492,7 @@
 	})(window);
 
 
+
 tinymce.create('tinymce.util.Dispatcher', {
 	scope : null,
 	listeners : null,
@@ -542,7 +551,7 @@
 
 	tinymce.create('tinymce.util.URI', {
 		URI : function(u, s) {
-			var t = this, o, a, b;
+			var t = this, o, a, b, base_url;
 
 			// Trim whitespace
 			u = tinymce.trim(u);
@@ -550,8 +559,9 @@
 			// Default settings
 			s = t.settings = s || {};
 
-			// Strange app protocol or local anchor
-			if (/^(mailto|tel|news|javascript|about|data):/i.test(u) || /^\s*#/.test(u)) {
+			// Strange app protocol that isn't http/https or local anchor
+			// For example: mailto,skype,tel etc.
+			if (/^([\w\-]+):([^\/]{2})/i.test(u) || /^\s*#/.test(u)) {
 				t.source = u;
 				return;
 			}
@@ -561,8 +571,10 @@
 				u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u;
 
 			// Relative path http:// or protocol relative //path
-			if (!/^\w*:?\/\//.test(u))
-				u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u);
+			if (!/^[\w-]*:?\/\//.test(u)) {
+				base_url = s.base_uri ? s.base_uri.path : new tinymce.util.URI(location.href).directory;
+				u = ((s.base_uri && s.base_uri.protocol) || 'http') + '://mce_host' + t.toAbsPath(base_url, 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
@@ -889,8 +901,11 @@
 
 				v = '{';
 
-				for (i in o)
-					v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : '';
+				for (i in o) {
+					if (o.hasOwnProperty(i)) {
+						v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : '';
+					}
+				}
 
 				return v + '}';
 		}
@@ -911,6 +926,7 @@
 
 		};
 })();
+
 tinymce.create('static tinymce.util.XHR', {
 	send : function(o) {
 		var x, t, w = window, c = 0;
@@ -1024,12 +1040,207 @@
 		}
 	});
 }());
+(function(tinymce){
+	tinymce.VK = {
+		DELETE: 46,
+		BACKSPACE: 8,
+		ENTER: 13,
+		TAB: 9,
+        SPACEBAR: 32,
+		UP: 38,
+		DOWN: 40
+	}
+})(tinymce);
+
+(function(tinymce) {
+	var VK = tinymce.VK, BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE;
+
+	function cleanupStylesWhenDeleting(ed) {
+		var dom = ed.dom, selection = ed.selection;
+
+		ed.onKeyDown.add(function(ed, e) {
+			var rng, blockElm, node, clonedSpan, isDelete;
+
+			isDelete = e.keyCode == DELETE;
+			if (isDelete || e.keyCode == BACKSPACE) {
+				e.preventDefault();
+				rng = selection.getRng();
+
+				// Find root block
+				blockElm = dom.getParent(rng.startContainer, dom.isBlock);
+
+				// On delete clone the root span of the next block element
+				if (isDelete)
+					blockElm = dom.getNext(blockElm, dom.isBlock);
+
+				// Locate root span element and clone it since it would otherwise get merged by the "apple-style-span" on delete/backspace
+				if (blockElm) {
+					node = blockElm.firstChild;
+
+					// Ignore empty text nodes
+					while (node && node.nodeType == 3 && node.nodeValue.length == 0)
+						node = node.nextSibling;
+
+					if (node && node.nodeName === 'SPAN') {
+						clonedSpan = node.cloneNode(false);
+					}
+				}
+
+				// Do the backspace/delete actiopn
+				ed.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false, null);
+
+				// Find all odd apple-style-spans
+				blockElm = dom.getParent(rng.startContainer, dom.isBlock);
+				tinymce.each(dom.select('span.Apple-style-span,font.Apple-style-span', blockElm), function(span) {
+					var bm = selection.getBookmark();
+
+					if (clonedSpan) {
+						dom.replace(clonedSpan.cloneNode(false), span, true);
+					} else {
+						dom.remove(span, true);
+					}
+
+					// Restore the selection
+					selection.moveToBookmark(bm);
+				});
+			}
+		});
+	};
+
+	function emptyEditorWhenDeleting(ed) {
+		ed.onKeyUp.add(function(ed, e) {
+			var keyCode = e.keyCode;
+
+			if (keyCode == DELETE || keyCode == BACKSPACE) {
+				if (ed.dom.isEmpty(ed.getBody())) {
+					ed.setContent('', {format : 'raw'});
+					ed.nodeChanged();
+					return;
+				}
+			}
+		});
+	};
+
+	function inputMethodFocus(ed) {
+		ed.dom.bind(ed.getDoc(), 'focusin', function() {
+			ed.selection.setRng(ed.selection.getRng());
+		});
+	};
+
+	function removeHrOnBackspace(ed) {
+		ed.onKeyDown.add(function(ed, e) {
+			if (e.keyCode === BACKSPACE) {
+				if (ed.selection.isCollapsed() && ed.selection.getRng(true).startOffset === 0) {
+					var node = ed.selection.getNode();
+					var previousSibling = node.previousSibling;
+					if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "hr") {
+						ed.dom.remove(previousSibling);
+						tinymce.dom.Event.cancel(e);
+					}
+				}
+			}
+		})
+	}
+
+	function focusBody(ed) {
+		// Fix for a focus bug in FF 3.x where the body element
+		// wouldn't get proper focus if the user clicked on the HTML element
+		if (!Range.prototype.getClientRects) { // Detect getClientRects got introduced in FF 4
+			ed.onMouseDown.add(function(ed, e) {
+				if (e.target.nodeName === "HTML") {
+					var body = ed.getBody();
+
+					// Blur the body it's focused but not correctly focused
+					body.blur();
+
+					// Refocus the body after a little while
+					setTimeout(function() {
+						body.focus();
+					}, 0);
+				}
+			});
+		}
+	};
+
+	function selectControlElements(ed) {
+		ed.onClick.add(function(ed, e) {
+			e = e.target;
+
+			// Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250
+			// WebKit can't even do simple things like selecting an image
+			// Needs tobe the setBaseAndExtend or it will fail to select floated images
+			if (/^(IMG|HR)$/.test(e.nodeName))
+				ed.selection.getSel().setBaseAndExtent(e, 0, e, 1);
+
+			if (e.nodeName == 'A' && ed.dom.hasClass(e, 'mceItemAnchor'))
+				ed.selection.select(e);
+
+			ed.nodeChanged();
+		});
+	};
+
+	function selectionChangeNodeChanged(ed) {
+		var lastRng, selectionTimer;
+
+		ed.dom.bind(ed.getDoc(), 'selectionchange', function() {
+			if (selectionTimer) {
+				clearTimeout(selectionTimer);
+				selectionTimer = 0;
+			}
+
+			selectionTimer = window.setTimeout(function() {
+				var rng = ed.selection.getRng();
+
+				// Compare the ranges to see if it was a real change or not
+				if (!lastRng || !tinymce.dom.RangeUtils.compareRanges(rng, lastRng)) {
+					ed.nodeChanged();
+					lastRng = rng;
+				}
+			}, 50);
+		});
+	}
+
+	function ensureBodyHasRoleApplication(ed) {
+		document.body.setAttribute("role", "application");
+	}
+
+	tinymce.create('tinymce.util.Quirks', {
+		Quirks: function(ed) {
+			// WebKit
+			if (tinymce.isWebKit) {
+				cleanupStylesWhenDeleting(ed);
+				emptyEditorWhenDeleting(ed);
+				inputMethodFocus(ed);
+				selectControlElements(ed);
+
+				// iOS
+				if (tinymce.isIDevice) {
+					selectionChangeNodeChanged(ed);
+				}
+			}
+
+			// IE
+			if (tinymce.isIE) {
+				removeHrOnBackspace(ed);
+				emptyEditorWhenDeleting(ed);
+				ensureBodyHasRoleApplication(ed);
+			}
+
+			// Gecko
+			if (tinymce.isGecko) {
+				removeHrOnBackspace(ed);
+				focusBody(ed);
+			}
+		}
+	});
+})(tinymce);
+
 (function(tinymce) {
 	var namedEntities, baseEntities, reverseEntities,
-		attrsCharsRegExp = /[&\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
-		textCharsRegExp = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+		attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+		textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
 		rawCharsRegExp = /[<>&\"\']/g,
-		entityRegExp = /&(#)?([\w]+);/g,
+		entityRegExp = /&(#x|#)?([\w]+);/g,
 		asciiMap = {
 				128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020",
 				135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152",
@@ -1040,7 +1251,7 @@
 
 	// Raw entities
 	baseEntities = {
-		'"' : '&quot;',
+		'\"' : '&quot;', // Needs to be escaped since the YUI compressor would otherwise break the code
 		"'" : '&#39;',
 		'<' : '&lt;',
 		'>' : '&gt;',
@@ -1194,7 +1405,7 @@
 		decode : function(text) {
 			return text.replace(entityRegExp, function(all, numeric, value) {
 				if (numeric) {
-					value = parseInt(value);
+					value = parseInt(value, numeric.length === 2 ? 16 : 10);
 
 					// Support upper UTF
 					if (value > 0xFFFF) {
@@ -1221,10 +1432,10 @@
 
 	settings = settings || {};
 
-	encodingItems = '\\" \\\' \\; \\: ; : _'.split(' ');
+	encodingItems = '\\" \\\' \\; \\: ; : \uFEFF'.split(' ');
 	for (i = 0; i < encodingItems.length; i++) {
-		encodingLookup[encodingItems[i]] = '_' + i;
-		encodingLookup['_' + i] = encodingItems[i];
+		encodingLookup[encodingItems[i]] = '\uFEFF' + i;
+		encodingLookup['\uFEFF' + i] = encodingItems[i];
 	}
 
 	function toHex(match, r, g, b) {
@@ -1319,7 +1530,7 @@
 			// It will also decode the \" \' if keep_slashes is set to fale or omitted
 			function decode(str, keep_slashes) {
 				if (isEncoded) {
-					str = str.replace(/_[0-9]/g, function(str) {
+					str = str.replace(/\uFEFF[0-9]/g, function(str) {
 						return encodingLookup[str];
 					});
 				}
@@ -1332,7 +1543,7 @@
 
 			if (css) {
 				// Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing
-				css = css.replace(/\\[\"\';:_]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) {
+				css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) {
 					return str.replace(/[;:]/g, encode);
 				});
 
@@ -1399,7 +1610,7 @@
 			var css = '', name, value;
 
 			function serializeStyles(name) {
-				var styleList, i, l, name, value;
+				var styleList, i, l, value;
 
 				styleList = schema.styles[name];
 				if (styleList) {
@@ -1407,7 +1618,7 @@
 						name = styleList[i];
 						value = styles[name];
 
-						if (value !== undef)
+						if (value !== undef && value.length > 0)
 							css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
 					}
 				}
@@ -1417,13 +1628,13 @@
 			if (element_name && schema && schema.styles) {
 				// Serialize global styles and element specific styles
 				serializeStyles('*');
-				serializeStyles(name);
+				serializeStyles(element_name);
 			} else {
 				// Output the styles in the order they are inside the object
 				for (name in styles) {
 					value = styles[name];
 
-					if (value !== undef)
+					if (value !== undef && value.length > 0)
 						css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
 				}
 			}
@@ -1434,8 +1645,8 @@
 };
 
 (function(tinymce) {
-	var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap,
-		whiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each;
+	var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap, customElementsMap = {},
+		defaultWhiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each;
 
 	function split(str, delim) {
 		return str.split(delim || ',');
@@ -1596,14 +1807,14 @@
 		'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]'
 	);
 
-	boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls');
+	boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,autoplay,loop,controls');
 	shortEndedElementsMap = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source');
-	nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,object'), shortEndedElementsMap);
-	whiteSpaceElementsMap = makeMap('pre,script,style');
+	nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,audio,object'), shortEndedElementsMap);
+	defaultWhiteSpaceElementsMap = makeMap('pre,script,style,textarea');
 	selfClosingElementsMap = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
 
 	tinymce.html.Schema = function(settings) {
-		var self = this, elements = {}, children = {}, patternElements = [], validStyles;
+		var self = this, elements = {}, children = {}, patternElements = [], validStyles, whiteSpaceElementsMap;
 
 		settings = settings || {};
 
@@ -1621,6 +1832,8 @@
 			});
 		}
 
+		whiteSpaceElementsMap = settings.whitespace_elements ? makeMap(settings.whitespace_elements) : defaultWhiteSpaceElementsMap;
+
 		// Converts a wildcard expression string to a regexp for example *a will become /.*a/.
 		function patternToRegExp(str) {
 			return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
@@ -1785,10 +1998,16 @@
 			if (custom_elements) {
 				each(split(custom_elements), function(rule) {
 					var matches = customElementRegExp.exec(rule),
-						cloneName = matches[1] === '~' ? 'span' : 'div',
+						inline = matches[1] === '~',
+						cloneName = inline ? 'span' : 'div',
 						name = matches[2];
 
 					children[name] = children[cloneName];
+					customElementsMap[name] = cloneName;
+
+					// If it's not marked as inline then add it to valid block elements
+					if (!inline)
+						blockElementsMap[name] = {};
 
 					// Add custom elements at span/div positions
 					each(children, function(element, child) {
@@ -1827,7 +2046,24 @@
 					}
 				});
 			}
-		}
+		};
+
+		function getElementRule(name) {
+			var element = elements[name], i;
+
+			// Exact match found
+			if (element)
+				return element;
+
+			// No exact match then try the patterns
+			i = patternElements.length;
+			while (i--) {
+				element = patternElements[i];
+
+				if (element.pattern.test(name))
+					return element;
+			}
+		};
 
 		if (!settings.valid_elements) {
 			// No valid elements defined then clone the elements from the transitional spec
@@ -1850,7 +2086,7 @@
 			elements.img.attributesDefault = [{name: 'alt', value: ''}];
 
 			// Remove these if they are empty by default
-			each(split('ol,ul,li,sub,sup,blockquote,tr,div,span,font,a,table,tbody'), function(name) {
+			each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr'), function(name) {
 				elements[name].removeEmpty = true;
 			});
 
@@ -1868,6 +2104,10 @@
 		// Todo: Remove this when we fix list handling to be valid
 		addValidChildren('+ol[ul|ol],+ul[ul|ol]');
 
+		// If the user didn't allow span only allow internal spans
+		if (!getElementRule('span'))
+			addValidElements('span[!data-mce-type|*]');
+
 		// Delete invalid elements
 		if (settings.invalid_elements) {
 			tinymce.each(tinymce.explode(settings.invalid_elements), function(item) {
@@ -1910,21 +2150,10 @@
 			return !!(parent && parent[child]);
 		};
 
-		self.getElementRule = function(name) {
-			var element = elements[name], i;
-
-			// Exact match found
-			if (element)
-				return element;
-
-			// No exact match then try the patterns
-			i = patternElements.length;
-			while (i--) {
-				element = patternElements[i];
+		self.getElementRule = getElementRule;
 
-				if (element.pattern.test(name))
-					return element;
-			}
+		self.getCustomElements = function() {
+			return customElementsMap;
 		};
 
 		self.addValidElements = addValidElements;
@@ -1958,10 +2187,10 @@
 		});
 
 		self.parse = function(html) {
-			var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name,
-				shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue,
+			var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, isInternalElement, removeInternalElements,
+				shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, invalidPrefixRegExp,
 				validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing,
-				tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing;
+				tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing, isIE;
 
 			function processEndTag(name) {
 				var pos, i;
@@ -1995,7 +2224,7 @@
 				'(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE
 				'(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI
 				'(?:\\/([^>]+)>)|' + // End element
-				'(?:([^\\s\\/<>]+)\\s*((?:[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*)>)' + // Start element
+				'(?:([^\\s\\/<>]+)((?:\\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\\/)>)' + // Start element
 			')', 'g');
 
 			attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;
@@ -2010,7 +2239,10 @@
 			selfClosing = schema.getSelfClosingElements();
 			fillAttrsMap = schema.getBoolAttrs();
 			validate = settings.validate;
+			removeInternalElements = settings.remove_internals;
 			fixSelfClosing = settings.fix_self_closing;
+			isIE = tinymce.isIE;
+			invalidPrefixRegExp = /^:/;
 
 			while (matches = tokenRegExp.exec(html)) {
 				// Text
@@ -2018,9 +2250,20 @@
 					self.text(decode(html.substr(index, matches.index - index)));
 
 				if (value = matches[6]) { // End element
-					processEndTag(value.toLowerCase());
+					value = value.toLowerCase();
+
+					// IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements
+					if (isIE && invalidPrefixRegExp.test(value))
+						value = value.substr(1);
+
+					processEndTag(value);
 				} else if (value = matches[7]) { // Start element
 					value = value.toLowerCase();
+
+					// IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements
+					if (isIE && invalidPrefixRegExp.test(value))
+						value = value.substr(1);
+
 					isShortEnded = value in shortEndedElements;
 
 					// Is self closing tag for example an <li> after an open <li>
@@ -2039,6 +2282,12 @@
 
 						// Parse attributes
 						if (attribsValue = matches[8]) {
+							isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element
+
+							// If the element has internal attributes then remove it if we are told to do so
+							if (isInternalElement && removeInternalElements)
+								isValidElement = false;
+
 							attrList = [];
 							attrList.map = {};
 
@@ -2049,7 +2298,7 @@
 								value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute
 
 								// Validate name and value
-								if (validate && name.indexOf('data-') !== 0) {
+								if (validate && !isInternalElement && name.indexOf('data-') !== 0) {
 									attrRule = validAttributesMap[name];
 
 									// Find rule by pattern matching
@@ -2088,7 +2337,7 @@
 						}
 
 						// Process attributes if validation is enabled
-						if (validate) {
+						if (validate && !isInternalElement) {
 							attributesRequired = elementRule.attributesRequired;
 							attributesDefault = elementRule.attributesDefault;
 							attributesForced = elementRule.attributesForced;
@@ -2483,11 +2732,12 @@
 		},
 
 		isEmpty : function(elements) {
-			var self = this, node = self.firstChild, i;
+			var self = this, node = self.firstChild, i, name;
 
 			if (node) {
 				do {
 					if (node.type === 1) {
+						// Ignore bogus elements
 						if (node.attributes.map['data-mce-bogus'])
 							continue;
 
@@ -2495,10 +2745,11 @@
 						if (elements[node.name])
 							return false;
 
-						// Keep elements with data attributes
+						// Keep elements with data attributes or name attribute like <a name="1"></a>
 						i = node.attributes.length;
 						while (i--) {
-							if (node.attributes[i].name.indexOf('data-') === 0)
+							name = node.attributes[i].name;
+							if (name === "name" || name.indexOf('data-') === 0)
 								return false;
 						}
 					}
@@ -2510,6 +2761,10 @@
 			}
 
 			return true;
+		},
+
+		walk : function(prev) {
+			return walk(this, null, prev);
 		}
 	});
 
@@ -2540,6 +2795,7 @@
 		var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {};
 
 		settings = settings || {};
+		settings.validate = "validate" in settings ? settings.validate : true;
 		settings.root_name = settings.root_name || 'body';
 		self.schema = schema = schema || new tinymce.html.Schema();
 
@@ -2690,22 +2946,46 @@
 		};
 
 		self.parse = function(html, args) {
-			var parser, rootNode, node, nodes, i, l, fi, fl, list, name,
+			var parser, rootNode, node, nodes, i, l, fi, fl, list, name, validate,
 				blockElements, startWhiteSpaceRegExp, invalidChildren = [],
-				endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements;
+				endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements, rootBlockName;
 
 			args = args || {};
 			matchedNodes = {};
 			matchedAttributes = {};
-			blockElements = tinymce.extend(tinymce.makeMap('script,style,head,title,meta,param'), schema.getBlockElements());
+			blockElements = tinymce.extend(tinymce.makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
 			nonEmptyElements = schema.getNonEmptyElements();
 			children = schema.children;
+			validate = settings.validate;
+			rootBlockName = "forced_root_block" in args ? args.forced_root_block : settings.forced_root_block;
 
 			whiteSpaceElements = schema.getWhiteSpaceElements();
 			startWhiteSpaceRegExp = /^[ \t\r\n]+/;
 			endWhiteSpaceRegExp = /[ \t\r\n]+$/;
 			allWhiteSpaceRegExp = /[ \t\r\n]+/g;
 
+			function addRootBlocks() {
+				var node = rootNode.firstChild, next, rootBlockNode;
+
+				while (node) {
+					next = node.next;
+
+					if (node.type == 3 || (node.type == 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type'))) {
+						if (!rootBlockNode) {
+							// Create a new root block element
+							rootBlockNode = createNode(rootBlockName, 1);
+							rootNode.insert(rootBlockNode, node);
+							rootBlockNode.append(node);
+						} else
+							rootBlockNode.append(node);
+					} else {
+						rootBlockNode = null;
+					}
+
+					node = next;
+				};
+			};
+
 			function createNode(name, type) {
 				var node = new Node(name, type), list;
 
@@ -2721,9 +3001,26 @@
 				return node;
 			};
 
+			function removeWhitespaceBefore(node) {
+				var textNode, textVal, sibling;
+
+				for (textNode = node.prev; textNode && textNode.type === 3; ) {
+					textVal = textNode.value.replace(endWhiteSpaceRegExp, '');
+
+					if (textVal.length > 0) {
+						textNode.value = textVal;
+						textNode = textNode.prev;
+					} else {
+						sibling = textNode.prev;
+						textNode.remove();
+						textNode = sibling;
+					}
+				}
+			};
+
 			parser = new tinymce.html.SaxParser({
-				validate : settings.validate,
-				fix_self_closing : false, // Let the DOM parser handle <li> in <li> or <p> in <p> for better results
+				validate : validate,
+				fix_self_closing : !validate, // Let the DOM parser handle <li> in <li> or <p> in <p> for better results
 
 				cdata: function(text) {
 					node.append(createNode('#cdata', 4)).value = text;
@@ -2754,16 +3051,21 @@
 
 				pi: function(name, text) {
 					node.append(createNode(name, 7)).value = text;
+					removeWhitespaceBefore(node);
 				},
 
 				doctype: function(text) {
-					node.append(createNode('#doctype', 10)).value = text;
+					var newNode;
+		
+					newNode = node.append(createNode('#doctype', 10));
+					newNode.value = text;
+					removeWhitespaceBefore(node);
 				},
 
 				start: function(name, attrs, empty) {
 					var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent;
 
-					elementRule = schema.getElementRule(name);
+					elementRule = validate ? schema.getElementRule(name) : {};
 					if (elementRule) {
 						newNode = createNode(elementRule.outputName || name, 1);
 						newNode.attributes = attrs;
@@ -2792,20 +3094,8 @@
 						}
 
 						// Trim whitespace before block
-						if (blockElements[name]) {
-							for (textNode = newNode.prev; textNode && textNode.type === 3; ) {
-								text = textNode.value.replace(endWhiteSpaceRegExp, '');
-
-								if (text.length > 0) {
-									textNode.value = text;
-									textNode = textNode.prev;
-								} else {
-									sibling = textNode.prev;
-									textNode.remove();
-									textNode = sibling;
-								}
-							}
-						}
+						if (blockElements[name])
+							removeWhitespaceBefore(newNode);
 
 						// Change current node if the element wasn't empty i.e not <br /> or <img />
 						if (!empty)
@@ -2816,7 +3106,7 @@
 				end: function(name) {
 					var textNode, elementRule, text, sibling, tempNode;
 
-					elementRule = schema.getElementRule(name);
+					elementRule = validate ? schema.getElementRule(name) : {};
 					if (elementRule) {
 						if (blockElements[name]) {
 							if (!whiteSpaceElements[node.name]) {
@@ -2883,34 +3173,28 @@
 				}
 			}, schema);
 
-			rootNode = node = new Node(settings.root_name, 11);
+			rootNode = node = new Node(args.context || settings.root_name, 11);
 
 			parser.parse(html);
 
-			fixInvalidChildren(invalidChildren);
-
-			// Run node filters
-			for (name in matchedNodes) {
-				list = nodeFilters[name];
-				nodes = matchedNodes[name];
-
-				// Remove already removed children
-				fi = nodes.length;
-				while (fi--) {
-					if (!nodes[fi].parent)
-						nodes.splice(fi, 1);
-				}
-
-				for (i = 0, l = list.length; i < l; i++)
-					list[i](nodes, name, args);
+			// Fix invalid children or report invalid children in a contextual parsing
+			if (validate && invalidChildren.length) {
+				if (!args.context)
+					fixInvalidChildren(invalidChildren);
+				else
+					args.invalid = true;
 			}
 
-			// Run attribute filters
-			for (i = 0, l = attributeFilters.length; i < l; i++) {
-				list = attributeFilters[i];
-
-				if (list.name in matchedAttributes) {
-					nodes = matchedAttributes[list.name];
+			// Wrap nodes in the root into block elements if the root is body
+			if (rootBlockName && rootNode.name == 'body')
+				addRootBlocks();
+
+			// Run filters only when the contents is valid
+			if (!args.invalid) {
+				// Run node filters
+				for (name in matchedNodes) {
+					list = nodeFilters[name];
+					nodes = matchedNodes[name];
 
 					// Remove already removed children
 					fi = nodes.length;
@@ -2919,8 +3203,27 @@
 							nodes.splice(fi, 1);
 					}
 
-					for (fi = 0, fl = list.callbacks.length; fi < fl; fi++)
-						list.callbacks[fi](nodes, list.name, args);
+					for (i = 0, l = list.length; i < l; i++)
+						list[i](nodes, name, args);
+				}
+
+				// Run attribute filters
+				for (i = 0, l = attributeFilters.length; i < l; i++) {
+					list = attributeFilters[i];
+
+					if (list.name in matchedAttributes) {
+						nodes = matchedAttributes[list.name];
+
+						// Remove already removed children
+						fi = nodes.length;
+						while (fi--) {
+							if (!nodes[fi].parent)
+								nodes.splice(fi, 1);
+						}
+
+						for (fi = 0, fl = list.callbacks.length; fi < fl; fi++)
+							list.callbacks[fi](nodes, list.name, args);
+					}
 				}
 			}
 
@@ -2935,6 +3238,9 @@
 				var i, l = nodes.length, node, blockElements = schema.getBlockElements(),
 					nonEmptyElements = schema.getNonEmptyElements(), parent, prev, prevName;
 
+				// Remove brs from body element as well
+				blockElements.body = 1;
+
 				// Must loop forwards since it will otherwise remove all brs in <p>a<br><br><br></p>
 				for (i = 0; i < l; i++) {
 					node = nodes[i];
@@ -2971,11 +3277,13 @@
 								elementRule = schema.getElementRule(parent.name);
 
 								// Remove or padd the element depending on schema rule
-								if (elementRule.removeEmpty)
-									parent.remove();
-								else if (elementRule.paddEmpty) 
-									parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0';
-							}
+								if (elementRule) {
+								  if (elementRule.removeEmpty)
+									  parent.remove();
+								  else if (elementRule.paddEmpty)
+									  parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0';
+							  }
+              }
 						}
 					}
 				}
@@ -3019,8 +3327,12 @@
 			else
 				html[html.length] = ' />';
 
-			/*if (indent && indentAfter[name])
-				html.push('\n');*/
+			if (empty && indent && indentAfter[name] && html.length > 0) {
+				value = html[html.length - 1];
+
+				if (value.length > 0 && value !== '\n')
+					html.push('\n');
+			}
 		},
 
 		end: function(name) {
@@ -3061,10 +3373,13 @@
 				html.push('<?', name, ' ', text, '?>');
 			else
 				html.push('<?', name, '?>');
+
+			if (indent)
+				html.push('\n');
 		},
 
 		doctype: function(text) {
-			html.push('<!DOCTYPE', text, '>');
+			html.push('<!DOCTYPE', text, '>', indent ? '\n' : '');
 		},
 
 		reset: function() {
@@ -3201,7 +3516,8 @@
 		isIE = tinymce.isIE,
 		Entities = tinymce.html.Entities,
 		simpleSelectorRe = /^([a-z0-9],?)+$/i,
-		blockElementsMap = tinymce.html.Schema.blockElementsMap;
+		blockElementsMap = tinymce.html.Schema.blockElementsMap,
+		whiteSpaceRegExp = /^[ \t\r\n]*$/;
 
 	tinymce.create('tinymce.dom.DOMUtils', {
 		doc : null,
@@ -3224,7 +3540,7 @@
 		},
 
 		DOMUtils : function(d, s) {
-			var t = this, globalStyle;
+			var t = this, globalStyle, name;
 
 			t.doc = d;
 			t.win = window;
@@ -3239,7 +3555,8 @@
 				keep_values : false,
 				hex_colors : 1
 			}, s);
-
+			
+			t.schema = s.schema;
 			t.styles = new tinymce.html.Styles({
 				url_converter : s.url_converter,
 				url_converter_scope : s.url_converter_scope
@@ -3254,7 +3571,7 @@
 				}
 			}
 
-			if (isIE) {
+			if (isIE && s.schema) {
 				// Add missing HTML 4/5 elements to IE
 				('abbr article aside audio canvas ' +
 				'details figcaption figure footer ' +
@@ -3263,6 +3580,11 @@
 				'time video').replace(/\w+/g, function(name) {
 					d.createElement(name);
 				});
+
+				// Create all custom elements
+				for (name in s.schema.getCustomElements()) {
+					d.createElement(name);
+				}
 			}
 
 			tinymce.addUnload(t.destroy, t);
@@ -3469,9 +3791,7 @@
 
 		remove : function(node, keep_children) {
 			return this.run(node, function(node) {
-				var parent, child;
-
-				parent = node.parentNode;
+				var child, parent = node.parentNode;
 
 				if (!parent)
 					return null;
@@ -3539,7 +3859,7 @@
 			n = this.get(n);
 
 			if (!n)
-				return false;
+				return;
 
 			// Gecko
 			if (this.doc.defaultView && c) {
@@ -3568,7 +3888,7 @@
 			if (n.currentStyle && c)
 				return n.currentStyle[na];
 
-			return n.style[na];
+			return n.style ? n.style[na] : undefined;
 		},
 
 		setStyles : function(e, o) {
@@ -3589,8 +3909,8 @@
 
 		removeAllAttribs: function(e) {
 			return this.run(e, function(e) {
-				var attrs = e.attributes;
-				for (var i = attrs.length - 1; i >= 0; i--) {
+				var i, attrs = e.attributes;
+				for (i = attrs.length - 1; i >= 0; i--) {
 					e.removeAttributeNode(attrs.item(i));
 				}
 			});
@@ -3609,48 +3929,48 @@
 
 			return this.run(e, function(e) {
 				var s = t.settings;
+				if (v !== null) {
+					switch (n) {
+						case "style":
+							if (!is(v, 'string')) {
+								each(v, function(v, n) {
+									t.setStyle(e, n, v);
+								});
 
-				switch (n) {
-					case "style":
-						if (!is(v, 'string')) {
-							each(v, function(v, n) {
-								t.setStyle(e, n, v);
-							});
+								return;
+							}
 
-							return;
-						}
+							// 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('data-mce-style', v, 2);
+								else
+									e.removeAttribute('data-mce-style', 2);
+							}
 
-						// 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('data-mce-style', v, 2);
-							else
-								e.removeAttribute('data-mce-style', 2);
-						}
+							e.style.cssText = v;
+							break;
 
-						e.style.cssText = v;
-						break;
+						case "class":
+							e.className = v || ''; // Fix IE null bug
+							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);
 
-					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, 'data-mce-' + n, v, 2);
+							}
 
-							t.setAttrib(e, 'data-mce-' + n, v, 2);
-						}
+							break;
 
-						break;
-					
-					case "shape":
-						e.setAttribute('data-mce-style', v);
-						break;
+						case "shape":
+							e.setAttribute('data-mce-style', v);
+							break;
+					}
 				}
-
 				if (is(v) && v !== null && v.length !== 0)
 					e.setAttribute(n, '' + v, 2);
 				else
@@ -3669,12 +3989,12 @@
 		},
 
 		getAttrib : function(e, n, dv) {
-			var v, t = this;
+			var v, t = this, undef;
 
 			e = t.get(e);
 
 			if (!e || e.nodeType !== 1)
-				return false;
+				return dv === undef ? false : dv;
 
 			if (!is(dv))
 				dv = '';
@@ -3786,7 +4106,7 @@
 				}
 			}
 
-			return (v !== undefined && v !== null && v !== '') ? '' + v : dv;
+			return (v !== undef && v !== null && v !== '') ? '' + v : dv;
 		},
 
 		getPos : function(n, ro) {
@@ -3796,14 +4116,17 @@
 			ro = ro || d.body;
 
 			if (n) {
-				// Use getBoundingClientRect on IE, Opera has it but it's not perfect
-				if (isIE && !t.stdMode) {
+				// Use getBoundingClientRect if it exists since it's faster than looping offset nodes
+				if (n.getBoundingClientRect) {
 					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;
 
-					return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x};
+					// Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit
+					// Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position
+					x = n.left + (d.documentElement.scrollLeft || d.body.scrollLeft) - e.clientTop;
+					y = n.top + (d.documentElement.scrollTop || d.body.scrollTop) - e.clientLeft;
+
+					return {x : x, y : y};
 				}
 
 				r = n;
@@ -4257,6 +4580,53 @@
 			return n.attributes;
 		},
 
+		isEmpty : function(node, elements) {
+			var self = this, i, attributes, type, walker, name, parentNode;
+
+			node = node.firstChild;
+			if (node) {
+				walker = new tinymce.dom.TreeWalker(node);
+				elements = elements || self.schema ? self.schema.getNonEmptyElements() : null;
+
+				do {
+					type = node.nodeType;
+
+					if (type === 1) {
+						// Ignore bogus elements
+						if (node.getAttribute('data-mce-bogus'))
+							continue;
+
+						// Keep empty elements like <img />
+						name = node.nodeName.toLowerCase();
+						if (elements && elements[name]) {
+							// Ignore single BR elements in blocks like <p><br /></p>
+							parentNode = node.parentNode;
+							if (name === 'br' && self.isBlock(parentNode) && parentNode.firstChild === node && parentNode.lastChild === node) {
+								continue;
+							}
+
+							return false;
+						}
+
+						// Keep elements with data-bookmark attributes or name attribute like <a name="1"></a>
+						attributes = self.getAttribs(node);
+						i = node.attributes.length;
+						while (i--) {
+							name = node.attributes[i].nodeName;
+							if (name === "name" || name === 'data-mce-bookmark')
+								return false;
+						}
+					}
+
+					// Keep non whitespace text nodes
+					if ((type === 3 && !whiteSpaceRegExp.test(node.nodeValue)))
+						return false;
+				} while (node = walker.next());
+			}
+
+			return true;
+		},
+
 		destroy : function(s) {
 			var t = this;
 
@@ -4277,7 +4647,7 @@
 		},
 
 		nodeIndex : function(node, normalized) {
-			var idx = 0, lastNodeType, lastNode, nodeType, nodeValueExists;
+			var idx = 0, lastNodeType, lastNode, nodeType;
 
 			if (node) {
 				for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) {
@@ -4285,11 +4655,7 @@
 
 					// Normalize text nodes
 					if (normalized && nodeType == 3) {
-						// ensure that text nodes that have been removed are handled correctly in Internet Explorer.
-						// (the nodeValue attribute will not exist, and will error here).
-						nodeValueExists = false;
-						try {nodeValueExists = node.nodeValue.length} catch (c) {}
-						if (nodeType == lastNodeType || !nodeValueExists)
+						if (nodeType == lastNodeType || !node.nodeValue.length)
 							continue;
 					}
 					idx++;
@@ -4312,23 +4678,21 @@
 			// this function will then trim of empty edges and produce:
 			//   <p>text 1</p><b>CHOP</b><p>text 2</p>
 			function trim(node) {
-				var i, children = node.childNodes;
+				var i, children = node.childNodes, type = node.nodeType;
 
-				if (node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark')
+				if (type == 1 && node.getAttribute('data-mce-type') == 'bookmark')
 					return;
 
 				for (i = children.length - 1; i >= 0; i--)
 					trim(children[i]);
 
-				if (node.nodeType != 9) {
+				if (type != 9) {
 					// Keep non whitespace text nodes
-					if (node.nodeType == 3 && node.nodeValue.length > 0) {
+					if (type == 3 && node.nodeValue.length > 0) {
 						// If parent element isn't a block or there isn't any useful contents for example "<p>   </p>"
 						if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0)
 							return;
-					}
-
-					if (node.nodeType == 1) {
+					} else if (type == 1) {
 						// If the only child is a bookmark then move it up
 						children = node.childNodes;
 						if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark')
@@ -5134,124 +5498,357 @@
 
 (function() {
 	function Selection(selection) {
-		var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false;
+		var self = this, dom = selection.dom, TRUE = true, FALSE = false;
 
-		// Returns a W3C DOM compatible range object by using the IE Range API
-		function getRange() {
-			var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed;
+		function getPosition(rng, start) {
+			var checkRng, startIndex = 0, endIndex, inside,
+				children, child, offset, index, position = -1, parent;
+
+			// Setup test range, collapse it and get the parent
+			checkRng = rng.duplicate();
+			checkRng.collapse(start);
+			parent = checkRng.parentElement();
 
-			// If selection is outside the current document just return an empty range
-			element = ieRange.item ? ieRange.item(0) : ieRange.parentElement();
-			if (element.ownerDocument != dom.doc)
-				return domRange;
+			// Check if the selection is within the right document
+			if (parent.ownerDocument !== selection.dom.doc)
+				return;
 
-			collapsed = selection.isCollapsed();
+			// IE will report non editable elements as it's parent so look for an editable one
+			while (parent.contentEditable === "false") {
+				parent = parent.parentNode;
+			}
 
-			// Handle control selection or text selection of a image
-			if (ieRange.item || !element.hasChildNodes()) {
-				if (collapsed) {
-					domRange.setStart(element, 0);
-					domRange.setEnd(element, 0);
+			// If parent doesn't have any children then return that we are inside the element
+			if (!parent.hasChildNodes()) {
+				return {node : parent, inside : 1};
+			}
+
+			// Setup node list and endIndex
+			children = parent.children;
+			endIndex = children.length - 1;
+
+			// Perform a binary search for the position
+			while (startIndex <= endIndex) {
+				index = Math.floor((startIndex + endIndex) / 2);
+
+				// Move selection to node and compare the ranges
+				child = children[index];
+				checkRng.moveToElementText(child);
+				position = checkRng.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', rng);
+
+				// Before/after or an exact match
+				if (position > 0) {
+					endIndex = index - 1;
+				} else if (position < 0) {
+					startIndex = index + 1;
 				} else {
-					domRange.setStart(element.parentNode, dom.nodeIndex(element));
-					domRange.setEnd(domRange.startContainer, domRange.startOffset + 1);
+					return {node : child};
+				}
+			}
+
+			// Check if child position is before or we didn't find a position
+			if (position < 0) {
+				// No element child was found use the parent element and the offset inside that
+				if (!child) {
+					checkRng.moveToElementText(parent);
+					checkRng.collapse(true);
+					child = parent;
+					inside = true;
+				} else
+					checkRng.collapse(false);
+
+				checkRng.setEndPoint(start ? 'EndToStart' : 'EndToEnd', rng);
+
+				// Fix for edge case: <div style="width: 100px; height:100px;"><table>..</table>ab|c</div>
+				if (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) > 0) {
+					checkRng = rng.duplicate();
+					checkRng.collapse(start);
+
+					offset = -1;
+					while (parent == checkRng.parentElement()) {
+						if (checkRng.move('character', -1) == 0)
+							break;
+
+						offset++;
+					}
 				}
 
+				offset = offset || checkRng.text.replace('\r\n', ' ').length;
+			} else {
+				// Child position is after the selection endpoint
+				checkRng.collapse(true);
+				checkRng.setEndPoint(start ? 'StartToStart' : 'StartToEnd', rng);
+
+				// Get the length of the text to find where the endpoint is relative to it's container
+				offset = checkRng.text.replace('\r\n', ' ').length;
+			}
+
+			return {node : child, position : position, offset : offset, inside : inside};
+		};
+
+		// Returns a W3C DOM compatible range object by using the IE Range API
+		function getRange() {
+			var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail;
+
+			// If selection is outside the current document just return an empty range
+			element = ieRange.item ? ieRange.item(0) : ieRange.parentElement();
+			if (element.ownerDocument != dom.doc)
+				return domRange;
+
+			collapsed = selection.isCollapsed();
+
+			// Handle control selection
+			if (ieRange.item) {
+				domRange.setStart(element.parentNode, dom.nodeIndex(element));
+				domRange.setEnd(domRange.startContainer, domRange.startOffset + 1);
+
 				return domRange;
 			}
 
 			function findEndPoint(start) {
-				var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position;
-
-				// Setup temp range and collapse it
-				checkRng = ieRange.duplicate();
-				checkRng.collapse(start);
+				var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue;
 
-				// Create marker and insert it at the end of the endpoints parent
-				marker = dom.create('a');
-				parent = checkRng.parentElement();
+				container = endPoint.node;
+				offset = endPoint.offset;
 
-				// If parent doesn't have any children then set the container to that parent and the index to 0
-				if (!parent.hasChildNodes()) {
-					domRange[start ? 'setStart' : 'setEnd'](parent, 0);
+				if (endPoint.inside && !container.hasChildNodes()) {
+					domRange[start ? 'setStart' : 'setEnd'](container, 0);
 					return;
 				}
 
-				parent.appendChild(marker);
-				checkRng.moveToElementText(marker);
-				position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng);
-				if (position > 0) {
-					// The position is after the end of the parent element.
-					// This is the case where IE puts the caret to the left edge of a table.
-					domRange[start ? 'setStartAfter' : 'setEndAfter'](parent);
-					dom.remove(marker);
+				if (offset === undef) {
+					domRange[start ? 'setStartBefore' : 'setEndAfter'](container);
 					return;
 				}
 
-				// Setup node list and endIndex
-				nodes = tinymce.grep(parent.childNodes);
-				endIndex = nodes.length - 1;
-				// Perform a binary search for the position
-				while (startIndex <= endIndex) {
-					index = Math.floor((startIndex + endIndex) / 2);
-
-					// Insert marker and check it's position relative to the selection
-					parent.insertBefore(marker, nodes[index]);
-					checkRng.moveToElementText(marker);
-					position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng);
-					if (position > 0) {
-						// Marker is to the right
-						startIndex = index + 1;
-					} else if (position < 0) {
-						// Marker is to the left
-						endIndex = index - 1;
-					} else {
-						// Maker is where we are
-						found = true;
-						break;
+				if (endPoint.position < 0) {
+					sibling = endPoint.inside ? container.firstChild : container.nextSibling;
+
+					if (!sibling) {
+						domRange[start ? 'setStartAfter' : 'setEndAfter'](container);
+						return;
 					}
-				}
 
-				// Setup container
-				container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling;
+					if (!offset) {
+						if (sibling.nodeType == 3)
+							domRange[start ? 'setStart' : 'setEnd'](sibling, 0);
+						else
+							domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling);
 
-				// Handle element selection
-				if (container.nodeType == 1) {
-					dom.remove(marker);
+						return;
+					}
 
-					// Find offset and container
-					offset = dom.nodeIndex(container);
-					container = container.parentNode;
+					// Find the text node and offset
+					while (sibling) {
+						nodeValue = sibling.nodeValue;
+						textNodeOffset += nodeValue.length;
+
+						// We are at or passed the position we where looking for
+						if (textNodeOffset >= offset) {
+							container = sibling;
+							textNodeOffset -= offset;
+							textNodeOffset = nodeValue.length - textNodeOffset;
+							break;
+						}
 
-					// Move the offset if we are setting the end or the position is after an element
-					if (!start || index > 0)
-						offset++;
+						sibling = sibling.nextSibling;
+					}
 				} else {
-					// Calculate offset within text node
-					if (position > 0 || index == 0) {
-						checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange);
-						offset = checkRng.text.length;
-					} else {
-						checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange);
-						offset = container.nodeValue.length - checkRng.text.length;
+					// Find the text node and offset
+					sibling = container.previousSibling;
+
+					if (!sibling)
+						return domRange[start ? 'setStartBefore' : 'setEndBefore'](container);
+
+					// If there isn't any text to loop then use the first position
+					if (!offset) {
+						if (container.nodeType == 3)
+							domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length);
+						else
+							domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling);
+
+						return;
 					}
 
-					dom.remove(marker);
+					while (sibling) {
+						textNodeOffset += sibling.nodeValue.length;
+
+						// We are at or passed the position we where looking for
+						if (textNodeOffset >= offset) {
+							container = sibling;
+							textNodeOffset -= offset;
+							break;
+						}
+
+						sibling = sibling.previousSibling;
+					}
 				}
 
-				domRange[start ? 'setStart' : 'setEnd'](container, offset);
+				domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset);
 			};
 
-			// Find start point
-			findEndPoint(true);
+			try {
+				// Find start point
+				findEndPoint(true);
 
-			// Find end point if needed
-			if (!collapsed)
-				findEndPoint();
+				// Find end point if needed
+				if (!collapsed)
+					findEndPoint();
+			} catch (ex) {
+				// IE has a nasty bug where text nodes might throw "invalid argument" when you
+				// access the nodeValue or other properties of text nodes. This seems to happend when
+				// text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it.
+				if (ex.number == -2147024809) {
+					// Get the current selection
+					bookmark = self.getBookmark(2);
+
+					// Get start element
+					tmpRange = ieRange.duplicate();
+					tmpRange.collapse(true);
+					element = tmpRange.parentElement();
+
+					// Get end element
+					if (!collapsed) {
+						tmpRange = ieRange.duplicate();
+						tmpRange.collapse(false);
+						element2 = tmpRange.parentElement();
+						element2.innerHTML = element2.innerHTML;
+					}
+
+					// Remove the broken elements
+					element.innerHTML = element.innerHTML;
+
+					// Restore the selection
+					self.moveToBookmark(bookmark);
+
+					// Since the range has moved we need to re-get it
+					ieRange = selection.getRng();
+
+					// Find start point
+					findEndPoint(true);
+
+					// Find end point if needed
+					if (!collapsed)
+						findEndPoint();
+				} else
+					throw ex; // Throw other errors
+			}
 
 			return domRange;
 		};
 
+		this.getBookmark = function(type) {
+			var rng = selection.getRng(), start, end, bookmark = {};
+
+			function getIndexes(node) {
+				var node, parent, root, children, i, indexes = [];
+
+				parent = node.parentNode;
+				root = dom.getRoot().parentNode;
+
+				while (parent != root && parent.nodeType !== 9) {
+					children = parent.children;
+
+					i = children.length;
+					while (i--) {
+						if (node === children[i]) {
+							indexes.push(i);
+							break;
+						}
+					}
+
+					node = parent;
+					parent = parent.parentNode;
+				}
+
+				return indexes;
+			};
+
+			function getBookmarkEndPoint(start) {
+				var position;
+
+				position = getPosition(rng, start);
+				if (position) {
+					return {
+						position : position.position,
+						offset : position.offset,
+						indexes : getIndexes(position.node),
+						inside : position.inside
+					};
+				}
+			};
+
+			// Non ubstructive bookmark
+			if (type === 2) {
+				// Handle text selection
+				if (!rng.item) {
+					bookmark.start = getBookmarkEndPoint(true);
+
+					if (!selection.isCollapsed())
+						bookmark.end = getBookmarkEndPoint();
+				} else
+					bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))};
+			}
+
+			return bookmark;
+		};
+
+		this.moveToBookmark = function(bookmark) {
+			var rng, body = dom.doc.body;
+
+			function resolveIndexes(indexes) {
+				var node, i, idx, children;
+
+				node = dom.getRoot();
+				for (i = indexes.length - 1; i >= 0; i--) {
+					children = node.children;
+					idx = indexes[i];
+
+					if (idx <= children.length - 1) {
+						node = children[idx];
+					}
+				}
+
+				return node;
+			};
+			
+			function setBookmarkEndPoint(start) {
+				var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef;
+
+				if (endPoint) {
+					moveLeft = endPoint.position > 0;
+
+					moveRng = body.createTextRange();
+					moveRng.moveToElementText(resolveIndexes(endPoint.indexes));
+
+					offset = endPoint.offset;
+					if (offset !== undef) {
+						moveRng.collapse(endPoint.inside || moveLeft);
+						moveRng.moveStart('character', moveLeft ? -offset : offset);
+					} else
+						moveRng.collapse(start);
+
+					rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng);
+
+					if (start)
+						rng.collapse(true);
+				}
+			};
+
+			if (bookmark.start) {
+				if (bookmark.start.ctrl) {
+					rng = body.createControlRange();
+					rng.addElement(resolveIndexes(bookmark.start.indexes));
+					rng.select();
+				} else {
+					rng = body.createTextRange();
+					setBookmarkEndPoint(true);
+					setBookmarkEndPoint();
+					rng.select();
+				}
+			}
+		};
+
 		this.addRange = function(rng) {
 			var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body;
 
@@ -5287,7 +5884,7 @@
 						tmpRng.moveToElementText(marker);
 					} else {
 						// Empty node selection for example <div>|</div>
-						marker = doc.createTextNode(invisibleChar);
+						marker = doc.createTextNode('\uFEFF');
 						container.appendChild(marker);
 						tmpRng.moveToElementText(marker.parentNode);
 						tmpRng.collapse(TRUE);
@@ -5298,9 +5895,6 @@
 				}
 			}
 
-			// Destroy cached range
-			this.destroy();
-
 			// Setup some shorter versions
 			startContainer = rng.startContainer;
 			startOffset = rng.startOffset;
@@ -5330,33 +5924,8 @@
 			ieRng.select();
 		};
 
-		this.getRangeAt = function() {
-			// Setup new range if the cache is empty
-			if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) {
-				range = getRange();
-
-				// Store away text range for next call
-				lastIERng = selection.getRng();
-			}
-
-			// IE will say that the range is equal then produce an invalid argument exception
-			// if you perform specific operations in a keyup event. For example Ctrl+Del.
-			// This hack will invalidate the range cache if the exception occurs
-			try {
-				range.startContainer.nextSibling;
-			} catch (ex) {
-				range = getRange();
-				lastIERng = null;
-			}
-
-			// Return cached range
-			return range;
-		};
-
-		this.destroy = function() {
-			// Destroy cached range and last IE range to avoid memory leaks
-			lastIERng = range = null;
-		};
+		// Expose range method
+		this.getRangeAt = getRange;
 	};
 
 	// Expose the selection object
@@ -6675,7 +7244,7 @@
 							return;
 
 						try {
-							// If IE is used, use the trick by Diego Perini
+							// If IE is used, use the trick by Diego Perini licensed under MIT by request to the author.
 							// http://javascript.nwbox.com/IEContentLoaded/
 							doc.documentElement.doScroll("left");
 						} catch (ex) {
@@ -6867,6 +7436,13 @@
 			tinymce.addUnload(t.destroy, t);
 		},
 
+		setCursorLocation: function(node, offset) {
+			var t = this; var r = t.dom.createRng();
+			r.setStart(node, offset);
+			r.setEnd(node, offset);
+			t.setRng(r);
+			t.collapse(false);
+		},
 		getContent : function(s) {
 			var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n;
 
@@ -6874,6 +7450,7 @@
 			wb = wa = '';
 			s.get = true;
 			s.format = s.format || 'html';
+			s.forced_root_block = '';
 			t.onBeforeGetContent.dispatch(t, s);
 
 			if (s.format == 'text')
@@ -6884,9 +7461,13 @@
 
 				if (n)
 					e.appendChild(n);
-			} else if (is(r.item) || is(r.htmlText))
-				e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
-			else
+			} else if (is(r.item) || is(r.htmlText)) {
+				// IE will produce invalid markup if elements are present that
+				// it doesn't understand like custom elements or HTML5 elements.
+				// Adding a BR in front of the contents and then remoiving it seems to fix it though.
+				e.innerHTML = '<br>' + (r.item ? r.item(0).outerHTML : r.htmlText);
+				e.removeChild(e.firstChild);
+			} else
 				e.innerHTML = r.toString();
 
 			// Keep whitespace before and after
@@ -6958,7 +7539,12 @@
 
 				// Remove the caret position
 				self.dom.remove('__caret');
-				self.setRng(rng);
+
+				try {
+					self.setRng(rng);
+				} catch (ex) {
+					// Might fail on Opera for some odd reason
+				}
 			} else {
 				if (rng.item) {
 					// Delete content and get caret text selection
@@ -6966,7 +7552,12 @@
 					rng = self.getRng();
 				}
 
-				rng.pasteHTML(content);
+				// Explorer removes spaces from the beginning of pasted contents
+				if (/^\s+/.test(content)) {
+					rng.pasteHTML('<span id="__mce_tmp">_</span>' + content);
+					self.dom.remove('__mce_tmp');
+				} else
+					rng.pasteHTML(content);
 			}
 
 			// Dispatch set content event
@@ -7094,6 +7685,9 @@
 					return bookmark;
 				};
 
+				if (t.tridentSel)
+					return t.tridentSel.getBookmark(type);
+
 				return getLocation();
 			}
 
@@ -7166,10 +7760,6 @@
 		moveToBookmark : function(bookmark) {
 			var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset;
 
-			// Clear selection cache
-			if (t.tridentSel)
-				t.tridentSel.destroy();
-
 			if (bookmark) {
 				if (bookmark.start) {
 					rng = dom.createRng();
@@ -7209,6 +7799,9 @@
 						return true;
 					};
 
+					if (t.tridentSel)
+						return t.tridentSel.moveToBookmark(bookmark);
+
 					if (setEndPoint(true) && setEndPoint()) {
 						t.setRng(rng);
 					}
@@ -7428,7 +8021,13 @@
 
 				if (s) {
 					t.explicitRange = r;
-					s.removeAllRanges();
+
+					try {
+						s.removeAllRanges();
+					} catch (ex) {
+						// IE9 might throw errors here don't know why
+					}
+
 					s.addRange(r);
 					t.selectedRange = s.getRangeAt(0);
 				}
@@ -7526,7 +8125,8 @@
 			if (sb && eb && sb != eb) {
 				n = sb;
 
-				while ((n = n.nextSibling) && n != eb) {
+				var walker = new tinymce.dom.TreeWalker(sb, dom.getRoot());
+				while ((n = walker.next()) && n != eb) {
 					if (dom.isBlock(n))
 						bl.push(n);
 				}
@@ -7538,14 +8138,84 @@
 			return bl;
 		},
 
+		normalize : function() {
+			var self = this, rng, normalized;
+
+			// Normalize only on non IE browsers for now
+			if (tinymce.isIE)
+				return;
+
+			function normalizeEndPoint(start) {
+				var container, offset, walker, dom = self.dom, body = dom.getRoot(), node;
+
+				container = rng[(start ? 'start' : 'end') + 'Container'];
+				offset = rng[(start ? 'start' : 'end') + 'Offset'];
+
+				// If the container is a document move it to the body element
+				if (container.nodeType === 9) {
+					container = container.body;
+					offset = 0;
+				}
+
+				// If the container is body try move it into the closest text node or position
+				// TODO: Add more logic here to handle element selection cases
+				if (container === body) {
+					// Resolve the index
+					if (container.hasChildNodes()) {
+						container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)];
+						offset = 0;
+
+						// Don't walk into elements that doesn't have any child nodes like a IMG
+						if (container.hasChildNodes()) {
+							// Walk the DOM to find a text node to place the caret at or a BR
+							node = container;
+							walker = new tinymce.dom.TreeWalker(container, body);
+							do {
+								// Found a text node use that position
+								if (node.nodeType === 3) {
+									offset = start ? 0 : node.nodeValue.length - 1;
+									container = node;
+									break;
+								}
+
+								// Found a BR element that we can place the caret before
+								if (node.nodeName === 'BR') {
+									offset = dom.nodeIndex(node);
+									container = node.parentNode;
+									break;
+								}
+							} while (node = (start ? walker.next() : walker.prev()));
+
+							normalized = true;
+						}
+					}
+				}
+
+				// Set endpoint if it was normalized
+				if (normalized)
+					rng['set' + (start ? 'Start' : 'End')](container, offset);
+			};
+
+			rng = self.getRng();
+
+			// Normalize the end points
+			normalizeEndPoint(true);
+			
+			if (rng.collapsed)
+				normalizeEndPoint();
+
+			// Set the selection if it was normalized
+			if (normalized) {
+				//console.log(self.dom.dumpRng(rng));
+				self.setRng(rng);
+			}
+		},
+
 		destroy : function(s) {
 			var t = this;
 
 			t.win = null;
 
-			if (t.tridentSel)
-				t.tridentSel.destroy();
-
 			// Manual destroy then remove unload handler
 			if (!s)
 				tinymce.removeUnload(t.destroy);
@@ -7811,7 +8481,7 @@
 
 				// Explorer won't clone contents of script and style and the
 				// selected index of select elements are cleared on a clone operation.
-				if (isIE && dom.select('script,style,select').length > 0) {
+				if (isIE && dom.select('script,style,select,map').length > 0) {
 					content = node.innerHTML;
 					node = node.cloneNode(false);
 					dom.setHTML(node, content);
@@ -7860,6 +8530,10 @@
 					htmlParser.parse(args.getInner ? node.innerHTML : tinymce.trim(dom.getOuterHTML(node), args), args)
 				);
 
+				// Replace all BOM characters for now until we can find a better solution
+				if (!args.cleanup)
+					args.content = args.content.replace(/\uFEFF|\u200B/g, '');
+
 				// Post process
 				if (!args.no_events)
 					onPostProcess.dispatch(self, args);
@@ -8152,6 +8826,24 @@
 				return;
 			}
 
+			function exclude(nodes) {
+				var node;
+
+				// First node is excluded
+				node = nodes[0];
+				if (node.nodeType === 3 && node === startContainer && startOffset >= node.nodeValue.length) {
+					nodes.splice(0, 1);
+				}
+
+				// Last node is excluded
+				node = nodes[nodes.length - 1];
+				if (endOffset === 0 && nodes.length > 0 && node === endContainer && node.nodeType === 3) {
+					nodes.splice(nodes.length - 1, 1);
+				}
+
+				return nodes;
+			};
+
 			function collectSiblings(node, name, end_node) {
 				var siblings = [];
 
@@ -8181,7 +8873,7 @@
 						if (!next)
 							siblings.reverse();
 
-						callback(siblings);
+						callback(exclude(siblings));
 					}
 				}
 			};
@@ -8194,28 +8886,28 @@
 			if (endContainer.nodeType == 1 && endContainer.hasChildNodes())
 				endContainer = endContainer.childNodes[Math.min(endOffset - 1, endContainer.childNodes.length - 1)];
 
-			// Find common ancestor and end points
-			ancestor = dom.findCommonAncestor(startContainer, endContainer);
-
 			// Same container
 			if (startContainer == endContainer)
-				return callback([startContainer]);
+				return callback(exclude([startContainer]));
 
+			// Find common ancestor and end points
+			ancestor = dom.findCommonAncestor(startContainer, endContainer);
+				
 			// Process left side
 			for (node = startContainer; node; node = node.parentNode) {
-				if (node == endContainer)
+				if (node === endContainer)
 					return walkBoundary(startContainer, ancestor, true);
 
-				if (node == ancestor)
+				if (node === ancestor)
 					break;
 			}
 
 			// Process right side
 			for (node = endContainer; node; node = node.parentNode) {
-				if (node == startContainer)
+				if (node === startContainer)
 					return walkBoundary(endContainer, ancestor);
 
-				if (node == ancestor)
+				if (node === ancestor)
 					break;
 			}
 
@@ -8234,48 +8926,46 @@
 			);
 
 			if (siblings.length)
-				callback(siblings);
+				callback(exclude(siblings));
 
 			// Walk right leaf
 			walkBoundary(endContainer, endPoint);
 		};
 
-		/*		this.split = function(rng) {
+		this.split = function(rng) {
 			var startContainer = rng.startContainer,
 				startOffset = rng.startOffset,
 				endContainer = rng.endContainer,
 				endOffset = rng.endOffset;
 
 			function splitText(node, offset) {
-				if (offset == node.nodeValue.length)
-					node.appendData(INVISIBLE_CHAR);
-
-				node = node.splitText(offset);
-
-				if (node.nodeValue === INVISIBLE_CHAR)
-					node.nodeValue = '';
-
-				return node;
+				return node.splitText(offset);
 			};
 
 			// Handle single text node
-			if (startContainer == endContainer) {
-				if (startContainer.nodeType == 3) {
-					if (startOffset != 0)
-						startContainer = endContainer = splitText(startContainer, startOffset);
-
-					if (endOffset - startOffset != startContainer.nodeValue.length)
-						splitText(startContainer, endOffset - startOffset);
+			if (startContainer == endContainer && startContainer.nodeType == 3) {
+				if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+					endContainer = splitText(startContainer, startOffset);
+					startContainer = endContainer.previousSibling;
+
+					if (endOffset > startOffset) {
+						endOffset = endOffset - startOffset;
+						startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;
+						endOffset = endContainer.nodeValue.length;
+						startOffset = 0;
+					} else {
+						endOffset = 0;
+					}
 				}
 			} else {
 				// Split startContainer text node if needed
-				if (startContainer.nodeType == 3 && startOffset != 0) {
+				if (startContainer.nodeType == 3 && startOffset > 0 && startOffset < startContainer.nodeValue.length) {
 					startContainer = splitText(startContainer, startOffset);
 					startOffset = 0;
 				}
 
 				// Split endContainer text node if needed
-				if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) {
+				if (endContainer.nodeType == 3 && endOffset > 0 && endOffset < endContainer.nodeValue.length) {
 					endContainer = splitText(endContainer, endOffset).previousSibling;
 					endOffset = endContainer.nodeValue.length;
 				}
@@ -8288,7 +8978,7 @@
 				endOffset : endOffset
 			};
 		};
-*/
+
 	};
 
 	tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) {
@@ -8458,6 +9148,7 @@
 		}
 	});
 })(tinymce);
+
 (function(tinymce) {
 	// Shorten class names
 	var DOM = tinymce.DOM, is = tinymce.is;
@@ -9089,8 +9780,7 @@
 
 			l = DOM.encode(s.label || '');
 			h = '<a role="button" id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" aria-labelledby="' + this.id + '_voice" title="' + DOM.encode(s.title) + '">';
-
-			if (s.image)
+			if (s.image && !(this.editor  &&this.editor.forcedHighContrastMode) )
 				h += '<img class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '" />' + l;
 			else
 				h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');
@@ -9165,20 +9855,23 @@
 		},
 
 		selectByIndex : function(idx) {
-			var t = this, e, o;
+			var t = this, e, o, label;
 
 			if (idx != t.selectedIndex) {
 				e = DOM.get(t.id + '_text');
+				label = DOM.get(t.id + '_voiceDesc');
 				o = t.items[idx];
 
 				if (o) {
 					t.selectedValue = o.value;
 					t.selectedIndex = idx;
 					DOM.setHTML(e, DOM.encode(o.title));
+					DOM.setHTML(label, t.settings.title + " - " + o.title);
 					DOM.removeClass(e, 'mceTitle');
 					DOM.setAttrib(t.id, 'aria-valuenow', o.title);
 				} else {
 					DOM.setHTML(e, DOM.encode(t.settings.title));
+					DOM.setHTML(label, DOM.encode(t.settings.title));
 					DOM.addClass(e, 'mceTitle');
 					t.selectedValue = t.selectedIndex = null;
 					DOM.setAttrib(t.id, 'aria-valuenow', t.settings.title);
@@ -9207,7 +9900,7 @@
 		renderHTML : function() {
 			var h = '', t = this, s = t.settings, cp = t.classPrefix;
 
-			h = '<span role="button" aria-haspopup="true" aria-labelledby="' + t.id +'_text" aria-describedby="' + t.id + '_voiceDesc"><table role="presentation" tabindex="0" id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>';
+			h = '<span role="listbox" aria-haspopup="true" aria-labelledby="' + t.id +'_voiceDesc" aria-describedby="' + t.id + '_voiceDesc"><table role="presentation" tabindex="0" id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>';
 			h += '<td>' + DOM.createHTML('span', {id: t.id + '_voiceDesc', 'class': 'voiceLabel', style:'display:none;'}, t.settings.title); 
 			h += DOM.createHTML('a', {id : t.id + '_text', tabindex : -1, 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 style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>') + '</td>';
@@ -9217,7 +9910,7 @@
 		},
 
 		showMenu : function() {
-			var t = this, p1, p2, e = DOM.get(this.id), m;
+			var t = this, p2, e = DOM.get(this.id), m;
 
 			if (t.isDisabled() || t.items.length == 0)
 				return;
@@ -9230,7 +9923,6 @@
 				t.isMenuRendered = true;
 			}
 
-			p1 = DOM.getPos(this.settings.menu_container);
 			p2 = DOM.getPos(e);
 
 			m = t.menu;
@@ -9304,6 +9996,7 @@
 				if (o.value === undefined) {
 					m.add({
 						title : o.title,
+						role : "option",
 						'class' : 'mceMenuItemTitle',
 						onclick : function() {
 							if (t.settings.onselect('') !== false)
@@ -9312,6 +10005,7 @@
 					});
 				} else {
 					o.id = DOM.uniqueId();
+					o.role= "option";
 					o.onclick = function() {
 						if (t.settings.onselect(o.value) !== false)
 							t.select(o.value); // Must be runned after
@@ -9387,6 +10081,7 @@
 		}
 	});
 })(tinymce);
+
 (function(tinymce) {
 	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;
 
@@ -9510,6 +10205,11 @@
 					Event.remove(t.id, 'blur', bf);
 				});
 
+				//prevent default left and right keys on chrome - so that the keyboard navigation is used.
+				if (tinymce.isWebKit && (e.keyCode==37 ||e.keyCode==39)) {
+					return Event.prevent(e);
+				}
+				
 				if (e.keyCode == 13 || e.keyCode == 32) {
 					onChange(e);
 					return Event.cancel(e);
@@ -9520,6 +10220,7 @@
 		}
 	});
 })(tinymce);
+
 (function(tinymce) {
 	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
 
@@ -9639,8 +10340,8 @@
 			h += '<td >' + DOM.createHTML('a', {role: 'button', id : t.id + '_open', tabindex: '-1', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';
 
 			h += '</tr></tbody>';
-			h = DOM.createHTML('table', {id : t.id, role: 'presentation', tabindex: '0',  'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h);
-			return DOM.createHTML('span', {role: 'button', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h);
+			h = DOM.createHTML('table', { role: 'presentation',   'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h);
+			return DOM.createHTML('div', {id : t.id, role: 'button', tabindex: '0', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h);
 		},
 
 		postRender : function() {
@@ -9762,21 +10463,21 @@
 		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, '.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');
-			}
+			if (t.isMenuVisible) {
+				// 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;
 
-			t.onHideMenu.dispatch(t);
+				if (!e || !DOM.getParent(e.target, '.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.isMenuVisible = 0;
-			t.editor.focus();
+				t.isMenuVisible = 0;
+				t.onHideMenu.dispatch();
+			}
 		},
 
 		renderMenu : function() {
@@ -9914,7 +10615,8 @@
 	},
 	
 	focus : function() {
-		this.keyNav.focus();
+		var t = this;
+		dom.get(t.id).focus();
 	},
 	
 	postRender : function() {
@@ -9932,6 +10634,10 @@
 			root: t.id,
 			items: items,
 			onCancel: function() {
+				//Move focus if webkit so that navigation back will read the item.
+				if (tinymce.isWebKit) {
+					dom.get(t.editor.id+"_ifr").focus();
+				}
 				t.editor.focus();
 			},
 			excludeFromTabOrder: !t.settings.tab_focus_toolbar
@@ -9950,7 +10656,7 @@
 
 (function(tinymce) {
 // Shorten class names
-var dom = tinymce.DOM, each = tinymce.each
+var dom = tinymce.DOM, each = tinymce.each;
 tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
 	renderHTML : function() {
 		var t = this, h = '', c, co, s = t.settings, i, pr, nx, cl;
@@ -10029,7 +10735,19 @@
 		},
 
 		get : function(n) {
-			return this.lookup[n];
+			if (this.lookup[n]) {
+				return this.lookup[n].instance;
+			} else {
+				return undefined;
+			}
+		},
+
+		dependencies : function(n) {
+			var result;
+			if (this.lookup[n]) {
+				result = this.lookup[n].dependencies;
+			}
+			return result || [];
 		},
 
 		requireLangPack : function(n) {
@@ -10039,27 +10757,61 @@
 				tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js');
 		},
 
-		add : function(id, o) {
+		add : function(id, o, dependencies) {
 			this.items.push(o);
-			this.lookup[id] = o;
+			this.lookup[id] = {instance:o, dependencies:dependencies};
 			this.onAdd.dispatch(this, id, o);
 
 			return o;
 		},
+		createUrl: function(baseUrl, dep) {
+			if (typeof dep === "object") {
+				return dep
+			} else {
+				return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix};
+			}
+		},
+
+		addComponents: function(pluginName, scripts) {
+			var pluginUrl = this.urls[pluginName];
+			tinymce.each(scripts, function(script){
+				tinymce.ScriptLoader.add(pluginUrl+"/"+script);	
+			});
+		},
 
 		load : function(n, u, cb, s) {
-			var t = this;
+			var t = this, url = u;
+
+			function loadDependencies() {
+				var dependencies = t.dependencies(n);
+				tinymce.each(dependencies, function(dep) {
+					var newUrl = t.createUrl(u, dep);
+					t.load(newUrl.resource, newUrl, undefined, undefined);
+				});
+				if (cb) {
+					if (s) {
+						cb.call(s);
+					} else {
+						cb.call(tinymce.ScriptLoader);
+					}
+				}
+			}
 
 			if (t.urls[n])
 				return;
+			if (typeof u === "object")
+				url = u.prefix + u.resource + u.suffix;
 
-			if (u.indexOf('/') != 0 && u.indexOf('://') == -1)
-				u = tinymce.baseURL + '/' + u;
+			if (url.indexOf('/') != 0 && url.indexOf('://') == -1)
+				url = tinymce.baseURL + '/' + url;
 
-			t.urls[n] = u.substring(0, u.lastIndexOf('/'));
+			t.urls[n] = url.substring(0, url.lastIndexOf('/'));
 
-			if (!t.lookup[n])
-				tinymce.ScriptLoader.add(u, cb, s);
+			if (t.lookup[n]) {
+				loadDependencies();
+			} else {
+				tinymce.ScriptLoader.add(url, loadDependencies, s);
+			}
 		}
 	});
 
@@ -10513,6 +11265,7 @@
 				visual_table_class : 'mceItemTable',
 				visual : 1,
 				font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large',
+				font_size_legacy_values : 'xx-small,small,medium,large,x-large,xx-large,300%', // See: http://www.w3.org/TR/CSS2/fonts.html#propdef-font-size
 				apply_source_formatting : 1,
 				directionality : 'ltr',
 				forced_root_block : 'p',
@@ -10565,10 +11318,10 @@
 			if (!t.getElement())
 				return;
 
-			// Is a iPad/iPhone, then skip initialization. We need to sniff here since the
-			// browser says it has contentEditable support but there is no visible caret
-			// We will remove this check ones Apple implements full contentEditable support
-			if (tinymce.isIDevice)
+			// Is a iPad/iPhone and not on iOS5, then skip initialization. We need to sniff 
+			// here since the browser says it has contentEditable support but there is no visible
+			// caret We will remove this check ones Apple implements full contentEditable support
+			if (tinymce.isIDevice && !tinymce.isIOS5)
 				return;
 
 			// Add hidden input for non input elements inside form elements
@@ -10640,12 +11393,23 @@
 					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, since it is removed as of 3.3b1
-						if (p == 'safari')
-							return;
-
-						PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js');
+					if (p &&!PluginManager.urls[p]) {
+						if (p.charAt(0) == '-') {
+							p = p.substr(1, p.length);
+							var dependencies = PluginManager.dependencies(p);
+							each(dependencies, function(dep) {
+								var defaultSettings = {prefix:'plugins/', resource: dep, suffix:'/editor_plugin' + tinymce.suffix + '.js'};
+								var dep = PluginManager.createUrl(defaultSettings, dep);
+								PluginManager.load(dep.resource, dep);
+								
+							});
+						} else {
+							// Skip safari plugin, since it is removed as of 3.3b1
+							if (p == 'safari') {
+								return;
+							}
+							PluginManager.load(p, {prefix:'plugins/', resource: p, suffix:'/editor_plugin' + tinymce.suffix + '.js'});
+						}
 					}
 				});
 
@@ -10660,7 +11424,7 @@
 		},
 
 		init : function() {
-			var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re, i;
+			var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re, i, initializedPlugins = [];
 
 			tinymce.add(t);
 
@@ -10674,20 +11438,25 @@
 				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) {
+			function initPlugin(p) {
 				var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po;
-
-				if (c) {
+				if (c && tinymce.inArray(initializedPlugins,p) === -1) {
+					each(PluginManager.dependencies(p), function(dep){
+						initPlugin(dep);
+					});
 					po = new c(t, u);
 
 					t.plugins[p] = po;
 
-					if (po.init)
+					if (po.init) {
 						po.init(t, u);
+						initializedPlugins.push(p);
+					}
 				}
-			});
+			}
+			
+			// Create all plugins
+			each(explode(s.plugins.replace(/\-/g, '')), initPlugin);
 
 			// Setup popup CSS path(s)
 			if (s.popup_css !== false) {
@@ -10797,12 +11566,9 @@
 
 			t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
 
-			// Firefox 2 doesn't load stylesheets correctly this way
-			if (!isGecko || !/Firefox\/2/.test(navigator.userAgent)) {
-				for (i = 0; i < t.contentCSS.length; i++)
-					t.iframeHTML += '<link type="text/css" rel="stylesheet" href="' + t.contentCSS[i] + '" />';
-
-				t.contentCSS = [];
+			// Load the CSS by injecting them into the HTML this will reduce "flicker"
+			for (i = 0; i < t.contentCSS.length; i++) {
+				t.iframeHTML += '<link type="text/css" rel="stylesheet" href="' + t.contentCSS[i] + '" />';
 			}
 
 			bi = s.body_id || 'tinymce';
@@ -10817,12 +11583,12 @@
 				bc = bc[t.id] || '';
 			}
 
-			t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>';
+			t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"><br></body></html>';
 
 			// Domain relaxing enabled, then set document domain
 			if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) {
 				// We need to write the contents here in IE since multiple writes messes up refresh button and back button
-				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();})()';				
+				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();})()';
 			}
 
 			// Create iframe
@@ -10830,11 +11596,13 @@
 			n = DOM.add(o.iframeContainer, 'iframe', { 
 				id : t.id + "_ifr",
 				src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7
-				frameBorder : '0', 
+				frameBorder : '0',
+				allowTransparency : "true",
 				title : s.aria_label,
 				style : {
 					width : '100%',
-					height : h
+					height : h,
+					display : 'block' // Important for Gecko to render the iframe correctly
 				}
 			});
 
@@ -10862,28 +11630,14 @@
 					d.domain = tinymce.relaxedDomain;
 			}
 
-			// Design mode needs to be added here Ctrl+A will fail otherwise
-			if (!isIE) {
-				try {
-					if (!s.readonly)
-						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);
+			// It will not steal focus while setting contentEditable
+			b = t.getBody();
+			b.disabled = true;
 
-				if (!s.readonly)
-					b.contentEditable = true;
+			if (!s.readonly)
+				b.contentEditable = true;
 
-				DOM.show(b);
-			}
+			b.disabled = false;
 
 			t.schema = new tinymce.html.Schema(s);
 
@@ -10900,47 +11654,55 @@
 
 			t.parser = new tinymce.html.DomParser(s, t.schema);
 
-			// Force anchor names closed
-			t.parser.addAttributeFilter('name', function(nodes, name) {
-				var i = nodes.length, sibling, prevSibling, parent, node;
-
-				while (i--) {
-					node = nodes[i];
-					if (node.name === 'a' && node.firstChild) {
-						parent = node.parent;
-
-						// Move children after current node
-						sibling = node.lastChild;
-						do {
-							prevSibling = sibling.prev;
-							parent.insert(sibling, node);
-							sibling = prevSibling;
-						} while (sibling);
+			// Force anchor names closed, unless the setting "allow_html_in_named_anchor" is explicitly included.
+			if (!t.settings.allow_html_in_named_anchor) {
+				t.parser.addAttributeFilter('name', function(nodes, name) {
+					var i = nodes.length, sibling, prevSibling, parent, node;
+	
+					while (i--) {
+						node = nodes[i];
+						if (node.name === 'a' && node.firstChild) {
+							parent = node.parent;
+	
+							// Move children after current node
+							sibling = node.lastChild;
+							do {
+								prevSibling = sibling.prev;
+								parent.insert(sibling, node);
+								sibling = prevSibling;
+							} while (sibling);
+						}
 					}
-				}
-			});
+				});
+			}
 
 			// Convert src and href into data-mce-src, data-mce-href and data-mce-style
 			t.parser.addAttributeFilter('src,href,style', function(nodes, name) {
-				var i = nodes.length, node, dom = t.dom, value;
+				var i = nodes.length, node, dom = t.dom, value, internalName;
 
 				while (i--) {
 					node = nodes[i];
 					value = node.attr(name);
+					internalName = 'data-mce-' + name;
 
-					if (name === "style")
-						node.attr('data-mce-style', dom.serializeStyle(dom.parseStyle(value), node.name));
-					else
-						node.attr('data-mce-' + name, t.convertURL(value, name, node.name));
+					// Add internal attribute if we need to we don't on a refresh of the document
+					if (!node.attributes.map[internalName]) {	
+						if (name === "style")
+							node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name));
+						else
+							node.attr(internalName, t.convertURL(value, name, node.name));
+					}
 				}
 			});
 
 			// Keep scripts from executing
 			t.parser.addNodeFilter('script', function(nodes, name) {
-				var i = nodes.length;
+				var i = nodes.length, node;
 
-				while (i--)
-					nodes[i].attr('type', 'mce-text/javascript');
+				while (i--) {
+					node = nodes[i];
+					node.attr('type', 'mce-' + (node.attr('type') || 'text/javascript'));
+				}
 			});
 
 			t.parser.addNodeFilter('#cdata', function(nodes, name) {
@@ -11024,6 +11786,18 @@
 				subscript : {inline : 'sub'},
 				superscript : {inline : 'sup'},
 
+				link : {inline : 'a', selector : 'a', remove : 'all', split : true, deep : true,
+					onmatch : function(node) {
+						return true;
+					},
+
+					onformat : function(elm, fmt, vars) {
+						each(vars, function(value, key) {
+							t.dom.setAttrib(elm, key, value);
+						});
+					}
+				},
+
 				removeformat : [
 					{selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true},
 					{selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true},
@@ -11081,6 +11855,8 @@
 			t.controlManager.onPostRender.dispatch(t, t.controlManager);
 			t.onPostRender.dispatch(t);
 
+			t.quirks = new tinymce.util.Quirks(this);
+
 			if (s.directionality)
 				t.getBody().dir = s.directionality;
 
@@ -11230,71 +12006,62 @@
 				});
 
 				t.onSetContent.add(t.selection.onSetContent.add(fixLinks));
-
-				if (!s.readonly) {
-					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 : 'html'});
-				t.startContent = t.getContent({format : 'raw'});
-				t.undoManager.add();
-				t.initialized = true;
+			t.load({initial : true, format : 'html'});
+			t.startContent = t.getContent({format : 'raw'});
+			t.undoManager.add();
+			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});
 
-				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
-				each(t.contentCSS, function(u) {
-					t.dom.loadCSS(u);
-				});
+			// Load specified content CSS last
+			each(t.contentCSS, function(u) {
+				t.dom.loadCSS(u);
+			});
 
-				// Handle auto focus
-				if (s.auto_focus) {
-					setTimeout(function () {
-						var ed = tinymce.get(s.auto_focus);
+			// Handle auto focus
+			if (s.auto_focus) {
+				setTimeout(function () {
+					var ed = tinymce.get(s.auto_focus);
+
+					ed.selection.select(ed.getBody(), 1);
+					ed.selection.collapse(1);
+					ed.getBody().focus();
+					ed.getWin().focus();
+				}, 100);
+			}
 
-						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, ieRng, controlElm, doc = t.getDoc();
+			var oed, t = this, selection = t.selection, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc();
 
 			if (!sf) {
 				// Get selected control element
-				ieRng = t.selection.getRng();
+				ieRng = selection.getRng();
 				if (ieRng.item) {
 					controlElm = ieRng.item(0);
 				}
 
+				t._refreshContentEditable();
+				selection.normalize();
+
 				// Is not content editable
 				if (!ce)
 					t.getWin().focus();
 
+				// Focus the body as well since it's contentEditable
+				if (tinymce.isGecko) {
+					t.getBody().focus();
+				}
+
 				// Restore selected control element
 				// This is needed when for example an image is selected within a
 				// layer a call to focus will then remove the control selection
@@ -11688,7 +12455,7 @@
 		},
 
 		setContent : function(content, args) {
-			var self = this, rootNode, body = self.getBody();
+			var self = this, rootNode, body = self.getBody(), forcedRootBlockName;
 
 			// Setup args object
 			args = args || {};
@@ -11705,7 +12472,15 @@
 			// 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 && (content.length === 0 || /^\s+$/.test(content))) {
-				body.innerHTML = '<br data-mce-bogus="1" />';
+				forcedRootBlockName = self.settings.forced_root_block;
+				if (forcedRootBlockName)
+					content = '<' + forcedRootBlockName + '><br data-mce-bogus="1"></' + forcedRootBlockName + '>';
+				else
+					content = '<br data-mce-bogus="1">';
+
+				body.innerHTML = content;
+				self.selection.select(body, true);
+				self.selection.collapse(true);
 				return;
 			}
 
@@ -11724,6 +12499,8 @@
 			if (!args.no_events)
 				self.onSetContent.dispatch(self, args);
 
+			self.selection.normalize();
+
 			return args.content;
 		},
 
@@ -12010,14 +12787,7 @@
 					var t = this, d = t.getDoc(), s = t.settings;
 
 					if (isGecko && !s.readonly) {
-						if (t._isHidden()) {
-							try {
-								if (!s.content_editable)
-									d.designMode = 'On';
-							} catch (ex) {
-								// Fails if it's hidden
-							}
-						}
+						t._refreshContentEditable();
 
 						try {
 							// Try new Gecko method
@@ -12040,21 +12810,6 @@
 				t.onMouseDown.add(setOpts);
 			}
 
-			// Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250
-			// WebKit can't even do simple things like selecting an image
-			// This also fixes so it's possible to select mceItemAnchors
-			if (tinymce.isWebKit) {
-				t.onClick.add(function(ed, e) {
-					e = e.target;
-
-					// Needs tobe the setBaseAndExtend or it will fail to select floated images
-					if (e.nodeName == 'IMG' || (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor'))) {
-						t.selection.getSel().setBaseAndExtent(e, 0, e, 1);
-						t.nodeChanged();
-					}
-				});
-			}
-
 			// Add node change handlers
 			t.onMouseUp.add(t.nodeChanged);
 			//t.onClick.add(t.nodeChanged);
@@ -12065,6 +12820,35 @@
 					t.nodeChanged();
 			});
 
+
+			// Add block quote deletion handler
+			t.onKeyDown.add(function(ed, e) {
+				// Was the BACKSPACE key pressed?
+				if (e.keyCode != 8)
+					return;
+
+				var n = ed.selection.getRng().startContainer;
+				var offset = ed.selection.getRng().startOffset;
+
+				while (n && n.nodeType && n.nodeType != 1 && n.parentNode)
+					n = n.parentNode;
+					
+				// Is the cursor at the beginning of a blockquote?
+				if (n && n.parentNode && n.parentNode.tagName === 'BLOCKQUOTE' && n.parentNode.firstChild == n && offset == 0) {
+					// Remove the blockquote
+					ed.formatter.toggle('blockquote', null, n.parentNode);
+
+					// Move the caret to the beginning of n
+					var rng = ed.selection.getRng();
+					rng.setStart(n, 0);
+					rng.setEnd(n, 0);
+					ed.selection.setRng(rng);
+					ed.selection.collapse(false);
+				}
+			});
+ 
+
+
 			// Add reset handler
 			t.onReset.add(function() {
 				t.setContent(t.startContent, {format : 'raw'});
@@ -12086,9 +12870,9 @@
 				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>']);
+				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;
@@ -12184,21 +12968,6 @@
 						cb : cb
 					};
 				});
-
-				t.onKeyDown.add(function(ed, e) {
-					var sel;
-
-					switch (e.keyCode) {
-						case 8:
-							sel = t.getDoc().selection;
-
-							// Fix IE control + backspace browser bug
-							if (sel.createRange && sel.createRange().item) {
-								ed.dom.remove(sel.createRange().item(0));
-								return Event.cancel(e);
-							}
-					}
-				});
 			}
 
 			if (tinymce.isOpera) {
@@ -12225,69 +12994,25 @@
 				});
 
 				t.onKeyUp.add(function(ed, e) {
-					var rng, parent, bookmark;
+					var keyCode = e.keyCode;
 
-					// Fix for bug #3168, to remove odd ".." nodes from the DOM we need to get/set the HTML of the parent node.
-					if (isIE && e.keyCode == 8) {
-						rng = t.selection.getRng();
-						if (rng.parentElement) {
-							parent = rng.parentElement();
-							bookmark = t.selection.getBookmark();
-							parent.innerHTML = parent.innerHTML;
-							t.selection.moveToBookmark(bookmark);
-						}
-					}
-
-					if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey)
+					if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || e.ctrlKey)
 						addUndo();
 				});
 
 				t.onKeyDown.add(function(ed, e) {
-					var rng, parent, bookmark, keyCode = e.keyCode;
+					var keyCode = e.keyCode, sel;
 
-					// IE has a really odd bug where the DOM might include an node that doesn't have
-					// a proper structure. If you try to access nodeValue it would throw an illegal value exception.
-					// This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element
-					// after you delete contents from it. See: #3008923
-					if (isIE && keyCode == 46) {
-						rng = t.selection.getRng();
-
-						if (rng.parentElement) {
-							parent = rng.parentElement();
-
-							if (!t.undoManager.typing) {
-								t.undoManager.beforeChange();
-								t.undoManager.typing = true;
-								t.undoManager.add();
-							}
-
-							// Select next word when ctrl key is used in combo with delete
-							if (e.ctrlKey) {
-								rng.moveEnd('word', 1);
-								rng.select();
-							}
-
-							// Delete contents
-							t.selection.getSel().clear();
-
-							// Check if we are within the same parent
-							if (rng.parentElement() == parent) {
-								bookmark = t.selection.getBookmark();
-
-								try {
-									// Update the HTML and hopefully it will remove the artifacts
-									parent.innerHTML = parent.innerHTML;
-								} catch (ex) {
-									// And since it's IE it can sometimes produce an unknown runtime error
-								}
+					if (keyCode == 8) {
+						sel = t.getDoc().selection;
 
-								// Restore the caret position
-								t.selection.moveToBookmark(bookmark);
-							}
+						// Fix IE control + backspace browser bug
+						if (sel && sel.createRange && sel.createRange().item) {
+							t.undoManager.beforeChange();
+							ed.dom.remove(sel.createRange().item(0));
+							addUndo();
 
-							// Block the default delete behavior since it might be broken
-							e.preventDefault();
-							return;
+							return Event.cancel(e);
 						}
 					}
 
@@ -12307,8 +13032,8 @@
 					// If key isn't shift,ctrl,alt,capslock,metakey
 					if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !t.undoManager.typing) {
 						t.undoManager.beforeChange();
-						t.undoManager.add();
 						t.undoManager.typing = true;
+						t.undoManager.add();
 					}
 				});
 
@@ -12317,7 +13042,7 @@
 						addUndo();
 				});
 			}
-			
+
 			// Bug fix for FireFox keeping styles from end of selection instead of start.
 			if (tinymce.isGecko) {
 				function getAttributeApplyFunction() {
@@ -12325,10 +13050,14 @@
 
 					return function() {
 						var target = t.selection.getStart();
-						t.dom.removeAllAttribs(target);
-						each(template, function(attr) {
-							target.setAttributeNode(attr.cloneNode(true));
-						});
+
+						if (target !== t.getBody()) {
+							t.dom.setAttrib(target, "style", null);
+
+							each(template, function(attr) {
+								target.setAttributeNode(attr.cloneNode(true));
+							});
+						}
 					};
 				}
 
@@ -12366,6 +13095,21 @@
 			}
 		},
 
+		_refreshContentEditable : function() {
+			var self = this, body, parent;
+
+			// Check if the editor was hidden and the re-initalize contentEditable mode by removing and adding the body again
+			if (self._isHidden()) {
+				body = self.getBody();
+				parent = body.parentNode;
+
+				parent.removeChild(body);
+				parent.appendChild(body);
+
+				body.focus();
+			}
+		},
+
 		_isHidden : function() {
 			var s;
 
@@ -12388,6 +13132,7 @@
 			selection = editor.selection,
 			commands = {state: {}, exec : {}, value : {}},
 			settings = editor.settings,
+			formatter = editor.formatter,
 			bookmark;
 
 		function execCommand(command, ui, value) {
@@ -12453,11 +13198,11 @@
 		};
 
 		function isFormatMatch(name) {
-			return editor.formatter.match(name);
+			return formatter.match(name);
 		};
 
 		function toggleFormat(name, value) {
-			editor.formatter.toggle(name, value ? {value : value} : undefined);
+			formatter.toggle(name, value ? {value : value} : undefined);
 		};
 
 		function storeSelection(type) {
@@ -12517,7 +13262,7 @@
 				// Remove all other alignments first
 				each('left,center,right,full'.split(','), function(name) {
 					if (align != name)
-						editor.formatter.remove('align' + name);
+						formatter.remove('align' + name);
 				});
 
 				toggleFormat('align' + align);
@@ -12574,7 +13319,7 @@
 			},
 
 			RemoveFormat : function(command) {
-				editor.formatter.remove(command);
+				formatter.remove(command);
 			},
 
 			mceBlockQuote : function(command) {
@@ -12620,19 +13365,15 @@
 			},
 
 			mceInsertContent : function(command, ui, value) {
-				var caretNode, rng, rootNode, parent, node, rng, nodeRect, viewPortRect, args;
-
-				function findSuitableCaretNode(start_node, root_node) {
-					var node, walker = new tinymce.dom.TreeWalker(start_node, root_node);
+				var parser, serializer, parentNode, rootNode, fragment, args,
+					marker, nodeRect, viewPortRect, rng, node, node2, bookmarkHtml, viewportBodyElement;
 
-					while ((node = walker.current())) {
-						if ((node.nodeType == 3 && tinymce.trim(node.nodeValue).length) || node.nodeName == 'BR' || node.nodeName == 'IMG')
-							return node;
-
-						walker.prev();
-					}
-				};
+				// Setup parser and serializer
+				parser = editor.parser;
+				serializer = new tinymce.html.Serializer({}, editor.schema);
+				bookmarkHtml = '<span id="mce_marker" data-mce-type="bookmark">\uFEFF</span>';
 
+				// Run beforeSetContent handlers on the HTML to be inserted
 				args = {content: value, format: 'html'};
 				selection.onBeforeSetContent.dispatch(selection, args);
 				value = args.content;
@@ -12641,91 +13382,114 @@
 				if (value.indexOf('{$caret}') == -1)
 					value += '{$caret}';
 
-				// Set the content at selection to a span and replace it's contents with the value
-				selection.setContent('<span id="__mce">\uFEFF</span>', {no_events : false});
-				dom.setOuterHTML('__mce', value.replace(/\{\$caret\}/, '<span data-mce-type="bookmark" id="__mce">\uFEFF</span>'));
-
-				caretNode = dom.select('#__mce')[0];
-				rootNode = dom.getRoot();
-
-				// Move the caret into the last suitable location within the previous sibling if it's a block since the block might be split
-				if (caretNode.previousSibling && dom.isBlock(caretNode.previousSibling) || caretNode.parentNode == rootNode) {
-					node = findSuitableCaretNode(caretNode.previousSibling, rootNode);
-					if (node) {
-						if (node.nodeName == 'BR')
-							node.parentNode.insertBefore(caretNode, node);
-						else
-							dom.insertAfter(caretNode, node);
+				// Replace the caret marker with a span bookmark element
+				value = value.replace(/\{\$caret\}/, bookmarkHtml);
+
+				// Insert node maker where we will insert the new HTML and get it's parent
+				if (!selection.isCollapsed())
+					editor.getDoc().execCommand('Delete', false, null);
+
+				parentNode = selection.getNode();
+
+				// Parse the fragment within the context of the parent node
+				args = {context : parentNode.nodeName.toLowerCase()};
+				fragment = parser.parse(value, args);
+
+				// Move the caret to a more suitable location
+				node = fragment.lastChild;
+				if (node.attr('id') == 'mce_marker') {
+					marker = node;
+
+					for (node = node.prev; node; node = node.walk(true)) {
+						if (node.type == 3 || !dom.isBlock(node.name)) {
+							node.parent.insert(marker, node, node.name === 'br');
+							break;
+						}
 					}
 				}
 
-				// Find caret root parent and clean it up using the serializer to avoid nesting
-				while (caretNode) {
-					if (caretNode === rootNode) {
-						// Clean up the parent element by parsing and serializing it
-						// This will remove invalid elements/attributes and fix nesting issues
-						dom.setOuterHTML(parent, 
-							new tinymce.html.Serializer({}, editor.schema).serialize(
-								new tinymce.html.DomParser({
-									remove_trailing_brs : true
-								}, editor.schema).parse(dom.getOuterHTML(parent))
-							)
-						);
+				// If parser says valid we can insert the contents into that parent
+				if (!args.invalid) {
+					value = serializer.serialize(fragment);
+
+					// Check if parent is empty or only has one BR element then set the innerHTML of that parent
+					node = parentNode.firstChild;
+					node2 = parentNode.lastChild;
+					if (!node || (node === node2 && node.nodeName === 'BR'))
+						dom.setHTML(parentNode, value);
+					else
+						selection.setContent(value);
+				} else {
+					// If the fragment was invalid within that context then we need
+					// to parse and process the parent it's inserted into
 
-						break;
-					}
+					// Insert bookmark node and get the parent
+					selection.setContent(bookmarkHtml);
+					parentNode = editor.selection.getNode();
+					rootNode = editor.getBody();
+
+					// Opera will return the document node when selection is in root
+					if (parentNode.nodeType == 9)
+						parentNode = node = rootNode;
+					else
+						node = parentNode;
 
-					parent = caretNode;
-					caretNode = caretNode.parentNode;
+					// Find the ancestor just before the root element
+					while (node !== rootNode) {
+						parentNode = node;
+						node = node.parentNode;
+					}
+
+					// Get the outer/inner HTML depending on if we are in the root and parser and serialize that
+					value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);
+					value = serializer.serialize(
+						parser.parse(
+							// Need to replace by using a function since $ in the contents would otherwise be a problem
+							value.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i, function() {
+								return serializer.serialize(fragment);
+							})
+						)
+					);
+
+					// Set the inner/outer HTML depending on if we are in the root or not
+					if (parentNode == rootNode)
+						dom.setHTML(rootNode, value);
+					else
+						dom.setOuterHTML(parentNode, value);
 				}
 
-				// Find caret after cleanup and move selection to that location
-				caretNode = dom.select('#__mce')[0];
-				if (caretNode) {
-					node = findSuitableCaretNode(caretNode.previousSibling, rootNode);
-					dom.remove(caretNode);
+				marker = dom.get('mce_marker');
 
-					if (node) {
-						rng = dom.createRng();
+				// Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well
+				nodeRect = dom.getRect(marker);
+				viewPortRect = dom.getViewPort(editor.getWin());
 
-						if (node.nodeType == 3) {
-							rng.setStart(node, node.length);
-							rng.setEnd(node, node.length);
-						} else {
-							if (node.nodeName == 'BR') {
-								rng.setStartBefore(node);
-								rng.setEndBefore(node);
-							} else {
-								rng.setStartAfter(node);
-								rng.setEndAfter(node);
-							}
-						}
+				// Check if node is out side the viewport if it is then scroll to it
+				if ((nodeRect.y + nodeRect.h > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) ||
+					(nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) {
+					viewportBodyElement = tinymce.isIE ? editor.getDoc().documentElement : editor.getBody();
+					viewportBodyElement.scrollLeft = nodeRect.x;
+					viewportBodyElement.scrollTop = nodeRect.y - viewPortRect.h + 25;
+				}
 
-						selection.setRng(rng);
+				// Move selection before marker and remove it
+				rng = dom.createRng();
 
-						// Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well
-						if (!tinymce.isIE) {
-							node = dom.create('span', null, '\u00a0');
-							rng.insertNode(node);
-							nodeRect = dom.getRect(node);
-							viewPortRect = dom.getViewPort(editor.getWin());
-
-							// Check if node is out side the viewport if it is then scroll to it
-							if ((nodeRect.y > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) ||
-								(nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) {
-								editor.getBody().scrollLeft = nodeRect.x;
-								editor.getBody().scrollTop = nodeRect.y;
-							}
-
-							dom.remove(node);
-						}
-
-						// Make sure that the selection is collapsed after we removed the node fixes a WebKit bug
-						// where WebKit would place the endContainer/endOffset at a different location than the startContainer/startOffset
-						selection.collapse(true);
-					}
+				// If previous sibling is a text node set the selection to the end of that node
+				node = marker.previousSibling;
+				if (node && node.nodeType == 3) {
+					rng.setStart(node, node.nodeValue.length);
+				} else {
+					// If the previous sibling isn't a text node or doesn't exist set the selection before the marker node
+					rng.setStartBefore(marker);
+					rng.setEndBefore(marker);
 				}
 
+				// Remove the marker node and set the new range
+				dom.remove(marker);
+				selection.setRng(rng);
+
+				// Dispatch after event and add any visual elements needed
 				selection.onSetContent.dispatch(selection, args);
 				editor.addVisual();
 			},
@@ -12778,7 +13542,7 @@
 			},
 
 			mceToggleFormat : function(command, ui, value) {
-				editor.formatter.toggle(value);
+				formatter.toggle(value);
 			},
 
 			InsertHorizontalRule : function() {
@@ -12791,46 +13555,31 @@
 			},
 
 			mceReplaceContent : function(command, ui, value) {
-				editor.execCommand('mceInsertContent', false, selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))));
+				editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'})));
 			},
 
 			mceInsertLink : function(command, ui, value) {
-				var link = dom.getParent(selection.getNode(), 'a'), img, floatVal;
+				var anchor;
 
-				if (tinymce.is(value, 'string'))
+				if (typeof(value) == 'string')
 					value = {href : value};
 
+				anchor = dom.getParent(selection.getNode(), 'a');
+
 				// Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here.
 				value.href = value.href.replace(' ', '%20');
 
-				if (!link) {
-					// WebKit can't create links on float images for some odd reason so just remove it and restore it later
-					if (tinymce.isWebKit) {
-						img = dom.getParent(selection.getNode(), 'img');
-
-						if (img) {
-							floatVal = img.style.cssFloat;
-							img.style.cssFloat = null;
-						}
-					}
-
-					execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);');
-
-					// Restore float value
-					if (floatVal)
-						img.style.cssFloat = floatVal;
-
-					each(dom.select("a[href='javascript:mctmp(0);']"), function(link) {
-						dom.setAttribs(link, value);
-					});
-				} else {
-					if (value.href)
-						dom.setAttribs(link, value);
-					else
-						editor.dom.remove(link, TRUE);
+				// Remove existing links if there could be child links or that the href isn't specified
+				if (!anchor || !value.href) {
+					formatter.remove('link');
+				}		
+
+				// Apply new link to selection
+				if (value.href) {
+					formatter.apply('link', value, anchor);
 				}
 			},
-			
+
 			selectAll : function() {
 				var root = dom.getRoot(), rng = dom.createRng();
 
@@ -12910,7 +13659,7 @@
 	var Dispatcher = tinymce.util.Dispatcher;
 
 	tinymce.UndoManager = function(editor) {
-		var self, index = 0, data = [];
+		var self, index = 0, data = [], beforeBookmark;
 
 		function getContent() {
 			return tinymce.trim(editor.getContent({format : 'raw', no_events : 1}));
@@ -12926,9 +13675,7 @@
 			onRedo : new Dispatcher(self),
 
 			beforeChange : function() {
-				// Set before bookmark on previous level
-				if (data[index])
-					data[index].beforeBookmark = editor.selection.getBookmark(2, true);
+				beforeBookmark = editor.selection.getBookmark(2, true);
 			},
 
 			add : function(level) {
@@ -12942,6 +13689,10 @@
 				if (lastLevel && lastLevel.content == level.content)
 					return null;
 
+				// Set before bookmark on previous level
+				if (data[index])
+					data[index].beforeBookmark = beforeBookmark;
+
 				// Time to compress
 				if (settings.custom_undo_redo_levels) {
 					if (data.length > settings.custom_undo_redo_levels) {
@@ -13064,19 +13815,10 @@
 		return rng2.cloneContents().textContent.length == 0;
 	};
 
-	function isEmpty(n) {
-		n = n.innerHTML;
-
-		n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars
-		n = n.replace(/<[^>]+>/g, ''); // Remove all tags
-
-		return n.replace(/[ \u00a0\t\r\n]+/g, '') == '';
-	};
-
 	function splitList(selection, dom, li) {
 		var listBlock, block;
 
-		if (isEmpty(li)) {
+		if (dom.isEmpty(li)) {
 			listBlock = dom.getParent(li, 'ul,ol');
 
 			if (!dom.getParent(listBlock.parentNode, 'ul,ol')) {
@@ -13102,28 +13844,94 @@
 			s.element = elm.toUpperCase();
 
 			ed.onPreInit.add(t.setup, t);
-
-			if (s.forced_root_block) {
-				ed.onInit.add(t.forceRoots, t);
-				ed.onSetContent.add(t.forceRoots, t);
-				ed.onBeforeGetContent.add(t.forceRoots, t);
-				ed.onExecCommand.add(function(ed, cmd) {
-					if (cmd == 'mceInsertContent') {
-						t.forceRoots();
-						ed.nodeChanged();
-					}
-				});
-			}
 		},
 
 		setup : function() {
-			var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection;
+			var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection, blockElements = ed.schema.getBlockElements();
 
-			// Force root blocks when typing and when getting output
+			// Force root blocks
 			if (s.forced_root_block) {
-				ed.onBeforeExecCommand.add(t.forceRoots, t);
-				ed.onKeyUp.add(t.forceRoots, t);
-				ed.onPreProcess.add(t.forceRoots, t);
+				function addRootBlocks() {
+					var node = selection.getStart(), rootNode = ed.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF;
+
+					if (!node || node.nodeType !== 1)
+						return;
+
+					// Check if node is wrapped in block
+					while (node != rootNode) {
+						if (blockElements[node.nodeName])
+							return;
+
+						node = node.parentNode;
+					}
+
+					// Get current selection
+					rng = selection.getRng();
+					if (rng.setStart) {
+						startContainer = rng.startContainer;
+						startOffset = rng.startOffset;
+						endContainer = rng.endContainer;
+						endOffset = rng.endOffset;
+					} else {
+						// Force control range into text range
+						if (rng.item) {
+							rng = ed.getDoc().body.createTextRange();
+							rng.moveToElementText(rng.item(0));
+						}
+
+						tmpRng = rng.duplicate();
+						tmpRng.collapse(true);
+						startOffset = tmpRng.move('character', offset) * -1;
+
+						if (!tmpRng.collapsed) {
+							tmpRng = rng.duplicate();
+							tmpRng.collapse(false);
+							endOffset = (tmpRng.move('character', offset) * -1) - startOffset;
+						}
+					}
+
+					// Wrap non block elements and text nodes
+					for (node = rootNode.firstChild; node; node) {
+						if (node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName])) {
+							if (!rootBlockNode) {
+								rootBlockNode = dom.create(s.forced_root_block);
+								node.parentNode.insertBefore(rootBlockNode, node);
+							}
+
+							tempNode = node;
+							node = node.nextSibling;
+							rootBlockNode.appendChild(tempNode);
+						} else {
+							rootBlockNode = null;
+							node = node.nextSibling;
+						}
+					}
+
+					if (rng.setStart) {
+						rng.setStart(startContainer, startOffset);
+						rng.setEnd(endContainer, endOffset);
+						selection.setRng(rng);
+					} else {
+						try {
+							rng = ed.getDoc().body.createTextRange();
+							rng.moveToElementText(rootNode);
+							rng.collapse(true);
+							rng.moveStart('character', startOffset);
+
+							if (endOffset > 0)
+								rng.moveEnd('character', endOffset);
+
+							rng.select();
+						} catch (ex) {
+							// Ignore
+						}
+					}
+
+					ed.nodeChanged();
+				};
+
+				ed.onKeyUp.add(addRootBlocks);
+				ed.onClick.add(addRootBlocks);
 			}
 
 			if (s.force_br_newlines) {
@@ -13270,155 +14078,6 @@
 			}
 		},
 
-		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, n, eid;
-
-			// 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];
-
-				// Ignore internal elements
-				if (nx.nodeType === 1 && nx.getAttribute('data-mce-type')) {
-					bl = null;
-					continue;
-				}
-
-				// Is text or non block element
-				if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) {
-					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 || r.setStart) {
-									// If selection is element then mark it
-									if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) {
-										// Save the id of the selected element
-										eid = n.getAttribute("id");
-										n.setAttribute("id", "__mce");
-									} else {
-										// 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 {
-									// Force control range into text range
-									if (r.item) {
-										tr = d.body.createTextRange();
-										tr.moveToElementText(r.item(0));
-										r = tr;
-									}
-
-									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;
-								}
-							}
-
-							// Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE
-							// See: http://support.microsoft.com/kb/829907
-							bl = ed.dom.create(ed.settings.forced_root_block);
-							nx.parentNode.replaceChild(bl, nx);
-							bl.appendChild(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 || r.setStart) {
-					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
-					}
-				}
-			} else if ((!isIE || r.setStart) && (n = ed.dom.get('__mce'))) {
-				// Restore the id of the selected element
-				if (eid)
-					n.setAttribute('id', eid);
-				else
-					n.removeAttribute('id');
-
-				// Move caret before selected element
-				r = d.createRange();
-				r.setStartBefore(n);
-				r.setEndBefore(n);
-				se.setRng(r);
-			}
-		},
-
 		getParentBlock : function(n) {
 			var d = this.dom;
 
@@ -13492,6 +14151,11 @@
 				ra.setStart(en, 0);
 			}
 
+			// If the body is totally empty add a BR element this might happen on webkit
+			if (!d.body.hasChildNodes()) {
+				d.body.appendChild(dom.create('br'));
+			}
+
 			// 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;
@@ -13606,10 +14270,6 @@
 			if (aft.firstChild && aft.firstChild.nodeName == bn)
 				aft.innerHTML = aft.firstChild.innerHTML;
 
-			// Padd empty blocks
-			if (isEmpty(bef))
-				bef.innerHTML = '<br />';
-
 			function appendStyles(e, en) {
 				var nl = [], nn, n, i;
 
@@ -13639,9 +14299,13 @@
 				} else
 					e.innerHTML = isOpera ? '\u00a0' : '<br />'; // Extra space for Opera so that the caret can move there
 			};
+				
+			// Padd empty blocks
+			if (dom.isEmpty(bef))
+				appendStyles(bef, sn);
 
 			// Fill empty afterblook with current style
-			if (isEmpty(aft))
+			if (dom.isEmpty(aft))
 				car = appendStyles(aft, en);
 
 			// Opera needs this one backwards for older versions
@@ -13657,16 +14321,9 @@
 			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(car || aft) : car || aft);
-			r.collapse(1);
-			s.removeAllRanges();
-			s.addRange(r);
+			ed.selection.select(aft, true);
+			ed.selection.collapse(true);
 
 			// 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;
@@ -13894,7 +14551,12 @@
 
 			id = t.prefix + id;
 
-			if (ed.settings.use_native_selects)
+
+			function useNativeListForAccessibility(ed) {
+				return ed.settings.use_accessible_selects && !tinymce.isGecko
+			}
+
+			if (ed.settings.use_native_selects || useNativeListForAccessibility(ed))
 				c = new tinymce.ui.NativeListBox(id, s);
 			else {
 				cls = cc || t._cls.listbox || tinymce.ui.ListBox;
@@ -13957,7 +14619,7 @@
 				ed.onMouseDown.add(c.hideMenu, c);
 			} else {
 				cls = t._cls.button || tinymce.ui.Button;
-				c = new cls(id, s);
+				c = new cls(id, s, ed);
 			}
 
 			return t.add(c);
@@ -14243,8 +14905,7 @@
 			MCE_ATTR_RE = /^(src|href|style)$/,
 			FALSE = false,
 			TRUE = true,
-			undefined,
-			pendingFormats = {apply : [], remove : []};
+			undefined;
 
 		function isArray(obj) {
 			return obj instanceof Array;
@@ -14358,6 +15019,10 @@
 				fmt = fmt || format;
 
 				if (elm) {
+					if (fmt.onformat) {
+						fmt.onformat(elm, fmt, vars, node);
+					}
+
 					each(fmt.styles, function(value, name) {
 						dom.setStyle(elm, name, replaceVars(value, vars));
 					});
@@ -14374,8 +15039,89 @@
 					});
 				}
 			};
+			function adjustSelectionToVisibleSelection() {
+				function findSelectionEnd(start, end) {
+					var walker = new TreeWalker(end);
+					for (node = walker.current(); node; node = walker.prev()) {
+						if (node.childNodes.length > 1 || node == start) {
+							return node;
+						}
+					}
+				};
+
+				// Adjust selection so that a end container with a end offset of zero is not included in the selection
+				// as this isn't visible to the user.
+				var rng = ed.selection.getRng();
+				var start = rng.startContainer;
+				var end = rng.endContainer;
+
+				if (start != end && rng.endOffset == 0) {
+					var newEnd = findSelectionEnd(start, end);
+					var endOffset = newEnd.nodeType == 3 ? newEnd.length : newEnd.childNodes.length;
+
+					rng.setEnd(newEnd, endOffset);
+				}
 
-			function applyRngStyle(rng) {
+				return rng;
+			}
+			
+			function applyStyleToList(node, bookmark, wrapElm, newWrappers, process){
+				var nodes = [], listIndex = -1, list, startIndex = -1, endIndex = -1, currentWrapElm;
+				
+				// find the index of the first child list.
+				each(node.childNodes, function(n, index) {
+					if (n.nodeName === "UL" || n.nodeName === "OL") {
+						listIndex = index;
+						list = n;
+						return false;
+					}
+				});
+				
+				// get the index of the bookmarks
+				each(node.childNodes, function(n, index) {
+					if (n.nodeName === "SPAN" && dom.getAttrib(n, "data-mce-type") == "bookmark") {
+						if (n.id == bookmark.id + "_start") {
+							startIndex = index;
+						} else if (n.id == bookmark.id + "_end") {
+							endIndex = index;
+						}
+					}
+				});
+				
+				// if the selection spans across an embedded list, or there isn't an embedded list - handle processing normally
+				if (listIndex <= 0 || (startIndex < listIndex && endIndex > listIndex)) {
+					each(tinymce.grep(node.childNodes), process);
+					return 0;
+				} else {
+					currentWrapElm = wrapElm.cloneNode(FALSE);
+					
+					// create a list of the nodes on the same side of the list as the selection
+					each(tinymce.grep(node.childNodes), function(n, index) {
+						if ((startIndex < listIndex && index < listIndex) || (startIndex > listIndex && index > listIndex)) {
+							nodes.push(n); 
+							n.parentNode.removeChild(n);
+						}
+					});
+					
+					// insert the wrapping element either before or after the list.
+					if (startIndex < listIndex) {
+						node.insertBefore(currentWrapElm, list);
+					} else if (startIndex > listIndex) {
+						node.insertBefore(currentWrapElm, list.nextSibling);
+					}
+					
+					// add the new nodes to the list.
+					newWrappers.push(currentWrapElm);
+
+					each(nodes, function(node) {
+						currentWrapElm.appendChild(node);
+					});
+
+					return currentWrapElm;
+				}
+			};
+			
+			function applyRngStyle(rng, bookmark, node_specific) {
 				var newWrappers = [], wrapName, wrapElm;
 
 				// Setup wrapper element
@@ -14439,7 +15185,7 @@
 
 						// Is it valid to wrap this item
 						if (isValid(wrapName, nodeName) && isValid(parentName, wrapName) &&
-								!(node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279)) {
+								!(!node_specific && node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279) && node.id !== '_mce_caret') {
 							// Start wrapping
 							if (!currentWrapElm) {
 								// Wrap the node
@@ -14449,6 +15195,9 @@
 							}
 
 							currentWrapElm.appendChild(node);
+						} else if (nodeName == 'li' && bookmark) {
+							// Start wrapping - if we are in a list node and have a bookmark, then we will always begin by wrapping in a new element.
+							currentWrapElm = applyStyleToList(node, bookmark, wrapElm, newWrappers, process);
 						} else {
 							// Start a new wrapper for possible children
 							currentWrapElm = 0;
@@ -14581,7 +15330,7 @@
 						}
 
 						// Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b>
-						if (node) {
+						if (node && format.merge_siblings !== false) {
 							node = mergeSiblings(getNonWhiteSpaceSibling(node), node);
 							node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE));
 						}
@@ -14591,20 +15340,23 @@
 
 			if (format) {
 				if (node) {
-					rng = dom.createRng();
-
-					rng.setStartBefore(node);
-					rng.setEndAfter(node);
-
-					applyRngStyle(expandRng(rng, formatList));
+					if (node.nodeType) {
+						rng = dom.createRng();
+						rng.setStartBefore(node);
+						rng.setEndAfter(node);
+						applyRngStyle(expandRng(rng, formatList), null, true);
+					} else {
+						applyRngStyle(node, null, true);
+					}
 				} else {
 					if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) {
 						// Obtain selection node before selection is unselected by applyRngStyle()
 						var curSelNode = ed.selection.getNode();
 
 						// Apply formatting to selection
+						ed.selection.setRng(adjustSelectionToVisibleSelection());
 						bookmark = selection.getBookmark();
-						applyRngStyle(expandRng(selection.getRng(TRUE), formatList));
+						applyRngStyle(expandRng(selection.getRng(TRUE), formatList), bookmark);
 
 						// Colored nodes should be underlined so that the color of the underline matches the text color.
 						if (format.styles && (format.styles.color || format.styles.textDecoration)) {
@@ -14623,7 +15375,6 @@
 
 		function remove(name, vars, node) {
 			var formatList = get(name), format = formatList[0], bookmark, i, rng;
-
 			function moveStart(rng) {
 				var container = rng.startContainer,
 					offset = rng.startOffset,
@@ -14810,10 +15561,15 @@
 
 			// Handle node
 			if (node) {
-				rng = dom.createRng();
-				rng.setStartBefore(node);
-				rng.setEndAfter(node);
-				removeRngStyle(rng);
+				if (node.nodeType) {
+					rng = dom.createRng();
+					rng.setStartBefore(node);
+					rng.setEndAfter(node);
+					removeRngStyle(rng);
+				} else {
+					removeRngStyle(node);
+				}
+
 				return;
 			}
 
@@ -14823,13 +15579,18 @@
 				selection.moveToBookmark(bookmark);
 
 				// Check if start element still has formatting then we are at: "<b>text|</b>text" and need to move the start into the next text node
-				if (match(name, vars, selection.getStart())) {
+				if (format.inline && match(name, vars, selection.getStart())) {
 					moveStart(selection.getRng(true));
 				}
 
 				ed.nodeChanged();
 			} else
 				performCaretAction('remove', name, vars);
+
+			// When you remove formatting from a table cell in WebKit (cell, not the contents of a cell) there is a rendering issue with column width
+			if (tinymce.isWebKit) {
+				ed.execCommand('mceCleanup');
+			}
 		};
 
 		function toggle(name, vars, node) {
@@ -14847,6 +15608,11 @@
 			function matchItems(node, format, item_name) {
 				var key, value, items = format[item_name], i;
 
+				// Custom match
+				if (format.onmatch) {
+					return format.onmatch(node, format, item_name);
+				}
+
 				// Check all items
 				if (items) {
 					// Non indexed object
@@ -14899,7 +15665,7 @@
 		};
 
 		function match(name, vars, node) {
-			var startNode, i;
+			var startNode;
 
 			function matchParents(node) {
 				// Find first node with similar format settings
@@ -14915,21 +15681,6 @@
 			if (node)
 				return matchParents(node);
 
-			// Check pending formats
-			if (selection.isCollapsed()) {
-				for (i = pendingFormats.apply.length - 1; i >= 0; i--) {
-					if (pendingFormats.apply[i].name == name)
-						return true;
-				}
-
-				for (i = pendingFormats.remove.length - 1; i >= 0; i--) {
-					if (pendingFormats.remove[i].name == name)
-						return false;
-				}
-
-				return matchParents(selection.getNode());
-			}
-
 			// Check selected node
 			node = selection.getNode();
 			if (matchParents(node))
@@ -14948,33 +15699,6 @@
 		function matchAll(names, vars) {
 			var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name;
 
-			// If the selection is collapsed then check pending formats
-			if (selection.isCollapsed()) {
-				for (ni = 0; ni < names.length; ni++) {
-					// If the name is to be removed, then stop it from being added
-					for (i = pendingFormats.remove.length - 1; i >= 0; i--) {
-						name = names[ni];
-
-						if (pendingFormats.remove[i].name == name) {
-							checkedMap[name] = true;
-							break;
-						}
-					}
-				}
-
-				// If the format is to be applied
-				for (i = pendingFormats.apply.length - 1; i >= 0; i--) {
-					for (ni = 0; ni < names.length; ni++) {
-						name = names[ni];
-
-						if (!checkedMap[name] && pendingFormats.apply[i].name == name) {
-							checkedMap[name] = true;
-							matchedFormatNames.push(name);
-						}
-					}
-				}
-			}
-
 			// Check start of selection for formats
 			startElement = selection.getStart();
 			dom.getParent(startElement, function(node) {
@@ -15083,7 +15807,7 @@
 		};
 
 		function isWhiteSpaceNode(node) {
-			return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue);
+			return node && node.nodeType === 3 && /^([\t \r\n]+|)$/.test(node.nodeValue);
 		};
 
 		function wrap(node, name, attrs) {
@@ -15099,31 +15823,37 @@
 			var startContainer = rng.startContainer,
 				startOffset = rng.startOffset,
 				endContainer = rng.endContainer,
-				endOffset = rng.endOffset, sibling, lastIdx, leaf;
+				endOffset = rng.endOffset, sibling, lastIdx, leaf, endPoint;
 
 			// This function walks up the tree if there is no siblings before/after the node
-			function findParentContainer(container, child_name, sibling_name, root) {
-				var parent, child;
+			function findParentContainer(start) {
+				var container, parent, child, sibling, siblingName;
 
-				root = root || dom.getRoot();
+				container = parent = start ? startContainer : endContainer;
+				siblingName = start ? 'previousSibling' : 'nextSibling';
+				root = dom.getRoot();
+
+				// If it's a text node and the offset is inside the text
+				if (container.nodeType == 3 && !isWhiteSpaceNode(container)) {
+					if (start ? startOffset > 0 : endOffset < container.nodeValue.length) {
+						return container;
+					}
+				}
 
 				for (;;) {
-					// Check if we can move up are we at root level or body level
-					parent = container.parentNode;
-
 					// Stop expanding on block elements or root depending on format
 					if (parent == root || (!format[0].block_expand && isBlock(parent)))
-						return container;
+						return parent;
 
-					for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) {
-						if (sibling.nodeType == 1 && !isBookmarkNode(sibling))
-							return container;
-
-						if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling))
-							return container;
+					// Walk left/right
+					for (sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {
+						if (!isBookmarkNode(sibling) && !isWhiteSpaceNode(sibling)) {
+							return parent;
+						}
 					}
 
-					container = container.parentNode;
+					// Check if we can move up are we at root level or body level
+					parent = parent.parentNode;
 				}
 
 				return container;
@@ -15161,23 +15891,103 @@
 			}
 
 			// Exclude bookmark nodes if possible
-			if (isBookmarkNode(startContainer.parentNode))
-				startContainer = startContainer.parentNode;
-
-			if (isBookmarkNode(startContainer))
+			if (isBookmarkNode(startContainer.parentNode) || isBookmarkNode(startContainer)) {
+				startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode;
 				startContainer = startContainer.nextSibling || startContainer;
 
-			if (isBookmarkNode(endContainer.parentNode)) {
-				endOffset = dom.nodeIndex(endContainer);
-				endContainer = endContainer.parentNode;
+				if (startContainer.nodeType == 3)
+					startOffset = 0;
 			}
 
-			if (isBookmarkNode(endContainer) && endContainer.previousSibling) {
-				endContainer = endContainer.previousSibling;
-				endOffset = endContainer.length;
+			if (isBookmarkNode(endContainer.parentNode) || isBookmarkNode(endContainer)) {
+				endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode;
+				endContainer = endContainer.previousSibling || endContainer;
+
+				if (endContainer.nodeType == 3)
+					endOffset = endContainer.length;
 			}
 
 			if (format[0].inline) {
+				if (rng.collapsed) {
+					function findWordEndPoint(container, offset, start) {
+						var walker, node, pos, lastTextNode;
+
+						function findSpace(node, offset) {
+							var pos, pos2, str = node.nodeValue;
+
+							if (typeof(offset) == "undefined") {
+								offset = start ? str.length : 0;
+							}
+
+							if (start) {
+								pos = str.lastIndexOf(' ', offset);
+								pos2 = str.lastIndexOf('\u00a0', offset);
+								pos = pos > pos2 ? pos : pos2;
+
+								// Include the space on remove to avoid tag soup
+								if (pos !== -1 && !remove) {
+									pos++;
+								}
+							} else {
+								pos = str.indexOf(' ', offset);
+								pos2 = str.indexOf('\u00a0', offset);
+								pos = pos !== -1 && (pos2 === -1 || pos < pos2) ? pos : pos2;
+							}
+
+							return pos;
+						};
+
+						if (container.nodeType === 3) {
+							pos = findSpace(container, offset);
+
+							if (pos !== -1) {
+								return {container : container, offset : pos};
+							}
+
+							lastTextNode = container;
+						}
+
+						// Walk the nodes inside the block
+						walker = new TreeWalker(container, dom.getParent(container, isBlock) || ed.getBody());
+						while (node = walker[start ? 'prev' : 'next']()) {
+							if (node.nodeType === 3) {
+								lastTextNode = node;
+								pos = findSpace(node);
+
+								if (pos !== -1) {
+									return {container : node, offset : pos};
+								}
+							} else if (isBlock(node)) {
+								break;
+							}
+						}
+
+						if (lastTextNode) {
+							if (start) {
+								offset = 0;
+							} else {
+								offset = lastTextNode.length;
+							}
+
+							return {container: lastTextNode, offset: offset};
+						}
+					}
+
+					// Expand left to closest word boundery
+					endPoint = findWordEndPoint(startContainer, startOffset, true);
+					if (endPoint) {
+						startContainer = endPoint.container;
+						startOffset = endPoint.offset;
+					}
+
+					// Expand right to closest word boundery
+					endPoint = findWordEndPoint(endContainer, endOffset);
+					if (endPoint) {
+						endContainer = endPoint.container;
+						endOffset = endPoint.offset;
+					}
+				}
+
 				// Avoid applying formatting to a trailing space.
 				leaf = findLeaf(endContainer, endOffset);
 				if (leaf.node) {
@@ -15191,19 +16001,25 @@
 							endContainer = leaf.node;
 							endContainer.splitText(leaf.offset - 1);
 						} else if (leaf.node.previousSibling) {
-							endContainer = leaf.node.previousSibling;
+							// TODO: Figure out why this is in here
+							//endContainer = leaf.node.previousSibling;
 						}
 					}
 				}
 			}
-			
+
 			// Move start/end point up the tree if the leaves are sharp and if we are in different containers
 			// Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>!
 			// This will reduce the number of wrapper elements that needs to be created
 			// Move start point up the tree
 			if (format[0].inline || format[0].block_expand) {
-				startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');
-				endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');
+				if (!format[0].inline || (startContainer.nodeType != 3 || startOffset === 0)) {
+					startContainer = findParentContainer(true);
+				}
+
+				if (!format[0].inline || (endContainer.nodeType != 3 || endOffset === endContainer.nodeValue.length)) {
+					endContainer = findParentContainer();
+				}
 			}
 
 			// Expand start/end container to matching selector
@@ -15277,10 +16093,10 @@
 				// Non block element then try to expand up the leaf
 				if (format[0].block) {
 					if (!isBlock(startContainer))
-						startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');
+						startContainer = findParentContainer(true);
 
 					if (!isBlock(endContainer))
-						endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');
+						endContainer = findParentContainer();
 				}
 			}
 
@@ -15573,7 +16389,7 @@
 		};
 
 		function getContainer(rng, start) {
-			var container, offset, lastIdx;
+			var container, offset, lastIdx, walker;
 
 			container = rng[start ? 'startContainer' : 'endContainer'];
 			offset = rng[start ? 'startOffset' : 'endOffset'];
@@ -15587,107 +16403,267 @@
 				container = container.childNodes[offset > lastIdx ? lastIdx : offset];
 			}
 
+			// If start text node is excluded then walk to the next node
+			if (container.nodeType === 3 && start && offset >= container.nodeValue.length) {
+				container = new TreeWalker(container, ed.getBody()).next() || container;
+			}
+
+			// If end text node is excluded then walk to the previous node
+			if (container.nodeType === 3 && !start && offset == 0) {
+				container = new TreeWalker(container, ed.getBody()).prev() || container;
+			}
+
 			return container;
 		};
 
 		function performCaretAction(type, name, vars) {
-			var i, currentPendingFormats = pendingFormats[type],
-				otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply'];
+			var invisibleChar, caretContainerId = '_mce_caret', debug = ed.settings.caret_debug;
+
+			// Setup invisible character use zero width space on Gecko since it doesn't change the heigt of the container
+			invisibleChar = tinymce.isGecko ? '\u200B' : INVISIBLE_CHAR;
+
+			// Creates a caret container bogus element
+			function createCaretContainer(fill) {
+				var caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true, style: debug ? 'color:red' : ''});
+
+				if (fill) {
+					caretContainer.appendChild(ed.getDoc().createTextNode(invisibleChar));
+				}
+
+				return caretContainer;
+			};
+
+			function isCaretContainerEmpty(node, nodes) {
+				while (node) {
+					if ((node.nodeType === 3 && node.nodeValue !== invisibleChar) || node.childNodes.length > 1) {
+						return false;
+					}
 
-			function hasPending() {
-				return pendingFormats.apply.length || pendingFormats.remove.length;
+					// Collect nodes
+					if (nodes && node.nodeType === 1) {
+						nodes.push(node);
+					}
+
+					node = node.firstChild;
+				}
+
+				return true;
 			};
+			
+			// Returns any parent caret container element
+			function getParentCaretContainer(node) {
+				while (node) {
+					if (node.id === caretContainerId) {
+						return node;
+					}
 
-			function resetPending() {
-				pendingFormats.apply = [];
-				pendingFormats.remove = [];
+					node = node.parentNode;
+				}
 			};
 
-			function perform(caret_node) {
-				// Apply pending formats
-				each(pendingFormats.apply.reverse(), function(item) {
-					apply(item.name, item.vars, caret_node);
+			// Finds the first text node in the specified node
+			function findFirstTextNode(node) {
+				var walker;
 
-					// Colored nodes should be underlined so that the color of the underline matches the text color.
-					if (item.name === 'forecolor' && item.vars.value)
-						processUnderlineAndColor(caret_node.parentNode);
-				});
+				if (node) {
+					walker = new TreeWalker(node, node);
 
-				// Remove pending formats
-				each(pendingFormats.remove.reverse(), function(item) {
-					remove(item.name, item.vars, caret_node);
-				});
+					for (node = walker.current(); node; node = walker.next()) {
+						if (node.nodeType === 3) {
+							return node;
+						}
+					}
+				}
+			};
+
+			// Removes the caret container for the specified node or all on the current document
+			function removeCaretContainer(node, move_caret) {
+				var child, rng;
+
+				if (!node) {
+					node = getParentCaretContainer(selection.getStart());
+
+					if (!node) {
+						while (node = dom.get(caretContainerId)) {
+							removeCaretContainer(node, false);
+						}
+					}
+				} else {
+					rng = selection.getRng(true);
+
+					if (isCaretContainerEmpty(node)) {
+						if (move_caret !== false) {
+							rng.setStartBefore(node);
+							rng.setEndBefore(node);
+						}
+
+						dom.remove(node);
+					} else {
+						child = findFirstTextNode(node);
+						child = child.deleteData(0, 1);
+						dom.remove(node, 1);
+					}
 
-				dom.remove(caret_node, 1);
-				resetPending();
+					selection.setRng(rng);
+				}
 			};
+			
+			// Applies formatting to the caret postion
+			function applyCaretFormat() {
+				var rng, caretContainer, textNode, offset, bookmark, container, text;
+
+				rng = selection.getRng(true);
+				offset = rng.startOffset;
+				container = rng.startContainer;
+				text = container.nodeValue;
+
+				caretContainer = getParentCaretContainer(selection.getStart());
+				if (caretContainer) {
+					textNode = findFirstTextNode(caretContainer);
+				}
+
+				// Expand to word is caret is in the middle of a text node and the char before/after is a alpha numeric character
+				if (text && offset > 0 && offset < text.length && /\w/.test(text.charAt(offset)) && /\w/.test(text.charAt(offset - 1))) {
+					// Get bookmark of caret position
+					bookmark = selection.getBookmark();
+
+					// Collapse bookmark range (WebKit)
+					rng.collapse(true);
+
+					// Expand the range to the closest word and split it at those points
+					rng = expandRng(rng, get(name));
+					rng = rangeUtils.split(rng);
+
+					// Apply the format to the range
+					apply(name, vars, rng);
+
+					// Move selection back to caret position
+					selection.moveToBookmark(bookmark);
+				} else {
+					if (!caretContainer || textNode.nodeValue !== invisibleChar) {
+						caretContainer = createCaretContainer(true);
+						textNode = caretContainer.firstChild;
+
+						rng.insertNode(caretContainer);
+						offset = 1;
+
+						apply(name, vars, caretContainer);
+					} else {
+						apply(name, vars, caretContainer);
+					}
+
+					// Move selection to text node
+					selection.setCursorLocation(textNode, offset);
+				}
+			};
+
+			function removeCaretFormat() {
+				var rng = selection.getRng(true), container, offset, bookmark,
+					hasContentAfter, node, formatNode, parents = [], i, caretContainer;
+
+				container = rng.startContainer;
+				offset = rng.startOffset;
+				node = container;
+
+				if (container.nodeType == 3) {
+					if (offset != container.nodeValue.length || container.nodeValue === invisibleChar) {
+						hasContentAfter = true;
+					}
+
+					node = node.parentNode;
+				}
+
+				while (node) {
+					if (matchNode(node, name, vars)) {
+						formatNode = node;
+						break;
+					}
+
+					if (node.nextSibling) {
+						hasContentAfter = true;
+					}
+
+					parents.push(node);
+					node = node.parentNode;
+				}
 
-			// Check if it already exists then ignore it
-			for (i = currentPendingFormats.length - 1; i >= 0; i--) {
-				if (currentPendingFormats[i].name == name)
+				// Node doesn't have the specified format
+				if (!formatNode) {
 					return;
-			}
+				}
 
-			currentPendingFormats.push({name : name, vars : vars});
+				// Is there contents after the caret then remove the format on the element
+				if (hasContentAfter) {
+					// Get bookmark of caret position
+					bookmark = selection.getBookmark();
+
+					// Collapse bookmark range (WebKit)
+					rng.collapse(true);
+
+					// Expand the range to the closest word and split it at those points
+					rng = expandRng(rng, get(name), true);
+					rng = rangeUtils.split(rng);
 
-			// Check if it's in the other type, then remove it
-			for (i = otherPendingFormats.length - 1; i >= 0; i--) {
-				if (otherPendingFormats[i].name == name)
-					otherPendingFormats.splice(i, 1);
-			}
+					// Remove the format from the range
+					remove(name, vars, rng);
+
+					// Move selection back to caret position
+					selection.moveToBookmark(bookmark);
+				} else {
+					caretContainer = createCaretContainer();
 
-			// Pending apply or remove formats
-			if (hasPending()) {
-				ed.getDoc().execCommand('FontName', false, 'mceinline');
-				pendingFormats.lastRng = selection.getRng();
+					node = caretContainer;
+					for (i = parents.length - 1; i >= 0; i--) {
+						node.appendChild(parents[i].cloneNode(false));
+						node = node.firstChild;
+					}
 
-				// IE will convert the current word
-				each(dom.select('font,span'), function(node) {
-					var bookmark;
+					// Insert invisible character into inner most format element
+					node.appendChild(dom.doc.createTextNode(invisibleChar));
+					node = node.firstChild;
 
-					if (isCaretNode(node)) {
-						bookmark = selection.getBookmark();
-						perform(node);
-						selection.moveToBookmark(bookmark);
-						ed.nodeChanged();
+					// Insert caret container after the formated node
+					dom.insertAfter(caretContainer, formatNode);
+
+					// Move selection to text node
+					selection.setCursorLocation(node, 1);
+				}
+			};
+
+			// Mark current caret container elements as bogus when getting the contents so we don't end up with empty elements
+			ed.onBeforeGetContent.addToTop(function() {
+				var nodes = [], i;
+
+				if (isCaretContainerEmpty(getParentCaretContainer(selection.getStart()), nodes)) {
+					// Mark children
+					i = nodes.length;
+					while (i--) {
+						dom.setAttrib(nodes[i], 'data-mce-bogus', '1');
 					}
+				}
+			});
+
+			// Remove caret container on mouse up and on key up
+			tinymce.each('onMouseUp onKeyUp'.split(' '), function(name) {
+				ed[name].addToTop(function() {
+					removeCaretContainer();
 				});
+			});
 
-				// Only register listeners once if we need to
-				if (!pendingFormats.isListening && hasPending()) {
-					pendingFormats.isListening = true;
-
-					each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) {
-						ed[event].addToTop(function(ed, e) {
-							// Do we have pending formats and is the selection moved has moved
-							if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) {
-								each(dom.select('font,span'), function(node) {
-									var textNode, rng;
-
-									// Look for marker
-									if (isCaretNode(node)) {
-										textNode = node.firstChild;
-
-										if (textNode) {
-											perform(node);
-
-											rng = dom.createRng();
-											rng.setStart(textNode, textNode.nodeValue.length);
-											rng.setEnd(textNode, textNode.nodeValue.length);
-											selection.setRng(rng);
-											ed.nodeChanged();
-										} else
-											dom.remove(node);
-									}
-								});
+			// Remove caret container on keydown and it's a backspace, enter or left/right arrow keys
+			ed.onKeyDown.addToTop(function(ed, e) {
+				var keyCode = e.keyCode;
 
-								// Always unbind and clear pending styles on keyup
-								if (e.type == 'keyup' || e.type == 'mouseup')
-									resetPending();
-							}
-						});
-					});
+				if (keyCode == 8 || keyCode == 37 || keyCode == 39) {
+					removeCaretContainer(getParentCaretContainer(selection.getStart()));
 				}
+			});
+
+			// Do apply or remove caret format
+			if (type == "apply") {
+				applyCaretFormat();
+			} else {
+				removeCaretFormat();
 			}
 		};
 	};
@@ -15697,7 +16673,7 @@
 	var filters, fontSizes, dom, settings = ed.settings;
 
 	if (settings.inline_styles) {
-		fontSizes = tinymce.explode(settings.font_size_style_values);
+		fontSizes = tinymce.explode(settings.font_size_legacy_values);
 
 		function replaceWithSpan(node, styles) {
 			tinymce.each(styles, function(value, name) {
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/utils/editable_selects.js 1.0.2.src/e107_handlers/tiny_mce/utils/editable_selects.js
--- 1.0.0.src/e107_handlers/tiny_mce/utils/editable_selects.js	2012-10-30 15:39:55.599444443 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/utils/editable_selects.js	2012-10-30 15:40:38.402443337 +0000
@@ -16,7 +16,7 @@
 
 		for (i=0; i<nl.length; i++) {
 			if (nl[i].className.indexOf('mceEditableSelect') != -1) {
-				o = new Option('(value)', '__mce_add_custom__');
+				o = new Option(tinyMCEPopup.editor.translate('value'), '__mce_add_custom__');
 
 				o.className = 'mceAddSelectValue';
 
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/utils/validate.js 1.0.2.src/e107_handlers/tiny_mce/utils/validate.js
--- 1.0.0.src/e107_handlers/tiny_mce/utils/validate.js	2012-10-30 15:39:55.599444443 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/utils/validate.js	2012-10-30 15:40:38.402443337 +0000
@@ -32,7 +32,7 @@
 	},
 
 	isSize : function(s) {
-		return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$');
+		return this.test(s, '^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)?$');
 	},
 
 	isId : function(s) {
diff -x .svn -aruN 1.0.0.src/e107_handlers/tiny_mce/wysiwyg.php 1.0.2.src/e107_handlers/tiny_mce/wysiwyg.php
--- 1.0.0.src/e107_handlers/tiny_mce/wysiwyg.php	2012-10-30 15:39:55.599444443 +0000
+++ 1.0.2.src/e107_handlers/tiny_mce/wysiwyg.php	2012-10-30 15:40:38.403444305 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Tiny MCE controller file.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/tiny_mce/wysiwyg.php $
-|     $Revision: 12152 $
-|     $Id: wysiwyg.php 12152 2011-04-20 20:43:49Z e107coders $
+|     $Revision: 12520 $
+|     $Id: wysiwyg.php 12520 2012-01-07 16:46:16Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -35,6 +35,7 @@
 		$mce_plugins[5]	= (ADMIN) ? "ibrowser" : "";				// Third party plugins - 'image' may not be a valid plugin name
 		//$mce_plugins[6]	= "compat2x";					// May well not be needed - mostly for if we have our own code
 		$mce_plugins[7]	= "paste";
+		$mce_plugins[8]	= "directionality";	
 
 		if(strstr(varset($_SERVER["HTTP_ACCEPT_ENCODING"],""), "gzip") && (ini_get("zlib.output_compression") == false) && file_exists(e_HANDLER."tiny_mce/tiny_mce_gzip.php"))
 		{
@@ -75,6 +76,7 @@
 		$text .= ",charmap,iespell,media";
 		$text .= (ADMIN) ? ",ibrowser" : ",image";
 		$text .= (ADMIN) ? ",code" : "";
+		$text .= ",|,ltr,rtl,|";
 		$text .= "',"; // end of buttons 2
 		
 		$text .= $this->tinyMce_config();
diff -x .svn -aruN 1.0.0.src/e107_handlers/userclass_class.php 1.0.2.src/e107_handlers/userclass_class.php
--- 1.0.0.src/e107_handlers/userclass_class.php	2012-10-30 15:39:55.571444487 +0000
+++ 1.0.2.src/e107_handlers/userclass_class.php	2012-10-30 15:40:38.404444297 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/userclass_class.php $
-|     $Revision: 11678 $
-|     $Id: userclass_class.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: userclass_class.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -40,17 +40,23 @@
 
 function r_userclass($fieldname, $curval = 0, $mode = "off", $optlist = "") {
 	global $pref;
-
+	
+	
 	$text = "<select class='tbox' name='{$fieldname}'>\n";
 	if (!$optlist || strpos($optlist, "public") !== FALSE) {
 		$s = ($curval == e_UC_PUBLIC) ?  "selected='selected'" : "";
 		$text .= "<option  value='".e_UC_PUBLIC."' ".$s.">".UC_LAN_0."</option>\n";
 	}
-
+	if (!$optlist || strpos($optlist, "new") !== FALSE) {
+		$diz = varsettrue($pref['user_new_period']) ? " (".$pref['user_new_period']." ".LANDT_04s.")" : " ";
+		$s = ($curval == e_UC_NEWUSER) ? "selected='selected'" : "";
+		$text .= "<option  value='".e_UC_NEWUSER."' ".$s.">".UC_LAN_9.$diz."</option>\n";
+	}
 	if (!$optlist || strpos($optlist, "guest") !== FALSE) {
 		$s = ($curval == e_UC_GUEST) ? "selected='selected'" : "";
 		$text .= "<option  value='".e_UC_GUEST."' ".$s.">".UC_LAN_1."</option>\n";
 	}
+
 	if (!$optlist || strpos($optlist, "nobody") !== FALSE) {
 		$s = ($curval == e_UC_NOBODY) ? "selected='selected'" : "";
 		$text .= "<option value='".e_UC_NOBODY."' ".$s.">".UC_LAN_2."</option>\n";
@@ -221,12 +227,15 @@
 	{
 		$sql = new db;
 		$class_names[e_UC_PUBLIC] = UC_LAN_0;
+		$class_names[e_UC_NEWUSER] = UC_LAN_9;
 		$class_names[e_UC_GUEST] = UC_LAN_1;
 		$class_names[e_UC_NOBODY] = UC_LAN_2;
 		$class_names[e_UC_MEMBER] = UC_LAN_3;
 		$class_names[e_UC_READONLY] = UC_LAN_4;
 		$class_names[e_UC_ADMIN] = UC_LAN_5;
 		$class_names[e_UC_MAINADMIN] = UC_LAN_6;
+		
+			
 		if ($sql->db_Select("userclass_classes", "userclass_id, userclass_name", "ORDER BY userclass_name", "nowhere"))
 		{
 			while($row = $sql->db_Fetch())
diff -x .svn -aruN 1.0.0.src/e107_handlers/xml_class.php 1.0.2.src/e107_handlers/xml_class.php
--- 1.0.0.src/e107_handlers/xml_class.php	2012-10-30 15:39:55.599444443 +0000
+++ 1.0.2.src/e107_handlers/xml_class.php	2012-10-30 15:40:38.405441597 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_handlers/xml_class.php $
-|     $Revision: 12370 $
-|     $Id: xml_class.php 12370 2011-10-02 17:16:09Z e107steved $
+|     $Revision: 12986 $
+|     $Id: xml_class.php 12986 2012-09-29 14:48:56Z e107steved $
 |     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
@@ -56,13 +56,64 @@
 			// ... and there shouldn't be unprintable characters in the URL anyway
 		}
 				
-		if (function_exists('file_get_contents'))
+		if (function_exists('file_get_contents') && ini_get('allow_url_fopen'))
 		{
 			$old_timeout = e107_ini_set('default_socket_timeout', $timeout);
 			
-			$address = ($this->Url) ? $this->Url : urldecode($address);
+			$address = trim(($this->Url) ? $this->Url : urldecode($address));
 
-			$data = file_get_contents($address);
+
+			/*
+			 *	Following code block can be enabled to give more control over http transfers using file_get_contents()
+			 *	Much of it requires relatively recent versions of PHP (some identified in comments)
+			 *	Its likely that the code will require selective commenting out before use
+			 */
+			if (FALSE && (substr($address, 0, 4) == 'http'))
+			{
+				//Set stream options
+				$opts = array(
+				  'http' => array()
+				);
+				$opts['http']['ignore_errors'] = true;		// PHP >= 5.2.10
+				$opts['http']['timeout'] = 10;				// PHP >= 5.2.1
+				
+				// Can add in additional headers to send (in PHP >= 5.2.10, can have array of extras)
+				$opts['http']['header'] = 'If-Modified-Since: Sat, 3 Sep 2011 11:00:00 GMT';
+				//$opts['http']['header'] = 'If-None-Match: ';
+
+				$ua = ini_get('user_agent');
+				echo 'User agent: '.$ua.'<br />';
+				if (!$ua)
+				{
+					$opts['http']['user_agent'] = $_SERVER['HTTP_USER_AGENT'];		// Some sites need user agent - set to that of current user
+				}
+
+				//Create the stream context
+				$context = stream_context_create($opts);
+				
+				
+				// To display progress of transfer, uncomment the following line
+				stream_context_set_params($context, array('notification' => array($this, 'stream_notification_callback')));
+
+
+				//echo 'Context set for: '.$address.'<br />';
+				
+				
+				// print_a(stream_context_get_params('http'));		// Requires PHP >= 5.3
+
+				// Read the file using the defined context
+				$data = file_get_contents($address, false, $context);
+				if (ADMIN && ($data === FALSE))
+				{
+					echo 'file_get_contents() error on http transfer <br />';
+					// $smd = stream_get_meta_data($context);  Won't work - context will have been closed, presumably
+					// print_a($smd);
+				}
+			}
+			else
+			{
+				$data = file_get_contents($address);
+			}
 
 			// $data = file_get_contents(htmlspecialchars($address));	// buggy - sometimes fails.
 			if ($old_timeout !== FALSE)
@@ -74,16 +125,27 @@
 				$this->xmlFileContents = $data;
 				return $data;
 			}
-			$this->error = "File_get_contents() error";		// Fill in more info later
+			$this->error = 'File_get_contents() error: '.$address;
 			return FALSE;
 		}
-		if (function_exists("curl_init") && function_exists("curl_exec"))
+		
+		if (function_exists('curl_init') && function_exists('curl_exec'))
 		{
 			$cu = curl_init();
 			curl_setopt($cu, CURLOPT_URL, $address);
 			curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
 			curl_setopt($cu, CURLOPT_HEADER, 0);
 			curl_setopt($cu, CURLOPT_TIMEOUT, $timeout);
+			// More options which could be necessary with specific sites
+			//curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');		// Could be needed (alternative on next line)
+			//curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
+			//curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
+			//curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
+			//curl_setopt( $ch, CURLOPT_ENCODING, "" );
+			//curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
+			//curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
+			//curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
+			//curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
 			$this->xmlFileContents = curl_exec($cu);
 			if (curl_error($cu))
 			{
@@ -91,8 +153,9 @@
 				return FALSE;
 			}
 			curl_close($cu);
-			return $this->xmlFileContents;
+			return $this->xmlFileContents;		// Will be FALSE if transfer failed
 		}
+		
 		if (ini_get("allow_url_fopen"))
 		{
 			$old_timeout = e107_ini_set('default_socket_timeout', $timeout);
@@ -135,6 +198,54 @@
 	}
 
 
+
+	/**
+	 *	Callback function which may be invoked to print progress on file_get_contents() if problems
+	 *	(see stream_context_set_params() in method above)
+	 *	Used during debugging only
+	 */
+	function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) 
+	{
+		switch($notification_code) 
+		{
+			case STREAM_NOTIFY_RESOLVE:
+			case STREAM_NOTIFY_AUTH_REQUIRED:
+			case STREAM_NOTIFY_COMPLETED:
+			case STREAM_NOTIFY_FAILURE:
+			case STREAM_NOTIFY_AUTH_RESULT:
+				var_dump($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max);
+				// Ignore 
+				break;
+
+			case STREAM_NOTIFY_REDIRECTED:
+				echo "Being redirected to: ", $message;
+				break;
+
+			case STREAM_NOTIFY_CONNECT:
+				echo "Connected...";
+				break;
+
+			case STREAM_NOTIFY_FILE_SIZE_IS:
+				echo "Got the filesize: ", $bytes_max;
+				break;
+
+			case STREAM_NOTIFY_MIME_TYPE_IS:
+				echo "Found the mime-type: ", $message;
+				break;
+
+			case STREAM_NOTIFY_PROGRESS:
+				echo "Made some progress, downloaded ", $bytes_transferred, " so far";
+				break;
+			
+			default :
+				echo 'Unfiltered progress call: <br />';
+				var_dump($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max);
+		}
+		echo '<br />';
+	}
+
+
+
 	function parseXmlContents ()
 	{
 		foreach($this -> xmlData as $key => $value)
diff -x .svn -aruN 1.0.0.src/e107_images/admin_images/comments_16.png 1.0.2.src/e107_images/admin_images/comments_16.png
--- 1.0.0.src/e107_images/admin_images/comments_16.png	2012-10-30 15:39:55.456444117 +0000
+++ 1.0.2.src/e107_images/admin_images/comments_16.png	2012-10-30 15:40:38.410444193 +0000
@@ -1,5 +1,5 @@
 PNG
 
-   
IHDR         (-S   gAMA  7  
-PLTE~}lmɚμ,QSGXp唔밲~G&[QĻݳӗ¹~kzT \N}~ӺyyΘa|MDRccc`氪gihﭼtx?V􃃒НxꅅoM9ѠQēctϓbIg
[Yʲh褷ٽbhywPmַܬo
-on5;5ϠqɲopuwXYz|ݝyvddBD5@}}ν24[bׁٜ u枪ɥfɶ   tRNS f   tEXtSoftware Adobe ImageReadyqe<   IDAT(cX0El${gDA׺*]PXX4vyTjUCzIҚ
n&j-.g8F.O)^,IApTREZD׭7PU#+gZX촂 qÌ7;vjՁ<$3
=)YqzeF욅ٌ!,]}FqMR`!昄% Дr6Y/    IENDB`
\ No newline at end of file
+   
IHDR         a   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  IDATxb?%  X312 `!'.%'%.ÿ/>|=zW?Ͼג122\ 120j^s9Y%~9t ~ğsI߬pŜAǀ
 #$rˉiY,0}A^'çOp5#y˭O=@  A ]j-y*vK) 8 
+    
+
, $ Ѣ  12)	? A sG+$]   6  %         CILD %/1?qu1;zD~4\''@ 03pa``[V{p4ibAD7/9 A      5     	 B#    
    KK};cv_߀1??_Y^:?MJsP@Lm
<w+Poxw	@ 1qғ<YY1c`y120^d+r˷1@nK a1^wq20|c``ϰ?_?/(8>o,ގA2\=c"O'~e@l/06>b'/18W"`䁨/r#@ 1R Xރ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_images/admin_images/comments_32.png 1.0.2.src/e107_images/admin_images/comments_32.png
--- 1.0.0.src/e107_images/admin_images/comments_32.png	2012-10-30 15:39:55.453443627 +0000
+++ 1.0.2.src/e107_images/admin_images/comments_32.png	2012-10-30 15:40:38.410444193 +0000
@@ -1,9 +1,12 @@
 PNG
 
-   
IHDR           D   gAMA  7   PLTEmQ<<g冄48bߥ*D~quǑhuvD;RKP88섁inkʶƲef񠪹U99h{zGBUBr"#DDͭ   &lWWԊ%$혬53椤uvY[|/NLzrrn	{{glō4
-DEqBBn⪬搔٢א{	BHTR\\w1.mkkS ێފᗹmvȖ\@8tmjj>~O?>řFtVx}^cj΂SYo\eN{ߤo<۱(dquuvK?@j__XXbaw`*y2+/HgA aaugtu?=?*]@W﮶_?l8feywff~dqپBH]ώ߹8g5   tRNS S%   tEXtSoftware Adobe ImageReadyqe<  IDAT8cO 0AP P G0xk)7u'MJOOL4)m9 eot+MK흩tȐCn]@wH5sij21veeyxGK`d`54LK|%gU~6,-234bPlk/&_	4 t+t,?K\-G7o.eu&^KqzDY\}v"6ϛe*,+LLhk!,Y_+O΀-L&,vaIIдg=`y6RM% آ>.
-*3*yR"8.W[i VY̦51yy9DEeO6DVqۅ*
-7}\CFVVeKhlVdժN(4*ꛕUxt_oB{RO[EUAEnQBťwlS6{):6(,rY}y_v_CV!$m;Qrw?<zH
-ڕUT6gz^O1R\0x3wFg^{tww9IAy|NOϟ?鉝9n3<@@
-nD(Zuz	=:nj]f1RSn63˒s|
-'YOAHV*dU@B]ʛ r<    IENDB`
\ No newline at end of file
+   
IHDR           szz   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  	IDATxb?@ bb` @  p 8$/ï_I 2bbϠdZ33h3$;P߯; Õ?  b)ox<xME8UdTXYX31w?s|-ntFb`x b X.Z`iyy7y=~cVE
+>VK h G10<mg۞0_sWO;30,   dd眦lݎƽ??gD
+-#ps
uvg3|[V,[P ?>3ȳ
+v6~*C["nn__3dg3(*r662LSÇ5u$r+0`xauU͡?00<9  @8(oWkS?oRw͛Tc8~l]O{ˉXq20H p6J[Q000}`x/O?LMX8_9`-{W$dM|TFs20mfdHHd`( A[$Y),_/2S;ÉVX( T-ÇwXXyV^pf``dx{-0Q z89Z1Ȗ3ĩ+$9n gCQb
+ È
e`˗/ax<40c}|c`OgN`PVRb02a`c!4My1_d0np sQ2?ބh``a`L}8r3?p1QI)!`T"މ3\pAXH?f1'$@ٯ72%0(w1 v :+7 1
+,j2m\ȐȢ`AFh?h,}' A_)gT0(L"M.%^!AN!7 VvvF`Jd
V31<"(>#"P< v+F`4 j$Yٗ3 v7_T	ܽ0* U:B `0OhA
+P0{W`
 vWy%ʪ(	'3C7ßz?bpCfd倅 \?3]s`r1}d5@ ퟭ;Dpָ12|%ԗxO`'Lbc{'^X2蚿ww?
 lĂ-YyMq%HpB!]\42Pm9l`ysAj+4
+$ðlGNE^Mם@/{w_ 9l_\jB_f@ȍFNwq>@˫¢@<bsmO K# |j\@A d_QmqU @( k3C[o/
+@,s֛k}W@>Mod1!oFG&0;\3"XsbfHl4+Rd:
2<+S`Z	dF?zHks?8@Jc?.̰b͵-k@22 
D?q3N @`(/$ KH*0fw/fޣwgtnPu )  ! AFIƛρh6d$3l` };7_sp?`p246!@  &`Vvb0#LA'ï~<`cxp>=YesK ӊ(0?3`,L5[`A3* &˂	Ȓ_+_2< l0 K'e/h/  Df/(~P
+ q; 4]3 p  op_[    IENDB`
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_administrator.php 1.0.2.src/e107_languages/English/admin/lan_administrator.php
--- 1.0.0.src/e107_languages/English/admin/lan_administrator.php	2012-10-30 15:39:55.604444412 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_administrator.php	2012-10-30 15:40:38.470444538 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_administrator.php $
-|     $Revision: 11678 $
-|     $Id: lan_administrator.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12903 $
+|     $Id: lan_administrator.php 12903 2012-07-23 07:37:12Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -78,6 +78,9 @@
 define("ADMSLAN_69", "is already an administrator and must be edited.");
 
 define("ADMSLAN_70", "Return to Administrator Listing");
-define("ADMSLAN_71", "Click here to display privileges");  
+define("ADMSLAN_71", "Click here to display privileges"); 
+
+//v1.0.2 and v2
+define("ADMSLAN_76", "Manage language-packs");
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_admin.php 1.0.2.src/e107_languages/English/admin/lan_admin.php
--- 1.0.0.src/e107_languages/English/admin/lan_admin.php	2012-10-30 15:39:55.604444412 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_admin.php	2012-10-30 15:40:38.470444538 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_admin.php $
-|     $Revision: 12315 $
-|     $Id: lan_admin.php 12315 2011-07-08 03:02:34Z e107coders $
+|     $Revision: 12522 $
+|     $Id: lan_admin.php 12522 2012-01-09 01:50:50Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -282,4 +282,6 @@
 define("LAN_SECURITYL_5", "Balanced");
 define("LAN_SECURITYL_8", "High");
 define("LAN_SECURITYL_10", "Insane");
+
+define("LAN_PLEASEWAIT","Please Wait");
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_download.php 1.0.2.src/e107_languages/English/admin/lan_download.php
--- 1.0.0.src/e107_languages/English/admin/lan_download.php	2012-10-30 15:39:55.605481038 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_download.php	2012-10-30 15:40:38.472444300 +0000
@@ -4,9 +4,9 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_download.php $
-|     $Revision: 12132 $
-|     $Id: lan_download.php 12132 2011-04-12 21:25:31Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12599 $
+|     $Id: lan_download.php 12599 2012-02-27 14:31:16Z nlstart $
+|     $Author: nlstart $
 +----------------------------------------------------------------------------+
 */
 define("DOWLAN_1", "Download added to database.");
@@ -146,4 +146,10 @@
 
 define("DOWLAN_160", "Prevent simultaneous downloads by individual users");
 define("DOWLAN_161", "Using a splash page to delay the downloading of files");
+
+define("DOWLAN_162", "Requests for");
+define("DOWLAN_163", "User");
+define("DOWLAN_164", "IP");
+define("DOWLAN_165", "Date / time");
+define("DOWLAN_166", "Return to Downloads Front Page");
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_language.php 1.0.2.src/e107_languages/English/admin/lan_language.php
--- 1.0.0.src/e107_languages/English/admin/lan_language.php	2012-10-30 15:39:55.604444412 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_language.php	2012-10-30 15:40:38.473441582 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_language.php $
-|     $Revision: 11842 $
-|     $Id: lan_language.php 11842 2010-10-04 07:43:15Z e107coders $
+|     $Revision: 12553 $
+|     $Id: lan_language.php 12553 2012-01-14 12:53:11Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -48,5 +48,7 @@
 define("LANG_LAN_30", "Release Date");
 define("LANG_LAN_31", "Compatibility");
 define("LANG_LAN_32", "Installed Languages");
+define("LANG_LAN_33", "Display only errors during verification");
+define("LANG_LAN_34", "Please verify and correct the remaining [x] error(s) before attempting to create a language-pack.");
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_modcomment.php 1.0.2.src/e107_languages/English/admin/lan_modcomment.php
--- 1.0.0.src/e107_languages/English/admin/lan_modcomment.php	2012-10-30 15:39:55.604444412 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_modcomment.php	2012-10-30 15:40:38.474444345 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_modcomment.php $
-|     $Revision: 11678 $
-|     $Id: lan_modcomment.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: lan_modcomment.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -16,6 +16,7 @@
 define("MDCLAN_5", "unblock");
 define("MDCLAN_6", "block");
 
+define("MDCLAN_7", "approve");
 define("MDCLAN_8", "Moderate Comments");
 define("MDCLAN_9", "Warning! Deleting Parent comments will also delete all replies!");
 
@@ -26,7 +27,7 @@
 define("MDCLAN_14", "lock comments");
 define("MDCLAN_15", "open");
 define("MDCLAN_16", "locked");
-define("MDCLAN_17", "");
+define("MDCLAN_17", "There are no comments pending approval at this time");
 define("MDCLAN_18", "");
 define("MDCLAN_19", "");
 define("MDCLAN_20", "");
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_notify.php 1.0.2.src/e107_languages/English/admin/lan_notify.php
--- 1.0.0.src/e107_languages/English/admin/lan_notify.php	2012-10-30 15:39:55.607443892 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_notify.php	2012-10-30 15:40:38.475444425 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_notify.php $
-|     $Revision: 11678 $
-|     $Id: lan_notify.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: lan_notify.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -35,4 +35,7 @@
 define("NF_LAN_1", "File Events");
 define("NF_LAN_2", "File uploaded by user");
 
+define("CM_LAN_1", "Comment Events");
+define("CM_LAN_2", "Comment posted by user which is pending approval");
+
 ?>
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_prefs.php 1.0.2.src/e107_languages/English/admin/lan_prefs.php
--- 1.0.0.src/e107_languages/English/admin/lan_prefs.php	2012-10-30 15:39:55.604444412 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_prefs.php	2012-10-30 15:40:38.475444425 +0000
@@ -10,7 +10,7 @@
  * Site preferences - language file
  *
  * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_prefs.php $
- * $Id: lan_prefs.php 12013 2010-12-18 22:55:22Z e107steved $
+ * $Id: lan_prefs.php 12892 2012-07-21 03:20:42Z e107coders $
  */
 
 define("PRFLAN_1", "Site Information");
@@ -179,7 +179,7 @@
 define("PRFLAN_169", "If the chosen group contains more than one person, the user will be asked to select a person from the group.");
 
 define("PRFLAN_170", "Use reverse DNS to allow host banning");
-define("PRFLAN_171", "Turning this option on will allow you to ban users by hostname, rather then just IP or email address.  <br />NOTE: This may affect pageload times on some hosts");
+define('PRFLAN_171', "Turning this option on will allow you to ban users by hostname, rather than just IP or email address.  <br />NOTE: This may affect pageload times on some hosts");
 define("PRFLAN_172", "Login Name maximum length (10..100)");
 define("PRFLAN_173", "Check for E107 updates once/day");
 
@@ -200,5 +200,7 @@
 define('PRFLAN_220', 'HTML Abuse filter (experimental)');
 define('PRFLAN_221', 'Blocks some unmatched tags for those allowed to post HTML');
 
+define('PRFLAN_222', 'Moderate Comments made by');
+define('PRFLAN_223', 'Comments will require manual approval by an admin prior to being visible to other users');
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/admin/lan_users.php 1.0.2.src/e107_languages/English/admin/lan_users.php
--- 1.0.0.src/e107_languages/English/admin/lan_users.php	2012-10-30 15:39:55.607443892 +0000
+++ 1.0.2.src/e107_languages/English/admin/lan_users.php	2012-10-30 15:40:38.477441933 +0000
@@ -4,9 +4,9 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/admin/lan_users.php $
-|     $Revision: 11897 $
-|     $Id: lan_users.php 11897 2010-10-16 20:13:13Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12892 $
+|     $Id: lan_users.php 12892 2012-07-21 03:20:42Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 define("USRLAN_1", "Options Saved.");
@@ -203,6 +203,10 @@
 define("DUSRLAN_36", "Password Change");
 define("DUSRLAN_37", "XUP");
 
+define('USRLAN_190', 'New user probationary period (days)');
+define('USRLAN_191', '(admin can impose restrictions during this period in some areas)');
+
+define('USRLAN_194', 'Signature may be modified by');
 define('USRLAN_219', 'Older than 30 days');     
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/lan_comment.php 1.0.2.src/e107_languages/English/lan_comment.php
--- 1.0.0.src/e107_languages/English/lan_comment.php	2012-10-30 15:39:55.602446085 +0000
+++ 1.0.2.src/e107_languages/English/lan_comment.php	2012-10-30 15:40:38.477441933 +0000
@@ -9,7 +9,7 @@
  * Comment handling - language files
  *
  * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/lan_comment.php $
- * $Id: lan_comment.php 11687 2010-08-23 07:25:47Z e107steved $
+ * $Id: lan_comment.php 12892 2012-07-21 03:20:42Z e107coders $
  */
 
 define("COMLAN_0", "[blocked by admin]");
@@ -57,6 +57,7 @@
 define("COMLAN_328", 'Comments are locked');
 define("COMLAN_329", 'Unauthorized');
 define("COMLAN_330", 'IP:');
+define("COMLAN_331", "Pending Approval");
 
 define("COMLAN_TYPE_1", "news");
 define("COMLAN_TYPE_2", "download");
diff -x .svn -aruN 1.0.0.src/e107_languages/English/lan_installer.php 1.0.2.src/e107_languages/English/lan_installer.php
--- 1.0.0.src/e107_languages/English/lan_installer.php	2012-10-30 15:39:55.609476670 +0000
+++ 1.0.2.src/e107_languages/English/lan_installer.php	2012-10-30 15:40:38.478444340 +0000
@@ -124,7 +124,7 @@
 
 // v1.0 - Be sure to re-check ALL translations above for modifications and additions. 
 
-define('LANINS_109',	'Inititated');
+define('LANINS_109',	'Initiated');
 define('LANINS_110',	'Complete');
 define('LANINS_111',	'e107 Themes');
 define('LANINS_112',	'e107 Handbook');
diff -x .svn -aruN 1.0.0.src/e107_languages/English/lan_notify.php 1.0.2.src/e107_languages/English/lan_notify.php
--- 1.0.0.src/e107_languages/English/lan_notify.php	2012-10-30 15:39:55.609476670 +0000
+++ 1.0.2.src/e107_languages/English/lan_notify.php	2012-10-30 15:40:38.479444435 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/lan_notify.php $
-|     $Revision: 11678 $
-|     $Id: lan_notify.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: lan_notify.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -33,4 +33,6 @@
 define("NT_LAN_ND_1", "News Item Deleted");
 define("NT_LAN_ND_2", "Deleted news item id");
 
+define("NT_LAN_CM_1", "User Comment Pending Approval");
+
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_languages/English/lan_userclass.php 1.0.2.src/e107_languages/English/lan_userclass.php
--- 1.0.0.src/e107_languages/English/lan_userclass.php	2012-10-30 15:39:55.608445225 +0000
+++ 1.0.2.src/e107_languages/English/lan_userclass.php	2012-10-30 15:40:38.482444095 +0000
@@ -4,8 +4,8 @@
 |     e107 website system - Language File.
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_languages/English/lan_userclass.php $
-|     $Revision: 11678 $
-|     $Id: lan_userclass.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12892 $
+|     $Id: lan_userclass.php 12892 2012-07-21 03:20:42Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -16,4 +16,8 @@
 define("UC_LAN_4", "Read Only");
 define("UC_LAN_5", "Admin");
 define("UC_LAN_6", "Main Admin");
+
+define('UC_LAN_9','New Users');
+define('UC_LAN_10', 'Search Bots');
+
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/alt_auth_adminmenu.php 1.0.2.src/e107_plugins/alt_auth/alt_auth_adminmenu.php
--- 1.0.0.src/e107_plugins/alt_auth/alt_auth_adminmenu.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/alt_auth_adminmenu.php	2012-10-30 15:40:38.483444490 +0000
@@ -1,42 +1,82 @@
 <?php
+/*
++ ----------------------------------------------------------------------------+
+|     e107 website system
+|
+|     Steve Dunstan 2001-2002
+|     Copyright (C) 2008-2010 e107 Inc (e107.org)
+|
+|
+|     Released under the terms and conditions of the
+|     GNU General Public License (http://gnu.org).
+|
+|     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/alt_auth/alt_auth_adminmenu.php $
+|     $Revision: 12556 $
+|     $Id: alt_auth_adminmenu.php 12556 2012-01-15 02:16:00Z e107coders $
+|     $Author: e107coders $
++----------------------------------------------------------------------------+
+*/
 
 function alt_auth_get_authlist()
 {
-	$authlist = array("e107");
-	$handle=opendir(e_PLUGIN."alt_auth");
+	$authlist = array('e107');
+	$handle   = opendir(e_PLUGIN.'alt_auth');
+	
 	while ($file = readdir($handle))
 	{
-		if(preg_match("/^(.*)_auth\.php/",$file,$match))
+		if (preg_match('/^(.*)_auth\.php/', $file, $match))
 		{
-			$authlist[] = $match[1];
-		}
+			$authlist[] = $match[1];	
+		}  
 	}
+	
 	closedir($handle);
+	
 	return $authlist;
 }
 
 function alt_auth_adminmenu()
 {
-	global $authlist;
-	echo " ";
-	if(!is_array($authlist))
+	include_lan(e_PLUGIN."alt_auth/languages/".e_LANGUAGE."/lan_alt_auth_conf.php");
+	
+	$authlist = alt_auth_get_authlist();
+	
+	if (!defined('ALT_AUTH_ACTION'))
 	{
-		$authlist = alt_auth_get_authlist();
-	}
-	define("ALT_AUTH_ACTION", "main");
+		define('ALT_AUTH_ACTION', 'main');	
+	}  
 
-	$var['main']['text'] = "Main config";
-	$var['main']['link'] = e_PLUGIN."alt_auth/alt_auth_conf.php";
-	show_admin_menu("alt auth", ALT_AUTH_ACTION, $var);
-	$var = array();
-	foreach($authlist as $a)
+	$var['main']['text'] = LAN_PREFS;
+	$var['main']['link'] = e_PLUGIN.'alt_auth/alt_auth_conf.php';
+		
+	
+	foreach ($authlist as $a)
 	{
-		if($a != 'e107')
+		if ('e107' != $a)
 		{
-			$var[$a]['text'] = "Config {$a}";
-			$var[$a]['link'] = e_PLUGIN."alt_auth/{$a}_conf.php";
+			$var[$a]['text'] = LAN_CONFIGURE." [ ".$a." ]";
+			$var[$a]['link'] = e_PLUGIN.'alt_auth/'.$a.'_conf.php';
 		}
 	}
-	show_admin_menu("Auth methods", ALT_AUTH_ACTION, $var);
+	
+	show_admin_menu(LAN_ALT_PAGE, ALT_AUTH_ACTION, $var);
+}
+
+
+#
+#	Admin menus for the different pages
+#
+function alt_auth_conf_adminmenu()
+{
+	alt_auth_adminmenu();
 }
-?>
\ No newline at end of file
+
+function ldap_conf_adminmenu()
+{
+	alt_auth_adminmenu();
+}
+
+function otherdb_conf_adminmenu()
+{
+	alt_auth_adminmenu();
+}
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/alt_auth_conf.php 1.0.2.src/e107_plugins/alt_auth/alt_auth_conf.php
--- 1.0.0.src/e107_plugins/alt_auth/alt_auth_conf.php	2012-10-30 15:39:55.532444428 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/alt_auth_conf.php	2012-10-30 15:40:38.483444490 +0000
@@ -4,112 +4,109 @@
 |     e107 website system
 |
 |     Copyright (C) 2001-2002 Steve Dunstan (jalist@e107.org)
-|     Copyright (C) 2008-2010 e107 Inc (e107.org)
-|
+|     Copyright (C) 2008-2012 e107 Inc (e107.org)
 |
 |     Released under the terms and conditions of the
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/alt_auth/alt_auth_conf.php $
-|     $Revision: 11678 $
-|     $Id: alt_auth_conf.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12556 $
+|     $Id: alt_auth_conf.php 12556 2012-01-15 02:16:00Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
+
 $eplug_admin = true;
-require_once("../../class2.php");
-if(!getperms("P")){header("location:".e_BASE."index.php"); exit; }
-require_once(e_HANDLER."form_handler.php");
-require_once(e_ADMIN."auth.php");
-include_lan(e_PLUGIN."alt_auth/languages/".e_LANGUAGE."/lan_alt_auth_conf.php");
-define("ALT_AUTH_ACTION", "main");
-require_once(e_PLUGIN."alt_auth/alt_auth_adminmenu.php");
 
-if(isset($_POST['updateprefs']))
+require_once '../../class2.php';
+
+if (!getperms('P'))  { header('Location:'.e_BASE.'index.php'); exit; }
+
+
+include_lan(e_PLUGIN.'alt_auth/languages/'.e_LANGUAGE.'/lan_alt_auth_conf.php');
+define('ALT_AUTH_ACTION', 'main');
+
+require_once e_PLUGIN.'alt_auth/alt_auth_adminmenu.php';
+require_once e_HANDLER.'form_handler.php';
+require_once e_ADMIN.'auth.php';
+
+if (isset($_POST['updateprefs']))
 {
 	$pref['auth_method'] = $_POST['auth_method'];
 	$pref['auth_noconn'] = intval($_POST['auth_noconn']);
 	$pref['auth_nouser'] = intval($_POST['auth_nouser']);
+	
 	save_prefs();
-	header("location:".e_SELF);
-	exit;
+	
+	$_POST   = array();
+	$message = LAN_UPDATED;
 }
 
-$authlist = alt_auth_get_authlist();
-
-$auth_dropdown = "<select class='tbox' name='auth_method'>\n";
-foreach($authlist as $a)
-{
-	$s = ($pref['auth_method'] == $a) ? "selected='selected'" : "";
-	$auth_dropdown .= "<option value='{$a}' {$s}>".$a."</option>\n";
-}
-$auth_dropdown .= "</select>\n";
+$auth_dropdown = '';
 
-if(isset($message))
+foreach (alt_auth_get_authlist() as $a)
 {
-	$ns -> tablerender("", "<div style='text-align:center'><b>".$message."</b></div>");
+	$auth_dropdown.= '
+									<option value="'.$a.'"'.($pref['auth_method'] == $a ? ' selected="selected"' : '').'>'.$a.'</option>';
 }
 
-$text = "
-<div style='text-align:center'>
-<form method='post' action='".e_SELF."'>
-<table style='width:95%' class='fborder' cellspacing='1' cellpadding='0'>
-
-<tr>
-<td style='width:70%' class='forumheader3'>".LAN_ALT_1.": </td>
-<td style='width:30%; text-align:right;' class='forumheader3'>".
-$auth_dropdown."
-</td>
-</tr>
-
-<tr>
-<td style='width:70%' class='forumheader3'>".LAN_ALT_6.":<br />
-<div class='smalltext'>".LAN_ALT_7."</div>
-</td>
-<td style='width:30%; text-align:right;' class='forumheader3'>
-<select class='tbox' name='auth_noconn'>";
-$sel = (isset($pref['auth_noconn']) && $pref['auth_noconn'] ? "" : " selected = 'selected' ");
-$text .= "<option value='0' {$sel} >".LAN_ALT_FAIL."</option>";
-$sel = (isset($pref['auth_noconn']) && $pref['auth_noconn'] ? " selected = 'selected' " : "");
-$text .= "<option value='1' {$sel} >".LAN_ALT_FALLBACK."</option>
-</select>
-</td>
-</tr>
-
-<tr>
-<td style='width:70%' class='forumheader3'>".LAN_ALT_8.":<br />
-<div class='smalltext'>".LAN_ALT_9."</div>
-</td>
-<td style='width:30%; text-align:right;' class='forumheader3'>
-<select class='tbox' name='auth_nouser'>";
-$sel = (isset($pref['auth_nouser']) && $pref['auth_nouser'] ? "" : " selected = 'selected' ");
-$text .= "<option value='0' {$sel} >".LAN_ALT_FAIL."</option>";
-$sel = (isset($pref['auth_nouser']) && $pref['auth_nouser'] ? " selected = 'selected' " : "");
-$text .= "<option value='1' {$sel} >".LAN_ALT_FALLBACK."</option>
-</select>
-</td>
-</tr>
-
-<tr style='vertical-align:top'> 
-<td colspan='2'  style='text-align:center' class='forumheader3'>
-<br />
-<input class='button' type='submit' name='updateprefs' value='".LAN_ALT_2."' />
-</td>
-</tr>
-
-</table>
-</form>
-</div>";
+if (varsettrue($message))  $ns->tablerender('', '<div style="text-align:center"><strong>'.$message.'</strong></div>');
 
-$ns -> tablerender("<div style='text-align:center'>".LAN_ALT_3."</div>", $text);
+$text = '	<div style="text-align:center">
+				<form method="post" action="'.e_SELF.'">
+					<table class="fborder" style="'.ADMIN_WIDTH.'" cellspacing="1" cellpadding="0">
+						<tr>
+							<td style="width:70%" class="forumheader3">
+								'.LAN_ALT_2.':
+							</td>
+							<td style="width:30%; text-align:right;" class="forumheader3">
+								<select class="tbox" name="auth_method">'.
+									$auth_dropdown.'
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<td class="forumheader3">
+								'.LAN_ALT_6.':<br />
+								<div class="smalltext">
+									'.LAN_ALT_7.'
+								</div>
+							</td>
+							<td style="text-align:right;" class="forumheader3">
+								<select class="tbox" name="auth_noconn">
+									<option value="0"'.(varsettrue($pref['auth_noconn']) ? '' : ' selected="selected"').'>'.LAN_ALT_10.'</option>
+									<option value="1"'.(varsettrue($pref['auth_noconn']) ? ' selected="selected"' : '').'>'.LAN_ALT_11.'</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<td class="forumheader3">
+								'.LAN_ALT_8.':<br />
+								<div class="smalltext">
+									'.LAN_ALT_9.'
+								</div>
+							</td>
+							<td style="text-align:right;" class="forumheader3">
+								<select class="tbox" name="auth_nouser">
+									<option value="0"'.(varsettrue($pref['auth_nouser']) ? '' : ' selected="selected"').'>'.LAN_ALT_10.'</option>
+									<option value="1"'.(varsettrue($pref['auth_nouser']) ? ' selected="selected"' : '').'>'.LAN_ALT_11.'</option>
+								</select>
+							</td>
+						</tr>
+						<tr style="vertical-align:top"> 
+							<td colspan="2"  style="text-align:center" class="forumheader3">
+								<br />
+								<input class="button" type="submit" name="updateprefs" value="'.LAN_UPDATE.'" />
+							</td>
+						</tr>
+					</table>
+				</form>
+			</div>';
 
 
-require_once(e_ADMIN."footer.php");
+$ns->tablerender(LAN_ALT_3,$text);
 
-function alt_auth_conf_adminmenu()
-{
-	alt_auth_adminmenu();
-}
+require_once e_ADMIN.'footer.php';
 
 
-?>	
\ No newline at end of file
+?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_alt_auth_conf.php 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_alt_auth_conf.php
--- 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_alt_auth_conf.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_alt_auth_conf.php	2012-10-30 15:40:38.484444737 +0000
@@ -1,15 +1,15 @@
 <?php
-define("LAN_ALT_1", "Current authorization type");
-define("LAN_ALT_2", "Update settings");
-define("LAN_ALT_3", "Choose Alternate Authorization Type");
-define("LAN_ALT_4", "Configure parameters for");
-define("LAN_ALT_5", "Configure authorization parameters");
-define("LAN_ALT_6", "Failed connection action");
-define("LAN_ALT_7", "If connection to the alternate method fails, how should that be handled?");
-define("LAN_ALT_8", "User not found action");
-define("LAN_ALT_9", "If username is not found using alternate method, how should that be handled?");
 
-define("LAN_ALT_FALLBACK", "Use e107 user table");
-define("LAN_ALT_FAIL", "Failed login");
 
-?>
+define('LAN_ALT_2', 'Current authorization type');
+define('LAN_ALT_3', 'Choose Alternative Authorization Type');
+define('LAN_ALT_4', 'Configure parameters for');
+define('LAN_ALT_5', 'Configure authorization parameters');
+define('LAN_ALT_6', 'Failed connection action');
+define('LAN_ALT_7', 'If connection to the alternate method fails, how should that be handled?');
+define('LAN_ALT_8', 'User not found action');
+define('LAN_ALT_9', 'If username is not found using alternate method, how should that be handled?');
+define('LAN_ALT_10', 'Failed login');
+define('LAN_ALT_11', 'Use e107 user table');
+
+define('LAN_ALT_PAGE', 'Alternative authentication');
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php
--- 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php	2012-10-30 15:40:38.485441872 +0000
@@ -1,15 +1,13 @@
 <?php
-define("LDAPLAN_1", "Server address");
-define("LDAPLAN_2", "Base DN or Domain<br />If LDAP - Enter BaseDN<br />If AD - Enter domain");
-define("LDAPLAN_3", "LDAP Browsing user<br />Full context of the user who is able to search the directory.");
-define("LDAPLAN_4", "LDAP Browsing password<br />Password for the LDAP Browsing user.");
-define("LDAPLAN_5", "LDAP Version");
-define("LDAPLAN_6", "Configure LDAP auth");
-define("LDAPLAN_7", "eDirectory search filter:");
-define("LDAPLAN_8", "This will be used to ensure the username is in the correct tree, <br />ie '(objectclass=inetOrgPerson)'");
-define("LDAPLAN_9", "Current search filter will be:");
-define("LDAPLAN_10", "Settings Updated");
-define("LDAPLAN_11", "WARNING:  It appears as if the ldap module is not currently available, setting your auth method to LDAP will probably not work!");
-define("LDAPLAN_12", "Server Type");
-define("LDAPLAN_13", "Update settings");
-?>
+
+define('LDAPLAN_1',  'Server address');
+define('LDAPLAN_2',  'Base DN or Domain<br />If LDAP - Enter BaseDN<br />If AD - Enter domain');
+define('LDAPLAN_3',  'LDAP Browsing user<br />Full context of the user who is able to search the directory.');
+define('LDAPLAN_4',  'LDAP Browsing password<br />Password for the LDAP Browsing user.');
+define('LDAPLAN_5',  'LDAP Version');
+define('LDAPLAN_6',  'Configure LDAP auth');
+define('LDAPLAN_7',  'eDirectory search filter:');
+define('LDAPLAN_8',  'This will be used to ensure the username is in the correct tree,<br />ie \'(objectclass=inetOrgPerson)\'');
+define('LDAPLAN_9',  'Current search filter will be:');
+define('LDAPLAN_10', 'WARNING: If the LDAP module is not currently available, setting your auth method to LDAP will probably not work!');
+define('LDAPLAN_11', 'Server Type');
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php
--- 1.0.0.src/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php	2012-10-30 15:40:38.485441872 +0000
@@ -1,14 +1,13 @@
 <?php
-define("OTHERDB_LAN_1", "Database Type:");
-define("OTHERDB_LAN_2", "Server:");
-define("OTHERDB_LAN_3", "Username:");
-define("OTHERDB_LAN_4", "Password:");
-define("OTHERDB_LAN_5", "Database");
-define("OTHERDB_LAN_6", "Table");
-define("OTHERDB_LAN_7", "Username Field:");
-define("OTHERDB_LAN_8", "Password Field:");
-define("OTHERDB_LAN_9", "Password Method:");
-define("OTHERDB_LAN_10", "Configure otherdb auth");
-define("OTHERDB_LAN_11", "** The following fields are not required if using an e107 database");
 
-?>
+define('OTHERDB_LAN_1',  'Database Type:');
+define('OTHERDB_LAN_2',  'Server:');
+define('OTHERDB_LAN_3',  'Username:');
+define('OTHERDB_LAN_4',  'Password:');
+define('OTHERDB_LAN_5',  'Database');
+define('OTHERDB_LAN_6',  'Table');
+define('OTHERDB_LAN_7',  'Username Field:');
+define('OTHERDB_LAN_8',  'Password Field:');
+define('OTHERDB_LAN_9',  'Password Method:');
+define('OTHERDB_LAN_10', 'Configure OtherDB auth');
+define('OTHERDB_LAN_11', '** The following fields are not required if using an e107 database');
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/ldap_conf.php 1.0.2.src/e107_plugins/alt_auth/ldap_conf.php
--- 1.0.0.src/e107_plugins/alt_auth/ldap_conf.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/ldap_conf.php	2012-10-30 15:40:38.485441872 +0000
@@ -11,123 +11,127 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/alt_auth/ldap_conf.php $
-|     $Revision: 11678 $
-|     $Id: ldap_conf.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12556 $
+|     $Id: ldap_conf.php 12556 2012-01-15 02:16:00Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
+
 $eplug_admin = true;
-require_once("../../class2.php");
-require_once(e_ADMIN."auth.php");
-require_once(e_HANDLER."form_handler.php");
-include_lan(e_PLUGIN."alt_auth/languages/".e_LANGUAGE."/lan_ldap_auth.php");
-define("ALT_AUTH_ACTION", "ldap");
-require_once(e_PLUGIN."alt_auth/alt_auth_adminmenu.php");
-
-
-$server_types[1]="LDAP";
-$server_types[2]="ActiveDirectory";
-$server_types[3]="eDirectory";
 
-$ldap_ver[1]="2";
-$ldap_ver[2]="3";
+require_once '../../class2.php';
+
+include_lan(e_PLUGIN.'alt_auth/languages/'.e_LANGUAGE.'/lan_ldap_auth.php');
+define('ALT_AUTH_ACTION', 'ldap');
+
+require_once e_PLUGIN.'alt_auth/alt_auth_adminmenu.php';
+require_once e_HANDLER.'form_handler.php';
+require_once e_ADMIN.'auth.php';
+
+$ldap_ver     = array(1=>'2',    2=>'3');
+$server_types = array(1=>'LDAP', 2=>'ActiveDirectory', 3=>'eDirectory');
 
-if($_POST['update'])
+if ($_POST['update'])
 {
-	foreach($_POST as $k => $v)
+	foreach($_POST as $k=>$v)
 	{
-		if(preg_match("/ldap_/", $k))
+		if (preg_match('/ldap_/', $k))
 		{
-			if($sql -> db_Select("alt_auth", "*", "auth_type='ldap' AND auth_parmname='{$k}' "))
-			{
-				$sql -> db_Update("alt_auth", "auth_parmval='{$v}' WHERE  auth_type='ldap' AND auth_parmname='{$k}' ");
-			}
+			if (!$sql)  $sql = new db();
+			if ($sql->db_Select('alt_auth', '*', "auth_type='ldap' AND auth_parmname='{$k}' "))
+				$sql->db_Update('alt_auth', "auth_parmval='{$v}' WHERE  auth_type='ldap' AND auth_parmname='{$k}' ");
 			else
-			{
-				$sql -> db_Insert("alt_auth", "'ldap','{$k}','{$v}' ");
-			}
+				$sql->db_Insert('alt_auth', "'ldap','{$k}','{$v}' ");
 		}
 	}
-	$message = LDAPLAN_10;
+	
+	$message = LAN_UPDATED;
 }
 
-if(!function_exists('ldap_connect'))
-{
-	$message = "<div style='color:#f00; font-weight:bold'>".LDAPLAN_11."</div>";
-}
+$ldap['ldap_edirfilter'] == '';
 
-if($message)
-{
-	$ns->tablerender("","<div style='text-align:center;'>".$message."</div>");
-}
+$sql->db_Select('alt_auth', '*', "auth_type = 'ldap' ");
 
-$ldap['ldap_edirfilter'] == "";
-$sql -> db_Select("alt_auth", "*", "auth_type = 'ldap' ");
-while($row = $sql->db_Fetch())
-{
-	$ldap[$row['auth_parmname']] = $row['auth_parmval'];
-}
+while($row = $sql->db_Fetch())  $ldap[$row['auth_parmname']] = $row['auth_parmval'];
 
 $current_filter = "(&(cn=[USERNAME]){$ldap['ldap_edirfilter']})";
 
-$frm = new form;
-$text = $frm -> form_open("POST",e_SELF);
-$text .= "<table style='width:96%'>";
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_12."</td><td class='forumheader3'>";
-$text .= $frm -> form_select_open("ldap_servertype");
-foreach($server_types as $v)
-{
-	$sel = ($ldap['ldap_servertype'] == $v) ? " Selected" : "";
-	$text .= $frm -> form_option($v, $sel, $v);
-}
-$text .= $frm -> form_select_close();
-$text .= "</td></tr>";
-
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_1."</td><td class='forumheader3'>";
-$text .= $frm -> form_text("ldap_server", 35, $ldap['ldap_server'], 120);
-$text .= "</td></tr>";
+$frm  = new form;
+$text = '
+		'.$frm->form_open('post', e_SELF).'
+			<table style="width:96%">
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_11.'</td>
+					<td class="forumheader3">
+						'.$frm->form_select_open('ldap_servertype');
+
+						foreach($server_types as $v)
+						{
+							$text.= $frm->form_option($v, ($ldap['ldap_servertype'] == $v ? 'selected' : ''), $v);	
+						}  
+
+$text .= '
+						'.$frm->form_select_close().'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_1.'</td>
+					<td class="forumheader3">
+						'.$frm->form_text('ldap_server', 35, $ldap['ldap_server'], 120).'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_2.'</td>
+					<td class="forumheader3">
+						'.$frm->form_text('ldap_basedn', 35, $ldap['ldap_basedn'], 120).'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_3.'</td>
+					<td class="forumheader3">
+						'.$frm->form_text('ldap_user', 35, $ldap['ldap_user'], 120).'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_4.'</td>
+					<td class="forumheader3">
+						'.$frm->form_text('ldap_passwd', 35, $ldap['ldap_passwd'], 120).'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">'.LDAPLAN_5.'</td>
+					<td class="forumheader3">
+						'.$frm->form_select_open('ldap_version');
+
+foreach($ldap_ver as $v)  $text.= '
+							'.$frm->form_option($v, ($ldap['ldap_version'] == $v ? ' '.LAN_ALT_AUTH_12 : ''), $v);
+
+$text .= '
+						'.$frm->form_select_close().'
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader3">
+						'.LDAPLAN_7.'<br />
+						<span class="smalltext">'.LDAPLAN_8.'</span>
+					</td>
+					<td class="forumheader3">
+						'.$frm->form_text('ldap_edirfilter', 35, $ldap['ldap_edirfilter'], 120).'<br />
+						<span class="smalltext">'.LDAPLAN_9.'<br />'.$current_filter.'</span>
+					</td>
+				</tr>
+				<tr>
+					<td class="forumheader" colspan="2" style="text-align:center;">
+						'.$frm->form_button('submit', 'update', LAN_UPDATE).'
+					</td>
+				</tr>
+			</table>
+		'.$frm->form_close();
 
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_2."</td><td class='forumheader3'>";
-$text .= $frm -> form_text("ldap_basedn", 35, $ldap['ldap_basedn'], 120);
-$text .= "</td></tr>";
 
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_3."</td><td class='forumheader3'>";
-$text .= $frm -> form_text("ldap_user", 35, $ldap['ldap_user'], 120);
-$text .= "</td></tr>";
+if (!function_exists('ldap_connect'))  $message = '<div style="color:#FF0000; font-weight:bold">'.LDAPLAN_10.'</div>';
+if (varsettrue($message))              $ns->tablerender('', '<div style="text-align:center;">'.$message.'</div>');
 
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_4."</td><td class='forumheader3'>";
-$text .= $frm -> form_text("ldap_passwd", 35, $ldap['ldap_passwd'], 120);
-$text .= "</td></tr>";
-
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_5."</td><td class='forumheader3'>";
-$text .= $frm -> form_select_open("ldap_version");
-
-foreach($ldap_ver as $v)
-{
-	$sel = ($ldap['ldap_version'] == $v) ? " Selected" : "";
-	$text .= $frm -> form_option($v, $sel, $v);
-}
-
-$text .= $frm -> form_select_close();
-$text .= "</td></tr>";
-
-$text .= "<tr><td class='forumheader3'>".LDAPLAN_7."<br /><span class='smalltext'>".LDAPLAN_8."</span></td><td class='forumheader3'>";
-$text .= $frm -> form_text("ldap_edirfilter", 35, $ldap['ldap_edirfilter'], 120);
-$text .= "<br /><span class='smalltext'>".LDAPLAN_9."<br />{$current_filter}</span></td></tr>";
-
-$text .= "<tr><td class='forumheader' colspan='2' style='text-align:center;'>";
-$text .= $frm -> form_button("submit", "update", LDAPLAN_13);
-$text .= "</td></tr>";
-
-$text .= "</table>";
-$text .= $frm -> form_close();
-
-$ns -> tablerender(LDAPLAN_6,$text);
-require_once(e_ADMIN."footer.php");
-
-function ldap_conf_adminmenu()
-{
-	alt_auth_adminmenu();
-}
+$ns->tablerender(LDAPLAN_6, $text);
 
-?>
+require_once e_ADMIN.'footer.php';
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/otherdb_conf.php 1.0.2.src/e107_plugins/alt_auth/otherdb_conf.php
--- 1.0.0.src/e107_plugins/alt_auth/otherdb_conf.php	2012-10-30 15:39:55.531444315 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/otherdb_conf.php	2012-10-30 15:40:38.485441872 +0000
@@ -9,135 +9,149 @@
 |
 |     Released under the terms and conditions of the
 |     GNU General Public License (http://gnu.org).
+|
+|     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/alt_auth/otherdb_conf.php $
+|     $Revision: 12556 $
+|     $Id: otherdb_conf.php 12556 2012-01-15 02:16:00Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
-$eplug_admin = true;
-require_once("../../class2.php");
-require_once(e_ADMIN."auth.php");
-require_once(e_HANDLER."form_handler.php");
-include_lan(e_PLUGIN."alt_auth/languages/".e_LANGUAGE."/lan_otherdb_auth.php");
-define("ALT_AUTH_ACTION", "otherdb");
-require_once(e_PLUGIN."alt_auth/alt_auth_adminmenu.php");
-
-if($_POST['update'])
-{
-	$message = update_otherdb_prefs();
-}
-
-if($message)
-{
-	$ns->tablerender("","<div style='text-align:center;'>".$message."</div>");
-}
-
 
-show_otherdb_form();
-
-function show_otherdb_form()
-{
-	global $sql, $tp, $ns;
-	
-	$password_methods = array("md5", "plaintext");
-	$db_types = array("e107" => "mysql - e107 database", "mysql" => "mysql - generic database");
-
-	$sql -> db_Select("alt_auth", "*", "auth_type = 'otherdb' ");
-	$parm = array();
-	while($row = $sql->db_Fetch())
-	{
-		$parm[$row['auth_parmname']] = base64_decode(base64_decode($row['auth_parmval']));
-	}
-
-	$frm = new form;
-	$text = $frm -> form_open("POST", e_SELF);
-	$text .= "<table style='width:96%'>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_1."</td><td class='forumheader3'>";
-	$text .= $frm -> form_select_open("otherdb_dbtype");
-	foreach($db_types as $k => $v)
-	{
-		$sel = ($parm['otherdb_dbtype'] == $k) ? " Selected" : "";
-		$text .= $frm -> form_option($v, $sel, $k);
-	}
-	$text .= $frm -> form_select_close();
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_2."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_server", 35, $parm['otherdb_server'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_3."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_username", 35, $parm['otherdb_username'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_4."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_password", 35, $parm['otherdb_password'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_5."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_database", 35, $parm['otherdb_database'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_6."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_table", 35, $parm['otherdb_table'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader2' colspan='2'>".OTHERDB_LAN_11."</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_7."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_user_field", 35, $parm['otherdb_user_field'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_8."</td><td class='forumheader3'>";
-	$text .= $frm -> form_text("otherdb_password_field", 35, $parm['otherdb_password_field'], 120);
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader3'>".OTHERDB_LAN_9."</td><td class='forumheader3'>";
-	$text .= $frm -> form_select_open("otherdb_password_method");
-	foreach($password_methods as $v)
-	{
-		$sel = ($parm['otherdb_password_method'] == $v) ? " Selected" : "";
-		$text .= $frm -> form_option($v, $sel, $v);
-	}
-	$text .= $frm -> form_select_close();
-	$text .= "</td></tr>";
-
-	$text .= "<tr><td class='forumheader' colspan='2' style='text-align:center;'>";
-	$text .= $frm -> form_button("submit", "update", "Update settings");
-	$text .= "</td></tr>";
-
-	$text .= "</table>";
-	$text .= $frm -> form_close();
+$eplug_admin = true;
 
-	$ns -> tablerender(OTHERDB_LAN_10, $text);
-}
+require_once '../../class2.php';
 
-require_once(e_ADMIN."footer.php");
+include_lan(e_PLUGIN.'alt_auth/languages/'.e_LANGUAGE.'/lan_otherdb_auth.php');
+define('ALT_AUTH_ACTION', 'otherdb');
 
+require_once e_PLUGIN.'alt_auth/alt_auth_adminmenu.php';
+require_once e_HANDLER.'form_handler.php';
+require_once e_ADMIN.'auth.php';
 
 function update_otherdb_prefs()
 {
-	global $sql;
-	foreach($_POST as $k => $v)
+	foreach($_POST as $k=>$v)
 	{
 		$v = base64_encode(base64_encode($v));
-
-		if(preg_match("/otherdb_/", $k))
+		
+		if (preg_match('/otherdb_/', $k))
 		{
-			if($sql -> db_Select("alt_auth", "*", "auth_type='otherdb' AND auth_parmname='{$k}' "))
-			{
-				$sql -> db_Update("alt_auth", "auth_parmval='{$v}' WHERE  auth_type='otherdb' AND auth_parmname='{$k}' ");
-			}
+			if (!$sql)  $sql = new db();
+			if ($sql->db_Select('alt_auth', '*', "auth_type='otherdb' AND auth_parmname='{$k}' "))
+				$sql->db_Update('alt_auth', "auth_parmval='{$v}' WHERE  auth_type='otherdb' AND auth_parmname='{$k}' ");
 			else
-			{
-				$sql -> db_Insert("alt_auth", "'otherdb','{$k}','{$v}' ");
-			}
+				$sql->db_Insert('alt_auth', "'otherdb','{$k}','{$v}' ");
 		}
 	}
-	return "Settings Updated";
+	
+	return LAN_UPDATED;
 }
 
-function otherdb_conf_adminmenu()
+function show_otherdb_form()
 {
-	alt_auth_adminmenu();
+	global $ns, $tp, $sql;
+	
+	$parm        = array();
+	$db_types    = array('e107' => 'mysql - e107 database', 'mysql' => 'mysql - generic database');
+	$pwd_methods = array('md5', 'plaintext');
+	
+	$sql->db_Select('alt_auth', '*', "auth_type = 'otherdb'");
+	
+	while ($row = $sql->db_Fetch())  $parm[$row['auth_parmname']] = base64_decode(base64_decode($row['auth_parmval']));
+	
+	$frm  = new form;
+	$text = '
+	'.$frm->form_open('POST', e_SELF).'
+		<table style="width:96%">
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_1.'</td>
+				<td class="forumheader3">
+					'.$frm->form_select_open('otherdb_dbtype');
+	
+	foreach($db_types as $k => $v)
+	{
+		$text.= $frm->form_option($v, ($parm['otherdb_dbtype'] == $k ? 'selected' : ''), $k);		
+	}  
+	
+	$text.= $frm->form_select_close().'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_2.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_server', 35, $parm['otherdb_server'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_3.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_username', 35, $parm['otherdb_username'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_4.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_password', 35, $parm['otherdb_password'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_5.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_database', 35, $parm['otherdb_database'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_6.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_table', 35, $parm['otherdb_table'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader2" colspan="2">
+					'.OTHERDB_LAN_11.'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_7.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_user_field', 35, $parm['otherdb_user_field'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_8.'</td>
+				<td class="forumheader3">
+					'.$frm->form_text('otherdb_password_field', 35, $parm['otherdb_password_field'], 120).'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader3">'.OTHERDB_LAN_9.'</td>
+				<td class="forumheader3">
+					'.$frm->form_select_open('otherdb_password_method');
+	
+	foreach ($pwd_methods as $v)
+	{
+		$text.= $frm->form_option($v, ($parm['otherdb_password_method'] == $v ? 'selected' : ''), $v);		
+	} 
+ 
+	$text .= $frm->form_select_close().'
+				</td>
+			</tr>
+			<tr>
+				<td class="forumheader" colspan="2" style="text-align:center;">
+					'.$frm->form_button('submit', 'update', LAN_UPDATE).'
+				</td>
+			</tr>
+		</table>
+	'.$frm->form_close();
+	
+	return $text;
 }
 
-?>
+if (varsettrue($_POST['update']))  $message = update_otherdb_prefs();
+if (varsettrue($message))          $ns->tablerender('', '<div style="text-align:center;">'.$message.'</div>');
+
+$ns->tablerender(OTHERDB_LAN_10, show_otherdb_form());
+
+require_once e_ADMIN.'footer.php';
+
+?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/alt_auth/plugin.php 1.0.2.src/e107_plugins/alt_auth/plugin.php
--- 1.0.0.src/e107_plugins/alt_auth/plugin.php	2012-10-30 15:39:55.532444428 +0000
+++ 1.0.2.src/e107_plugins/alt_auth/plugin.php	2012-10-30 15:40:38.486444293 +0000
@@ -11,48 +11,45 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/alt_auth/plugin.php $
-|     $Revision: 12092 $
-|     $Id: plugin.php 12092 2011-03-11 18:49:56Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12527 $
+|     $Id: plugin.php 12527 2012-01-09 17:47:19Z berckoff $
+|     $Author: berckoff $
 +----------------------------------------------------------------------------+
 */
 
-
 // Plugin info -------------------------------------------------------------------------------------------------------
-$eplug_name = "Alternate Authentication";
-$eplug_version = "0.3";
-$eplug_author = "McFly";
-$eplug_logo = "/images/icon_ldap.png";
-$eplug_url = "";
-$eplug_email = "mcfly@e107.org";
-$eplug_description = "This plugin allows for alternate authentication methods.";
-$eplug_compatible = "e107v7+";
-$eplug_readme = "";	// leave blank if no readme file
+$eplug_name = 'Alternate Authentication';
+$eplug_version = '0.4';
+$eplug_author = 'McFly';
+$eplug_logo = '/images/icon_ldap.png';
+$eplug_url = '';
+$eplug_email = 'mcfly@e107.org';
+$eplug_description = 'This plugin allows for alternate authentication methods.';
+$eplug_compatible = 'e107v7+';
+$eplug_readme = '';	// leave blank if no readme file
 
 // Name of the plugin's folder -------------------------------------------------------------------------------------
-$eplug_folder = "alt_auth";
+$eplug_folder = 'alt_auth';
 
 // Mane of menu item for plugin ----------------------------------------------------------------------------------
-$eplug_menu_name = "alt_auth";
+$eplug_menu_name = 'alt_auth';
 
 // Name of the admin configuration file --------------------------------------------------------------------------
-$eplug_conffile = "alt_auth_conf.php";
+$eplug_conffile = 'alt_auth_conf.php';
 
 // Icon image and caption text ------------------------------------------------------------------------------------
-$eplug_icon = $eplug_folder."/images/icon_ldap.png";
-$eplug_caption =  "Configure Alt auth";
+$eplug_icon = $eplug_folder.'/images/icon_ldap.png';
+$eplug_caption = 'Configure Alt auth';
 
 // List of preferences -----------------------------------------------------------------------------------------------
-$eplug_prefs = "";
+$eplug_prefs = '';
 
 // List of table names -----------------------------------------------------------------------------------------------
 $eplug_table_names = array(
-	"alt_auth"
+	'alt_auth'
 );
 
 // List of sql requests to create tables -----------------------------------------------------------------------------
-
-
 $eplug_tables = array(
 "CREATE TABLE ".MPREFIX."alt_auth (
   auth_type varchar(20) NOT NULL default '',
@@ -60,15 +57,10 @@
   auth_parmval varchar(120) NOT NULL default ''
 ) ENGINE=MyISAM;");
 
-
-
 // Create a link in main menu (yes=TRUE, no=FALSE) -------------------------------------------------------------
-$eplug_link = FALSE;
-$eplug_link_name = "";
-$eplug_link_url = "";
-
+$eplug_link = false;
+$eplug_link_name = '';
+$eplug_link_url = '';
 
 // Text to display after plugin successfully installed ------------------------------------------------------------------
-$eplug_done = "Alt auth service is now set up.  You will now need to configure your preferred method.";
-
-?>	
+$eplug_done = 'Alt auth service is now set up.  You will now need to configure your preferred method.';
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/blogcalendar_menu/blogcalendar_menu.php 1.0.2.src/e107_plugins/blogcalendar_menu/blogcalendar_menu.php
--- 1.0.0.src/e107_plugins/blogcalendar_menu/blogcalendar_menu.php	2012-10-30 15:39:55.512443928 +0000
+++ 1.0.2.src/e107_plugins/blogcalendar_menu/blogcalendar_menu.php	2012-10-30 15:40:38.487444717 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/blogcalendar_menu/blogcalendar_menu.php $
-|     $Revision: 11678 $
-|     $Id: blogcalendar_menu.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12858 $
+|     $Id: blogcalendar_menu.php 12858 2012-07-07 06:02:36Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 | Based on code by: Thomas Bouve (crahan@gmx.net)
@@ -72,8 +72,8 @@
 // -------------------------------
 // create the month selection item
 // -------------------------------
-$month_selector = "<div class='forumheader' style='text-align: center; margin-bottom: 2px;'>";
-$month_selector .= "<select name='activate' onchange='urljump(this.options[selectedIndex].value)' class='tbox'>";
+$month_selector = "<div class='forumheader blogcalendar-month-selector' style='text-align: center; margin-bottom: 2px;'>";
+$month_selector .= "<select name='activate' onchange='urljump(this.options[selectedIndex].value)' class='tbox blogcalendar-month-selector'>";
 
 // get all newsposts since the beginning of the year till now
 // -------------------------------------------
@@ -122,10 +122,10 @@
 // ------------------------
 // create and show calendar
 // ------------------------
-$menu = "<div style='text-align: center;'><table border='0' cellspacing='7'>";
-$menu .= "<tr><td>$month_selector";
-$menu .= "<div style='text-align:center'>".calendar($req_day, $req_month, $req_year, $day_links, $pref['blogcal_ws'])."</div>";
-$menu .= "<div class='forumheader' style='text-align: center; margin-top:2px;'><span class='smalltext'><a href='$prefix/archive.php'>".BLOGCAL_L2."</a></span></div></td></tr>";
+$menu = "<div class='blogcalendar-block' style='text-align: center;'><table class='blogcalendar-table' border='0' cellspacing='7'>";
+$menu .= "<tr><td class='blogcalendar-month-selector'>$month_selector";
+$menu .= "<div class='blogcalendar-day-selector' style='text-align:center'>".calendar($req_day, $req_month, $req_year, $day_links, $pref['blogcal_ws'])."</div>";
+$menu .= "<div class='forumheader blogcalendar-archive-link' style='text-align: center; margin-top:2px;'><span class='smalltext'><a class='blogcalendar-archive-link' href='$prefix/archive.php'>".BLOGCAL_L2."</a></span></div></td></tr>";
 $menu .= "</table></div>";
 $ns->tablerender(BLOGCAL_L1." ".$req_year, $menu, 'blog_calender');
 ?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/blogcalendar_menu/calendar.php 1.0.2.src/e107_plugins/blogcalendar_menu/calendar.php
--- 1.0.0.src/e107_plugins/blogcalendar_menu/calendar.php	2012-10-30 15:39:55.512443928 +0000
+++ 1.0.2.src/e107_plugins/blogcalendar_menu/calendar.php	2012-10-30 15:40:38.487444717 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/blogcalendar_menu/calendar.php $
-|     $Revision: 11678 $
-|     $Id: calendar.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12858 $
+|     $Id: calendar.php 12858 2012-07-07 06:02:36Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 | Based on code by: Thomas Bouve (crahan@gmx.net) and
@@ -49,10 +49,10 @@
 	if ($ws && $day_of_week == 0) $day_of_week = 7;
 	 
 	// print the daynames
-	$calendar = "<table class='fborder'>";
+	$calendar = "<table class='fborder blogcalendar'>";
 	$calendar .= '<tr>';
 	foreach($darray as $dheader) {
-		$calendar .= "<td class='forumheader' style='padding: ".$padding."px;'><span class='smalltext'>$dheader</span></td>";
+		$calendar .= "<td class='forumheader blogcalendar-day-name' style='padding: ".$padding."px;'><span class='smalltext blogcalendar-day-name'>$dheader</span></td>";
 	}
 	$calendar .= "</tr>";
 	$calendar .= '<tr>';
@@ -62,7 +62,7 @@
 	 
 	// take care of the first "empty" days of the month
 	if ($day_of_week-$ws > 0) {
-		$calendar .= "<td colspan='";
+		$calendar .= "<td class='blogcalendar-day-empty' colspan='";
 		$calendar .= $day_of_week-$ws;
 		$calendar .= "'>&nbsp;</td>";
 	}
@@ -76,12 +76,12 @@
 			$tablerow++;
 		}
 		if ($day_of_month == $req_day) {
-			$day_style = isset($links[$day_of_month]) ? "indent" : "forumheader3";
+			$day_style = isset($links[$day_of_month]) ? "indent blogcalendar-day-active" : "forumheader3 blogcalendar-day";
 		} else {
-			$day_style = isset($links[$day_of_month]) ? "indent" : "forumheader3";
+			$day_style = isset($links[$day_of_month]) ? "indent blogcalendar-day-active" : "forumheader3 blogcalendar-day";
 		}
-		$calendar .= "<td class='$day_style' style='padding: ".$padding."px;'><span class='smalltext'>";
-		$calendar .= isset($links[$day_of_month]) ? "<a href='".$links[$day_of_month]."'>":"";
+		$calendar .= "<td class='$day_style' style='padding: ".$padding."px;'><span class='smalltext blogcalendar-day-link'>";
+		$calendar .= isset($links[$day_of_month]) ? "<a class='blogcalendar-day-link' href='".$links[$day_of_month]."'>":"";
 		$calendar .= $day_of_month;
 		$calendar .= isset($links[$day_of_month]) ? "</a>" : "";
 		$calendar .= "</span></td>";
@@ -89,11 +89,11 @@
 		$day_of_week++;
 	}
 	if ($day_of_week-$ws != 7) {
-		$calendar .= '<td colspan="' . (7 - $day_of_week+$ws) . '">&nbsp;</td>';
+		$calendar .= '<td class="blogcalendar-day-empty" colspan="' . (7 - $day_of_week+$ws) . '">&nbsp;</td>';
 	}
 	$calendar .= "</tr>";
 	if ($tablerow != 6) {
-		$calendar .= "<tr><td style='padding: ".$padding."px;' colspan='6'>&nbsp;</td></tr>";
+		$calendar .= "<tr><td class='blogcalendar-day-empty' style='padding: ".$padding."px;' colspan='6'>&nbsp;</td></tr>";
 	}
 	 
 	$calendar .= "</table>";
diff -x .svn -aruN 1.0.0.src/e107_plugins/calendar_menu/e_search.php 1.0.2.src/e107_plugins/calendar_menu/e_search.php
--- 1.0.0.src/e107_plugins/calendar_menu/e_search.php	2012-10-30 15:39:55.490444408 +0000
+++ 1.0.2.src/e107_plugins/calendar_menu/e_search.php	2012-10-30 15:40:38.490444547 +0000
@@ -9,7 +9,7 @@
  * Event calendar - search shim
  *
  * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/calendar_menu/e_search.php $
- * $Id: e_search.php 12440 2011-12-05 18:03:34Z e107steved $
+ * $Id: e_search.php 12577 2012-01-28 21:07:05Z e107steved $
  */
 if (!defined('e107_INIT')) { exit(); }
 
@@ -17,4 +17,4 @@
 
 $search_info[] = array('sfile' => e_PLUGIN.'calendar_menu/search/search_parser.php', 'qtype' => CM_SCH_LAN_1, 'refpage' => 'calendar.php');
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/content/content_sql.php 1.0.2.src/e107_plugins/content/content_sql.php
--- 1.0.0.src/e107_plugins/content/content_sql.php	2012-10-30 15:39:55.529441708 +0000
+++ 1.0.2.src/e107_plugins/content/content_sql.php	2012-10-30 15:40:38.506444525 +0000
@@ -11,12 +11,12 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/content/content_sql.php $
-|     $Revision: 12092 $
-|     $Id: content_sql.php 12092 2011-03-11 18:49:56Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12938 $
+|     $Id: content_sql.php 12938 2012-08-10 03:57:15Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
-header("location:../index.php");
+header("location:../../index.php");
 exit;
 ?>
 # Table structure for table `content`
diff -x .svn -aruN 1.0.0.src/e107_plugins/content/handlers/content_form_class.php 1.0.2.src/e107_plugins/content/handlers/content_form_class.php
--- 1.0.0.src/e107_plugins/content/handlers/content_form_class.php	2012-10-30 15:39:55.525448712 +0000
+++ 1.0.2.src/e107_plugins/content/handlers/content_form_class.php	2012-10-30 15:40:38.511443455 +0000
@@ -10,8 +10,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/content/handlers/content_form_class.php $
-|     $Revision: 12289 $
-|     $Id: content_form_class.php 12289 2011-06-29 01:07:28Z e107coders $
+|     $Revision: 12884 $
+|     $Id: content_form_class.php 12884 2012-07-18 20:28:24Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -1310,11 +1310,11 @@
 					<tr><td colspan='2' class='forumheader3'>";
 					for($i=0;$i<count($arrletters);$i++){
 						if($arrletters[$i]!= ""){
-							$text .= "<input class='button' style='width:20' type='submit' name='letter' value='".strtoupper($arrletters[$i])."' />";
+							$text .= "<input class='button' type='submit' name='letter' value='".strtoupper($arrletters[$i])."' />";
 						}
 					}
 					$text .= "
-					<input class='button' style='width:20' type='submit' name='letter' value='".CONTENT_LAN_ALL."' />
+					<input class='button' type='submit' name='letter' value='".CONTENT_LAN_ALL."' />
 					</td>
 					</tr>
 					</table>
diff -x .svn -aruN 1.0.0.src/e107_plugins/forum/forum_admin.php 1.0.2.src/e107_plugins/forum/forum_admin.php
--- 1.0.0.src/e107_plugins/forum/forum_admin.php	2012-10-30 15:39:55.502443865 +0000
+++ 1.0.2.src/e107_plugins/forum/forum_admin.php	2012-10-30 15:40:38.527444468 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/forum_admin.php $
-|     $Revision: 12242 $
-|     $Id: forum_admin.php 12242 2011-06-02 19:59:08Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12497 $
+|     $Id: forum_admin.php 12497 2012-01-01 05:46:54Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 $eplug_admin = true;
@@ -888,7 +888,7 @@
 		<tr>
 		<td style='width:40%' class='forumheader3'>".FORLAN_33.":<br /><span class='smalltext'>(".FORLAN_34.")</span></td>
 		<td style='width:60%' class='forumheader3'>";
-		$text .= r_userclass("forum_moderators", $forum_moderators, 'off', 'admin,classes');
+		$text .= r_userclass("forum_moderators", $forum_moderators, 'off', 'admin,main,classes');
 
 		//		$admin_no = $sql->db_Select("user", "*", "user_admin='1' AND user_perms REGEXP('A.') OR user_perms='0' ");
 		//		while ($row = $sql->db_Fetch())
@@ -906,12 +906,12 @@
 		</tr>
 		<tr>
 		<td style='width:40%' class='forumheader3'>".FORLAN_23.":<br /><span class='smalltext'>(".FORLAN_24.")</span></td>
-		<td style='width:60%' class='forumheader3'>".r_userclass("forum_class", $forum_class, 'off', 'nobody,public,member,admin,classes')."</td>
+		<td style='width:60%' class='forumheader3'>".r_userclass("forum_class", $forum_class, 'off', 'nobody,public,member,admin,main,classes')."</td>
 		</tr>
 
 		<tr>
 		<td style='width:40%' class='forumheader3'>".FORLAN_142.":<br /><span class='smalltext'>(".FORLAN_143.")</span></td>
-		<td style='width:60%' class='forumheader3'>".r_userclass("forum_postclass", $forum_postclass, 'off', 'nobody,public,member,admin,classes')."</td>
+		<td style='width:60%' class='forumheader3'>".r_userclass("forum_postclass", $forum_postclass, 'off', 'nobody,public,member,admin,main,classes')."</td>
 		</tr>
 
 		<tr style='vertical-align:top'>
diff -x .svn -aruN 1.0.0.src/e107_plugins/forum/forum_post.php 1.0.2.src/e107_plugins/forum/forum_post.php
--- 1.0.0.src/e107_plugins/forum/forum_post.php	2012-10-30 15:39:55.502443865 +0000
+++ 1.0.2.src/e107_plugins/forum/forum_post.php	2012-10-30 15:40:38.528444322 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/forum_post.php $
-|     $Revision: 12100 $
-|     $Id: forum_post.php 12100 2011-03-13 14:15:43Z e107steved $
+|     $Revision: 12631 $
+|     $Id: forum_post.php 12631 2012-04-12 19:30:41Z e107steved $
 |     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
@@ -59,6 +59,10 @@
 	{
 	  $forum_info = FALSE;		// Someone fed us a dud forum id - should exist if replying
 	}
+	elseif ($thread_info['head']['thread_active'] == 0)
+	{	// Locked thread - posting not allowed
+		$forum_info = FALSE;
+	}
 	else
 	{
 		$forum_info = $forum->forum_get($thread_info['head']['thread_forum_id']);
@@ -79,7 +83,8 @@
 	}
 }
 
-if (($forum_info === FALSE) || !check_class($forum_info['forum_postclass']) || !check_class($forum_info['parent_postclass'])) {
+if (($forum_info === FALSE) || !check_class($forum_info['forum_postclass']) || !check_class($forum_info['parent_postclass'])) 
+{
 	require_once(HEADERF);
 	$ns->tablerender(LAN_20, "<div style='text-align:center'>".LAN_399."</div>");
 	require_once(FOOTERF);
diff -x .svn -aruN 1.0.0.src/e107_plugins/forum/languages/English/lan_forum_conf.php 1.0.2.src/e107_plugins/forum/languages/English/lan_forum_conf.php
--- 1.0.0.src/e107_plugins/forum/languages/English/lan_forum_conf.php	2012-10-30 15:39:55.503444482 +0000
+++ 1.0.2.src/e107_plugins/forum/languages/English/lan_forum_conf.php	2012-10-30 15:40:38.545441507 +0000
@@ -1,44 +1,54 @@
 <?php
-/*
-+ ----------------------------------------------------------------------------+
-|     e107 website system - Language File.
-|
-|     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/languages/English/lan_forum_conf.php $
-|     $Revision: 11678 $
-|     $Id: lan_forum_conf.php 11678 2010-08-22 00:43:45Z e107coders $
-|     $Author: e107coders $
-+----------------------------------------------------------------------------+
-*/
-define("FORLAN_5", "Poll deleted.");
-define("FORLAN_6", "Thread deleted");
-define("FORLAN_7", "replies deleted");
-define("FORLAN_8", "Delete cancelled.");
-define("FORLAN_9", "Thread moved.");
-define("FORLAN_10", "Move cancelled.");
-define("FORLAN_11", "Back To Forums");
-define("FORLAN_12", "Forum Configuration");
-define("FORLAN_13", "Are you absolutely certain you want to delete this poll?<br />Once deleted it <b><u>cannot</u></b> be retrieved.");
-define("FORLAN_14", "Cancel");
-define("FORLAN_15", "Confirm Delete Forum Post");
-define("FORLAN_16", "Confirm Delete Poll");
-define("FORLAN_17", "posted by");
-define("FORLAN_18", "Are you absolutely certain you want to delete this forum");
-define("FORLAN_19", "thread and it's related posts?");
-define("FORLAN_20", "the poll will also be deleted");
-define("FORLAN_21", "Once deleted they");
-define("FORLAN_22", "post?<br />Once deleted it");
-define("FORLAN_23", "cannot</u></b> be retrieved");
-define("FORLAN_24", "Move thread  to forum");
-define("FORLAN_25", "Move Thread");
-define("FORLAN_26", "Reply deleted");
+/**
+ * e107 website system - English Language file
+ * 
+ * Copyright (C) 2001-2002 Steve Dunstan (jalist@e107.org)
+ * Copyright (C) 2008-2010 e107 Inc (e107.org)
+ * 
+ * Released under the terms and conditions of the GNU General Public License
+ * (http://gnu.org).
+ * 
+ * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/languages/English/lan_forum_conf.php $
+ * $Revision: 12508 $
+ * $Id: lan_forum_conf.php 12508 2012-01-04 16:54:46Z berckoff $
+ * $Author: berckoff $
+ */
 
-define("FORLAN_27", "moved");
+# Install LANs
+define('LAN_FORUM_INSTALL_01', 'Forum');
+define('LAN_FORUM_INSTALL_02', 'This plugin is a fully featured Forum system.');
+define('LAN_FORUM_INSTALL_03', 'Configure Forum');
+define('LAN_FORUM_INSTALL_04', 'Your forum is now installed');
+define('LAN_FORUM_INSTALL_05', 'Forum successfully upgraded, now using version: %1$s');
+define('LAN_FORUM_INSTALL_06', '[forum]');
+define('LAN_FORUM_INSTALL_07', '[more...]');
 
-define("FORLAN_28", "Do not rename thread title");
-define("FORLAN_29", "Add");
-define("FORLAN_30", "to title");
-define("FORLAN_31", "Rename to:");
-define("FORLAN_32", "Rename thread options:");
-
-
-?>
\ No newline at end of file
+# Config LANs
+define('FORLAN_5', 'Poll deleted.');
+define('FORLAN_6', 'Thread deleted');
+define('FORLAN_7', 'replies deleted');
+define('FORLAN_8', 'Delete cancelled.');
+define('FORLAN_9', 'Thread moved.');
+define('FORLAN_10', 'Move cancelled.');
+define('FORLAN_11', 'Back To Forums');
+define('FORLAN_12', 'Forum Configuration');
+define('FORLAN_13', 'Are you absolutely certain you want to delete this poll?<br />Once deleted, it <b><u>cannot</u></b> be retrieved.');
+define('FORLAN_14', 'Cancel');
+define('FORLAN_15', 'Confirm Delete Forum Post');
+define('FORLAN_16', 'Confirm Delete Poll');
+define('FORLAN_17', 'posted by');
+define('FORLAN_18', 'Are you absolutely certain you want to delete this forum');
+define('FORLAN_19', 'thread and it\'s related posts?');
+define('FORLAN_20', 'the poll will also be deleted');
+define('FORLAN_21', 'Once deleted they');
+define('FORLAN_22', 'post?<br />Once deleted it');
+define('FORLAN_23', 'cannot</u></b> be retrieved');
+define('FORLAN_24', 'Move thread  to forum');
+define('FORLAN_25', 'Move Thread');
+define('FORLAN_26', 'Reply deleted');
+define('FORLAN_27', 'moved');
+define('FORLAN_28', 'Do not rename thread title');
+define('FORLAN_29', 'Add');
+define('FORLAN_30', 'to title');
+define('FORLAN_31', 'Rename to:');
+define('FORLAN_32', 'Rename thread options:');
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/forum/plugin.php 1.0.2.src/e107_plugins/forum/plugin.php
--- 1.0.0.src/e107_plugins/forum/plugin.php	2012-10-30 15:39:55.505441570 +0000
+++ 1.0.2.src/e107_plugins/forum/plugin.php	2012-10-30 15:40:38.547374920 +0000
@@ -1,73 +1,72 @@
 <?php
-/*
-+ ----------------------------------------------------------------------------+
-|     e107 website system
-|
-|     Copyright (C) 2001-2002 Steve Dunstan (jalist@e107.org)
-|     Copyright (C) 2008-2010 e107 Inc (e107.org)
-|
-|
-|     Released under the terms and conditions of the
-|     GNU General Public License (http://gnu.org).
-|
-|     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/plugin.php $
-|     $Revision: 12178 $
-|     $Id: plugin.php 12178 2011-05-02 20:45:40Z e107steved $
-|     $Author: e107steved $
-+----------------------------------------------------------------------------+
-*/
+/**
+ * e107 website system
+ * 
+ * Copyright (C) 2001-2002 Steve Dunstan (jalist@e107.org)
+ * Copyright (C) 2008-2010 e107 Inc (e107.org)
+ * 
+ * Released under the terms and conditions of the GNU General Public License
+ * (http://gnu.org).
+ * 
+ * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/forum/plugin.php $
+ * $Revision: 12538 $
+ * $Id: plugin.php 12538 2012-01-11 12:37:03Z berckoff $
+ * $Author: berckoff $
+ */
 
-if (!defined('e107_INIT')) { exit; }
+if (!defined('e107_INIT'))  exit;
 
 include_lan(e_PLUGIN.'forum/languages/'.e_LANGUAGE.'/lan_forum_conf.php');
 
-// Plugin info -------------------------------------------------------------------------------------------------------
-$eplug_name = 'Forum';
-$eplug_version = '1.2';
-$eplug_author = 'e107dev';
-$eplug_url = 'http://e107.org';
-$eplug_email = '';
-$eplug_description = 'This plugin is a fully featured Forum system.';
-$eplug_compatible = 'e107v0.7+';
-$eplug_readme = '';
-$eplug_latest = TRUE; //Show reported threads in admin (use latest.php)
-$eplug_status = TRUE; //Show post count in admin (use status.php)
-
-// Name of the plugin's folder -------------------------------------------------------------------------------------
-$eplug_folder = "forum";
-
-// Name of menu item for plugin ----------------------------------------------------------------------------------
-$eplug_menu_name = "forum";
-
-// Name of the admin configuration file --------------------------------------------------------------------------
-$eplug_conffile = "forum_admin.php";
-
-// Icon image and caption text ------------------------------------------------------------------------------------
-$eplug_icon = $eplug_folder."/images/forums_32.png";
-$eplug_icon_small = $eplug_folder."/images/forums_16.png";
-$eplug_caption = 'Configure Forum';
-
-// List of preferences -----------------------------------------------------------------------------------------------
-$eplug_prefs = array(
-	"forum_show_topics" => "1",
-	"forum_postfix" => "[more...]",
-	'forum_poll' => '0',
-	'forum_popular' => '10',
-	'forum_track' => '0',
-	'forum_eprefix' => '[forum]',
-	'forum_enclose' => '1',
-	'forum_title' => 'Forums',
-	'forum_postspage' => '10',
-	'forum_hilightsticky' => '1'
- );
-
-// List of table names -----------------------------------------------------------------------------------------------
-$eplug_table_names = array(
-"forum",
-	"forum_t" );
+# Plugin info
+$eplug_name         = LAN_FORUM_INSTALL_01;
+$eplug_url          = 'http://e107.org';
+$eplug_email        = '';
+$eplug_author       = 'e107dev';
+$eplug_version      = '1.2';
+$eplug_compatible   = 'e107v0.7+';
+$eplug_description  = LAN_FORUM_INSTALL_02;
+$eplug_readme       = '';
+
+# Plugin options
+$eplug_latest       = true;                  # Show reported threads in admin (use latest.php)
+$eplug_status       = true;                  # Show post count in admin (use status.php)
+$eplug_folder       = 'forum';               # Name of the plugin's folder
+$eplug_conffile     = 'forum_admin.php';     # Name of the admin configuration file
+$eplug_menu_name    = 'forum';               # Name of menu item for plugin
+
+$eplug_link         = true;                  # Create a link in main menu (true=YES, false=NO)
+$eplug_link_url     = e_PLUGIN.'forum/forum.php';
+$eplug_link_name    = LAN_FORUM_INSTALL_01;
+
+$eplug_done         = LAN_FORUM_INSTALL_04;  # Message for successfull instalation
+$eplug_upgrade_done = sprintf(LAN_FORUM_INSTALL_05, $eplug_version);
+
+# Icon images and caption text
+$eplug_icon         = $eplug_folder.'/images/forums_32.png';
+$eplug_icon_small   = $eplug_folder.'/images/forums_16.png';
+$eplug_caption      = LAN_FORUM_INSTALL_03;
+
+
+# List of plugin preferences
+$eplug_prefs        = array(
+	'forum_poll'          => '0',
+	'forum_track'         => '0',
+	'forum_title'         => LAN_FORUM_INSTALL_01,
+	'forum_eprefix'       => LAN_FORUM_INSTALL_06,
+	'forum_postfix'       => LAN_FORUM_INSTALL_07,
+	'forum_enclose'       => '1',
+	'forum_popular'       => '10',
+	'forum_postspage'     => '10',
+	'forum_show_topics'   => '1',
+	'forum_hilightsticky' => '1',
+);
+
+# List of DB tables (names)
+$eplug_table_names  = array('forum', 'forum_t');
 
-// List of sql requests to create tables -----------------------------------------------------------------------------
-$eplug_tables = array(
+# List of SQL requests (create tables)
+$eplug_tables       = array(
 "CREATE TABLE ".MPREFIX."forum (
 	forum_id int(10) unsigned NOT NULL auto_increment,
 	forum_name varchar(250) NOT NULL default '',
@@ -84,8 +83,9 @@
 	forum_order int(10) unsigned NOT NULL default '0',
 	forum_postclass tinyint(3) unsigned NOT NULL default '0',
 	PRIMARY KEY  (forum_id)
-	) ENGINE=MyISAM AUTO_INCREMENT=1;",
-	"CREATE TABLE ".MPREFIX."forum_t (
+) ENGINE=MyISAM AUTO_INCREMENT=1;",
+
+"CREATE TABLE ".MPREFIX."forum_t (
 	thread_id int(10) unsigned NOT NULL auto_increment,
 	thread_name varchar(250) NOT NULL default '',
 	thread_thread text NOT NULL,
@@ -104,34 +104,28 @@
 	KEY thread_parent (thread_parent),
 	KEY thread_datestamp (thread_datestamp),
 	KEY thread_forum_id (thread_forum_id)
-	) ENGINE=MyISAM AUTO_INCREMENT=1;");
-
-// Create a link in main menu (yes=TRUE, no=FALSE) -------------------------------------------------------------
-$eplug_link = TRUE;
-$eplug_link_name = "Forum";
-$eplug_link_url = e_PLUGIN.'forum/forum.php';
-
-// Text to display after plugin successfully installed ------------------------------------------------------------------
-$eplug_done = 'Your forum is now installed';
-
-$eplug_upgrade_done = 'Forum successfully upgraded, now using version: '.$eplug_version;
+) ENGINE=MyISAM AUTO_INCREMENT=1;",
+);
 
+# Update SQL queries
 $upgrade_alter_tables = array(
-"ALTER TABLE ".MPREFIX."forum ADD forum_postclass TINYINT( 3 ) UNSIGNED DEFAULT '0' NOT NULL ;"
+	"ALTER TABLE ".MPREFIX."forum ADD forum_postclass TINYINT(3) UNSIGNED DEFAULT '0' NOT NULL;",
 );
 
-if (!function_exists('forum_uninstall')) {
-	function forum_uninstall() {
-		global $sql;
-		$sql -> db_Update("user", "user_forums='0'");
+if (!function_exists('forum_install'))
+{
+	function forum_install()
+	{
+		$sql = new db();
+		$sql->db_Update('user', "user_forums='0'");
 	}
 }
 
-if (!function_exists('forum_install')) {
-	function forum_install() {
-		global $sql;
-		$sql -> db_Update("user", "user_forums='0'");
+if (!function_exists('forum_uninstall'))
+{
+	function forum_uninstall()
+	{
+		$sql = new db();
+		$sql->db_Update('user', "user_forums='0'");
 	}
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/gsitemap/admin_config.php 1.0.2.src/e107_plugins/gsitemap/admin_config.php
--- 1.0.0.src/e107_plugins/gsitemap/admin_config.php	2012-10-30 15:39:55.483444693 +0000
+++ 1.0.2.src/e107_plugins/gsitemap/admin_config.php	2012-10-30 15:40:38.549441832 +0000
@@ -11,16 +11,21 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/gsitemap/admin_config.php $
-|     $Revision: 11678 $
-|     $Id: admin_config.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12938 $
+|     $Id: admin_config.php 12938 2012-08-10 03:57:15Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 require_once("../../class2.php");
-if(!getperms("P")){ header("location:".e_BASE."index.php"); }
+if(!getperms("P"))
+{
+	header("location:".e_BASE."index.php"); 
+	exit;
+}
+include_lan(e_PLUGIN."gsitemap/languages/gsitemap_".e_LANGUAGE.".php");
 require_once(e_ADMIN."auth.php");
 require_once(e_HANDLER."userclass_class.php");
-include_lan(e_PLUGIN."gsitemap/languages/gsitemap_".e_LANGUAGE.".php");
+
 
 $gsm = new gsitemap;
 
@@ -518,4 +523,4 @@
 	show_admin_menu(GSLAN_19, $action, $var);
 }
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_plugins/links_page/admin_linkspage_config.php 1.0.2.src/e107_plugins/links_page/admin_linkspage_config.php
--- 1.0.0.src/e107_plugins/links_page/admin_linkspage_config.php	2012-10-30 15:39:55.476444470 +0000
+++ 1.0.2.src/e107_plugins/links_page/admin_linkspage_config.php	2012-10-30 15:40:38.552444808 +0000
@@ -10,33 +10,25 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/links_page/admin_linkspage_config.php $
-|     $Revision: 11869 $
-|     $Id: admin_linkspage_config.php 11869 2010-10-09 11:51:49Z e107coders $
-|     $Author: e107coders $
+|     $Revision: 12570 $
+|     $Id: admin_linkspage_config.php 12570 2012-01-21 16:42:48Z e107steved $
+|     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
 
-require_once("../../class2.php");
-if (!getperms("P")) {
-	header("location:".e_BASE."index.php");
+require_once('../../class2.php');
+if (!getperms('P')) 
+{
+	header('location:'.e_BASE.'index.php');
+	exit();
 }
 require_once(e_PLUGIN.'links_page/link_shortcodes.php');
 require_once(e_PLUGIN.'links_page/link_defines.php');
-if(e_QUERY){
-	$qs = explode(".", e_QUERY);
-
-	if(is_numeric($qs[0])){
-		$from = array_shift($qs);
-	}else{
-		$from = "0";
-	}
-}
-
-require_once(e_ADMIN."auth.php");
-require_once(e_HANDLER."userclass_class.php");
-require_once(e_HANDLER."form_handler.php");
+require_once(e_ADMIN.'auth.php');
+require_once(e_HANDLER.'userclass_class.php');
+require_once(e_HANDLER.'form_handler.php');
 $rs = new form;
-require_once(e_HANDLER."file_class.php");
+require_once(e_HANDLER.'file_class.php');
 $fl = new e_file;
 e107_require_once(e_HANDLER.'arraystorage_class.php');
 $eArrayStorage = new ArrayData();
@@ -45,152 +37,231 @@
 
 include_lan(e_PLUGIN.'links_page/languages/'.e_LANGUAGE.'.php');
 
-$linkspage_pref = $lc -> getLinksPagePref();
+$linkspage_pref = $lc->getLinksPagePref();
+
+//$deltest = array_flip($_POST);			// Not used any more
+
+
+if(e_QUERY)
+{
+	$qs = explode('.', e_QUERY);
+
+	if(is_numeric($qs[0]))
+	{
+		$from = array_shift($qs);
+	}
+	else
+	{
+		$from = '0';
+	}
+}
+
 
-$deltest = array_flip($_POST);
 
-//if (e_QUERY) {
-//	$qs = explode(".", e_QUERY);
-//}
 
-if(isset($_POST['delete'])){
+
+$incdec_action = '';
+foreach($_POST as $k => $v)
+{
+	if ((preg_match("#^(inc|dec)".URL_SEPARATOR."(\d+)".URL_SEPARATOR."(\d+)".URL_SEPARATOR."(\d+){0,1}_[x|y]#", $k, $matches)))
+	{
+		$incdec_action = $matches[1];			// (inc|dec)
+		$linkid = intval($matches[2]);
+		$link_order = intval($matches[3]);
+		$link_location = intval(varset($matches[4], ''));
+		break;
+	}
+}
+
+switch ($incdec_action)
+{
+	case 'inc' :
+		$lc->dbOrderUpdateInc($linkid, $link_order, $link_location);
+		break;
+	case 'dec' :
+		$lc->dbOrderUpdateDec($linkid, $link_order, $link_location);
+		break;
+}
+
+
+if (isset($_POST['delete']))
+{
 	$tmp = array_pop($tmp = array_flip($_POST['delete']));
 	list($delete, $del_id) = explode("_", $tmp);
+	$del_id = intval($del_id);
 }
-if (isset($_POST['create_category'])) {
+elseif (isset($_POST['create_category'])) 
+{
 	$lc -> dbCategoryCreate();
 }
-if (isset($_POST['update_category'])) {
+elseif (isset($_POST['update_category'])) 
+{
 	$lc -> dbCategoryUpdate();
 }
-if (isset($_POST['updateoptions'])) {
+elseif (isset($_POST['updateoptions'])) 
+{
 	$linkspage_pref = $lc -> UpdateLinksPagePref();
 	$lc -> show_message(LCLAN_ADMIN_6);
 }
-if (isset($_POST['add_link'])) {
+elseif (isset($_POST['add_link'])) 
+{
 	$lc -> dbLinkCreate();
 }
 //upload link icon
-if(isset($_POST['uploadlinkicon'])){
+elseif(isset($_POST['uploadlinkicon']))
+{
 	$lc -> uploadLinkIcon();
 }
 //upload category icon
-if(isset($_POST['uploadcatlinkicon'])){
+elseif(isset($_POST['uploadcatlinkicon']))
+{
 	$lc -> uploadCatLinkIcon();
 }
 //update link order
-if (isset($_POST['update_order'])) {
+elseif (isset($_POST['update_order'])) 
+{
 	$lc -> dbOrderUpdate($_POST['link_order']);
 }
 //update link category order
-if (isset($_POST['update_category_order'])) {
+elseif (isset($_POST['update_category_order'])) 
+{
 	$lc -> dbOrderCatUpdate($_POST['link_category_order']);
 }
-if (isset($_POST['inc'])) {
-	$lc -> dbOrderUpdateInc($_POST['inc']);
-}
-if (isset($_POST['dec'])) {
-	$lc -> dbOrderUpdateDec($_POST['dec']);
-}
-//delete link
-if (isset($delete) && $delete == 'main') {
-	$sql->db_Select("links_page", "link_order", "link_id='".$del_id."'");
-	$row = $sql->db_Fetch();
-	$sql2 = new db;
-	$sql->db_Select("links_page", "link_id", "link_order>'".$row['link_order']."' && link_category='".$id."'");
-	while ($row = $sql->db_Fetch()) {
-		$sql2->db_Update("links_page", "link_order=link_order-1 WHERE link_id='".$row['link_id']."'");
-	}
-	if ($sql->db_Delete("links_page", "link_id='".$del_id."'")) {
-		$lc->show_message(LCLAN_ADMIN_10." #".$del_id." ".LCLAN_ADMIN_11);
-	}
-}
-//delete category
-if (isset($delete) && $delete == 'category') {
-	//check if links are present for this category
-	if($sql->db_Select("links_page", "*", "link_category='$del_id' ")) {
-		$lc->show_message(LCLAN_ADMIN_12." #".$del_id." ".LAN_DELETED_FAILED."<br />".LCLAN_ADMIN_15);
-	//no? then we can safely remove this category
-	}else{
-		if ($sql->db_Delete("links_page_cat", "link_category_id='$del_id' ")) {
-			$lc->show_message(LCLAN_ADMIN_12." #".$del_id." ".LCLAN_ADMIN_11);
-			unset($id);
-		}
-	}
-}
-//delete submitted link
-if (isset($delete) && $delete == 'sn') {
-	if ($sql->db_Delete("tmp", "tmp_time='$del_id' ")) {
-		$lc->show_message(LCLAN_ADMIN_13);
-	}
-}
-
 
-//show link categories (cat edit)
-if (!e_QUERY) {
-	$lc->show_categories("cat");
-}
+//delete link
+if (isset($delete) && $del_id)
+{
+	switch ($delete)
+	{
+		case 'main' :		// Delete link
+			$sql->db_Select('links_page', 'link_order', 'link_id='.$del_id);
+			$row = $sql->db_Fetch();
+			$sql2 = new db;
+			$sql->db_Select("links_page", "link_id", "link_order>'".$row['link_order']."' && link_category='".$id."'");
+			while ($row = $sql->db_Fetch()) {
+				$sql2->db_Update('links_page', "link_order=link_order-1 WHERE link_id='".$row['link_id']."'");
+			}
+			if ($sql->db_Delete('links_page', 'link_id='.$del_id)) 
+			{
+				$lc->show_message(LCLAN_ADMIN_10." #".$del_id." ".LCLAN_ADMIN_11);
+			}
+			break;
 
-//show cat edit form
-if (isset($qs[0]) && $qs[0] == 'cat' && isset($qs[1]) && $qs[1] == 'edit' && isset($qs[2]) && is_numeric($qs[2])) {
-	$lc->show_cat_create();
-}
+		case 'category' :	//delete category
+			//check if links are present for this category
+			if($sql->db_Select('links_page', '*', 'link_category='.$del_id)) 
+			{
+				$lc->show_message(LCLAN_ADMIN_12." #".$del_id." ".LAN_DELETED_FAILED."<br />".LCLAN_ADMIN_15);
+			//no? then we can safely remove this category
+			}
+			else
+			{
+				if ($sql->db_Delete('links_page_cat', 'link_category_id='.$del_id)) 
+				{
+					$lc->show_message(LCLAN_ADMIN_12." #".$del_id." ".LCLAN_ADMIN_11);
+					unset($id);
+				}
+			}
+			break;
 
-//show cat create form
-if (isset($qs[0]) && $qs[0] == 'cat' && isset($qs[1]) && $qs[1] == 'create' && !isset($qs[2]) ) {
-	$lc->show_cat_create();
+		case 'sn' :		//delete submitted link
+			if ($sql->db_Delete('tmp', 'tmp_time='.$del_id)) 
+			{
+				$lc->show_message(LCLAN_ADMIN_13);
+			}
+	}
 }
 
-if (isset($qs[0]) && $qs[0] == 'link') {
-	//view categories (link select cat)
-	if (!isset($qs[1])){
-		$lc->show_categories("link");
-
-	//view links in cat
-	}elseif (isset($qs[1]) && $qs[1] == 'view' && isset($qs[2]) && (is_numeric($qs[2]) || $qs[2] == "all") ) {
-		$lc->show_links();
 
-	//edit link
-	}elseif (isset($qs[1]) && $qs[1] == 'edit' && isset($qs[2]) && is_numeric($qs[2])) {
-		$lc->show_link_create();
 
-	//create link
-	}elseif (isset($qs[1]) && $qs[1] == 'create' && !isset($qs[2]) ) {
-		$lc->show_link_create();
-
-	//post submitted
-	}elseif (isset($qs[1]) && $qs[1] == 'sn' && isset($qs[2]) && is_numeric($qs[2]) ) {
-		$lc->show_link_create();
+//show link categories (cat edit)
+if (!e_QUERY) 
+{
+	$lc->show_categories('cat');
+}
+elseif (isset($qs[0]))
+{
+	switch ($qs[0])
+	{
+		case 'cat' :
+			if (isset($qs[1]))
+			{
+				//show cat edit form
+				if (($qs[1] == 'edit') && isset($qs[2]) && is_numeric($qs[2])) 
+				{
+					$lc->show_cat_create();
+				}
+				//show cat create form
+				elseif (($qs[1] == 'create') && !isset($qs[2]) ) 
+				{
+					$lc->show_cat_create();
+				}
+			}
+			break;
+		case 'link' :
+			if (isset($qs[1]))
+			{
+				switch ($qs[1])
+				{
+					case 'view' :
+						if (isset($qs[2]) && (is_numeric($qs[2]) || $qs[2] == "all") ) 
+						{
+							$lc->show_links();
+						}
+						break;
+					case 'edit' :		// Edit link
+						if (isset($qs[2]) && is_numeric($qs[2])) 
+						{
+							$lc->show_link_create();
+						}
+						break;
+					case 'create' :		// Create link
+						if (!isset($qs[2]) ) 
+						{
+							$lc->show_link_create();
+						}
+						break;
+					case 'sn' :			// Post submitted
+						if (isset($qs[2]) && is_numeric($qs[2]) ) 
+						{
+							$lc->show_link_create();
+						}
+						break;
+				}
+			}
+			else
+			{
+				$lc->show_categories('link');	//view categories (link select cat)
+			}
+			break;
+		case 'sn' :		//view submitted links
+			$lc->show_submitted();
+			break;
+		case 'opt' :	// Options
+			$lc->show_pref_options();
+			break;
 	}
 }
 
-//view submitted links
-if (isset($qs[0]) && $qs[0] == 'sn') {
-	$lc->show_submitted();
-}
-
-//options
-if (isset($qs[0]) && $qs[0] == 'opt') {
-	$lc->show_pref_options();
-}
 
 // ##### Display options --------------------------------------------------------------------------
-function admin_linkspage_config_adminmenu(){
+function admin_linkspage_config_adminmenu()
+{
 	global $qs, $sql;
-	if ($qs[0] == "") {
-		$act = "cat";
-	}else{
-		$act = $qs[0];
-		if(isset($qs[1])){
-			if($qs[1] == "create"){
-				$act .= ".create";
-			}
-			if($qs[1] == "edit"){
-				$act .= "";
-			}
-			if($qs[1] == "view"){
-				$act .= "";
-			}
+	$act = varset($qs[0],'cat');
+	if($act == 'cat' && isset($qs[1]))
+	{
+		if($qs[1] == 'create')
+		{
+			$act .= '.create';
+		}
+		elseif ($qs[1] == 'edit')
+		{
+			$act .= '';
+		}
+		elseif ($qs[1] == 'view')
+		{
+			$act .= '';
 		}
 	}
 
@@ -206,7 +277,8 @@
 	$var['link.create']['text'] = LCLAN_ADMINMENU_5;
 	$var['link.create']['link'] = e_SELF."?link.create";
 		
-	if ($tot = $sql->db_Select("tmp", "*", "tmp_ip='submitted_link' ")) {
+	if ($tot = $sql->db_Select("tmp", "*", "tmp_ip='submitted_link' ")) 
+	{
 		$var['sn']['text'] = LCLAN_ADMINMENU_7." (".$tot.")";
 		$var['sn']['link'] = e_SELF."?sn";
 	}
@@ -216,10 +288,12 @@
 		
 	show_admin_menu(LCLAN_ADMINMENU_1, $act, $var);
 		
-	if($qs[0] != "opt"){
+	if($qs[0] != 'opt')
+	{
 		unset($var);
 		$var=array();
-		if ($sql->db_Select("links_page_cat", "*")) {
+		if ($sql->db_Select("links_page_cat", "*")) 
+		{
 			while ($row = $sql->db_Fetch()) {
 				$var[$row['link_category_id']]['text'] = $row['link_category_name'];
 				$var[$row['link_category_id']]['link'] = e_SELF."?link.view.".$row['link_category_id'];
@@ -228,7 +302,8 @@
 			show_admin_menu(LCLAN_ADMINMENU_8, $active, $var);
 		}
 	}
-	if(isset($qs[0]) && $qs[0] == "opt"){
+	if(isset($qs[0]) && $qs[0] == "opt")
+	{
 		unset($var);
 		$var=array();
 		$var['optgeneral']['text']	= LCLAN_OPT_MENU_1;
diff -x .svn -aruN 1.0.0.src/e107_plugins/links_page/languages/English.php 1.0.2.src/e107_plugins/links_page/languages/English.php
--- 1.0.0.src/e107_plugins/links_page/languages/English.php	2012-10-30 15:39:55.475444605 +0000
+++ 1.0.2.src/e107_plugins/links_page/languages/English.php	2012-10-30 15:40:38.555444528 +0000
@@ -1,15 +1,18 @@
 <?php
 /*
-+ ----------------------------------------------------------------------------+
-|     e107 website system - Language File.
-|
-|     $Source: /cvs_backup/e107_0.7/e107_plugins/links_page/languages/English.php,v $
-|     $Revision: 11758 $
-|     $Date: 2010-09-07 07:18:00 -0500 (Tue, 07 Sep 2010) $
-|     $Author: e107steved $
-+----------------------------------------------------------------------------+
-*/
-
+ * e107 website system - English Language file
+ * 
+ * Copyright (C) 2001-2002 Steve Dunstan (jalist@e107.org)
+ * Copyright (C) 2008-2010 e107 Inc (e107.org)
+ * 
+ * Released under the terms and conditions of the GNU General Public License
+ * (http://gnu.org).
+ * 
+ * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/links_page/languages/English.php $
+ * $Revision: 12607 $
+ * $Id: English.php 12607 2012-03-16 21:11:42Z nlstart $
+ * $Author: nlstart $
+ */
 
 define("LCLAN_PLUGIN_LAN_1", "Links Page");
 define("LCLAN_PLUGIN_LAN_2", "Links Page For Displaying External Web Links");
diff -x .svn -aruN 1.0.0.src/e107_plugins/links_page/link_class.php 1.0.2.src/e107_plugins/links_page/link_class.php
--- 1.0.0.src/e107_plugins/links_page/link_class.php	2012-10-30 15:39:55.476444470 +0000
+++ 1.0.2.src/e107_plugins/links_page/link_class.php	2012-10-30 15:40:38.556444655 +0000
@@ -10,18 +10,21 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/links_page/link_class.php $
-|     $Revision: 11678 $
-|     $Id: link_class.php 11678 2010-08-22 00:43:45Z e107coders $
-|     $Author: e107coders $
+|     $Revision: 12570 $
+|     $Id: link_class.php 12570 2012-01-21 16:42:48Z e107steved $
+|     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
 
 if (!defined('e107_INIT')) { exit; }
 
-class linkclass {
 
-    function LinkPageDefaultPrefs(){
+define('URL_SEPARATOR','X');		// Used in names of 'inc' and 'dec' fields
 
+class linkclass 
+{
+    function LinkPageDefaultPrefs()
+	{
         $linkspage_pref['link_page_categories'] = "0";
         $linkspage_pref['link_submit'] = "0";
         $linkspage_pref['link_submit_class'] = "0";
@@ -94,11 +97,13 @@
         return $linkspage_pref;
     }
 
-    function getLinksPagePref(){
+    function getLinksPagePref()
+	{
         global $sql, $eArrayStorage;
 
         $num_rows = $sql -> db_Select("core", "*", "e107_name='links_page' ");
-        if ($num_rows == 0) {
+        if ($num_rows == 0) 
+		{
             $linkspage_pref = $this->LinkPageDefaultPrefs();
             $tmp = $eArrayStorage->WriteArray($linkspage_pref);
             $sql -> db_Insert("core", "'links_page', '{$tmp}' ");
@@ -110,14 +115,20 @@
         return $linkspage_pref;
     }
 
-    function UpdateLinksPagePref(){
+
+    function UpdateLinksPagePref()
+	{
         global $sql, $eArrayStorage, $tp;
 
         $num_rows = $sql -> db_Select("core", "*", "e107_name='links_page' ");
-        if ($num_rows == 0) {
-            $sql -> db_Insert("core", "'links_page', '' ");
-        }else{
-            $row = $sql -> db_Fetch();
+        if ($num_rows == 0)
+		{
+            $sql -> db_Insert("core", "'links_page', '' ");	// Create dummy entry if none present
+        }
+		else
+		{
+            $row = $sql->db_Fetch(MYSQL_ASSOC);
+
 
             //assign new preferences
             foreach($_POST as $k => $v){
@@ -134,14 +145,18 @@
         return $linkspage_pref;
     }
 
-	function ShowNextPrev($from='0', $number, $total){
+
+	function ShowNextPrev($from='0', $number, $total)
+	{
 		global $linkspage_pref, $qs, $tp, $link_shortcodes, $LINK_NEXTPREV, $LINK_NP_TABLE, $pref;
 
 		$number = (e_PAGE == 'admin_linkspage_config.php' ? '20' : $number);
-		if($total<=$number){
+		if($total<=$number)
+		{
 			return;
 		}
-		if(e_PAGE == 'admin_linkspage_config.php' || (isset($linkspage_pref["link_nextprev"]) && $linkspage_pref["link_nextprev"])){
+		if(e_PAGE == 'admin_linkspage_config.php' || (isset($linkspage_pref["link_nextprev"]) && $linkspage_pref["link_nextprev"]))
+		{
 			$np_querystring = e_SELF."?[FROM]".(isset($qs[0]) ? ".".$qs[0] : "").(isset($qs[1]) ? ".".$qs[1] : "").(isset($qs[2]) ? ".".$qs[2] : "").(isset($qs[3]) ? ".".$qs[3] : "").(isset($qs[4]) ? ".".$qs[4] : "");
 			$parms = $total.",".$number.",".$from.",".$np_querystring."";
 			$LINK_NEXTPREV = $tp->parseTemplate("{NEXTPREV={$parms}}");
@@ -158,7 +173,9 @@
 		}
 	}
 
-    function setPageTitle(){
+
+    function setPageTitle()
+	{
         global $sql, $qs, $linkspage_pref;
 
         //show all categories
@@ -206,8 +223,8 @@
 
 
 
-    function parse_link_append($rowl){
-
+    function parse_link_append($rowl)
+	{
         global $tp, $linkspage_pref;
         if($linkspage_pref['link_open_all'] && $linkspage_pref['link_open_all'] == "5"){
             $link_open_type = $rowl['link_open'];
@@ -238,7 +255,8 @@
 
 
 
-    function showLinkSort($mode=''){
+    function showLinkSort($mode='')
+	{
         global $rs, $ns, $qs, $linkspage_pref;
 
         $check = "";
@@ -291,7 +309,9 @@
         return $sotext;
     }
 
-    function parseOrderCat($orderstring){
+
+    function parseOrderCat($orderstring)
+	{
         if(substr($orderstring,6) == "heading"){
             $orderby        = "link_category_name";
             $orderby2       = "";
@@ -309,7 +329,8 @@
         return $orderby." ".(substr($orderstring,5,1) == "a" ? "ASC" : "DESC")." ".$orderby2;
     }
 
-    function parseOrderLink($orderstring){
+	function parseOrderLink($orderstring)
+	{
         if(substr($orderstring,6) == "heading"){
             $orderby        = "link_name";
             $orderby2       = "";
@@ -333,7 +354,8 @@
         return $orderby." ".(substr($orderstring,5,1) == "a" ? "ASC" : "DESC")." ".$orderby2;
     }
 
-    function getOrder($mode=''){
+	function getOrder($mode='')
+	{
         global $qs, $linkspage_pref;
 
         if(isset($qs[0]) && substr($qs[0],0,5) == "order"){
@@ -369,12 +391,14 @@
         return $order;
     }
 
-    function show_message($message, $caption='') {
+    function show_message($message, $caption='') 
+	{
         global $ns;
         $ns->tablerender($caption, "<div style='text-align:center'><b>".$message."</b></div>");
     }
 
-    function uploadLinkIcon(){
+    function uploadLinkIcon()
+	{
         global $ns, $pref;
         $pref['upload_storagetype'] = "1";
         require_once(e_HANDLER."upload_handler.php");
@@ -382,9 +406,11 @@
         $uploaded = file_upload($pathicon);
 
         $icon = "";
-        if($uploaded) {
+        if($uploaded) 
+		{
             $icon = $uploaded[0]['name'];
-            if($_POST['link_resize_value']){
+            if($_POST['link_resize_value'])
+			{
                 require_once(e_HANDLER."resize_handler.php");
                 resize_image($pathicon.$icon, $pathicon.$icon, $_POST['link_resize_value'], "nocopy");
             }
@@ -393,7 +419,8 @@
         $this -> show_message($msg);
     }
 
-    function uploadCatLinkIcon(){
+	function uploadCatLinkIcon()
+	{
         global $ns, $pref;
         $pref['upload_storagetype'] = "1";
         require_once(e_HANDLER."upload_handler.php");
@@ -401,9 +428,11 @@
         $uploaded = file_upload($pathicon);
 
         $icon = "";
-        if($uploaded) {
+        if($uploaded) 
+		{
             $icon = $uploaded[0]['name'];
-            if($_POST['link_cat_resize_value']){
+            if($_POST['link_cat_resize_value'])
+			{
                 require_once(e_HANDLER."resize_handler.php");
                 resize_image($pathicon.$icon, $pathicon.$icon, $_POST['link_cat_resize_value'], "nocopy");
             }
@@ -412,66 +441,89 @@
         $this -> show_message($msg);
     }
 
-    function dbCategoryCreate() {
+
+    function dbCategoryCreate() 
+	{
         global $sql, $tp;
         $link_t = $sql->db_Count("links_page_cat", "(*)");
-        $sql->db_Insert("links_page_cat", " '0', '".$tp -> toDB($_POST['link_category_name'])."', '".$tp -> toDB($_POST['link_category_description'])."', '".$tp -> toDB($_POST['link_category_icon'])."', '".($link_t+1)."', '".$tp -> toDB($_POST['link_category_class'])."', '".time()."' ");
+        $linkData = array();
+		$linkData['link_category_name'] = $tp -> toDB($_POST['link_category_name']);
+		$linkData['link_category_description'] = $tp -> toDB($_POST['link_category_description']);
+		$linkData['link_category_icon'] = $tp -> toDB($_POST['link_category_icon']);
+		$linkData['link_category_order'] = $link_t+1;
+		$linkData['link_category_class'] = $tp -> toDB($_POST['link_category_class']);
+		$linkData['link_category_datestamp'] = time();
+		$sql->db_Insert('links_page_cat', $linkData);
         $this->show_message(LCLAN_ADMIN_4);
     }
-    function dbCategoryUpdate() {
+	function dbCategoryUpdate() 
+	{
         global $sql, $tp;
         $time = ($_POST['update_datestamp'] ? time() : ($_POST['link_category_datestamp'] != "0" ? $_POST['link_category_datestamp'] : time()) );
         $sql->db_Update("links_page_cat", "link_category_name ='".$tp -> toDB($_POST['link_category_name'])."', link_category_description='".$tp -> toDB($_POST['link_category_description'])."', link_category_icon='".$tp -> toDB($_POST['link_category_icon'])."', link_category_order='".$tp -> toDB($_POST['link_category_order'])."', link_category_class='".$tp -> toDB($_POST['link_category_class'])."', link_category_datestamp='".intval($time)."'   WHERE link_category_id='".intval($_POST['link_category_id'])."'");
         $this->show_message(LCLAN_ADMIN_5);
     }
 
-    function dbOrderUpdate($order) {
+
+    function dbOrderUpdate($order) 
+	{
         global $sql;
-        foreach ($order as $order_id) {
+		foreach ($order as $order_id) 
+		{
             $tmp = explode(".", $order_id);
-        $sql->db_Update("links_page", "link_order=".intval($tmp[1])." WHERE link_id=".intval($tmp[0]));
+			$sql->db_Update("links_page", "link_order=".intval($tmp[1])." WHERE link_id=".intval($tmp[0]));
         }
         $this->show_message(LCLAN_ADMIN_9);
     }
 
-    function dbOrderCatUpdate($order) {
+
+	function dbOrderCatUpdate($order) 
+	{
         global $sql;
-        foreach ($order as $order_id) {
+		foreach ($order as $order_id) 
+		{
             $tmp = explode(".", $order_id);
             $sql->db_Update("links_page_cat", "link_category_order=".intval($tmp[1])." WHERE link_category_id=".intval($tmp[0]));
         }
         $this->show_message(LCLAN_ADMIN_9);
     }
 
-    function dbOrderUpdateInc($inc) {
+
+	function dbOrderUpdateInc($linkid, $link_order, $location) 
+	{
         global $sql;
-        $tmp = explode(".", $inc);
-        $linkid = intval($tmp[0]);
-        $link_order = intval($tmp[1]);
-        $location = $tmp[2];
-        if(isset($location)){
-            $location = intval($location);
-            $sql->db_Update("links_page", "link_order=link_order+1 WHERE link_order='".($link_order-1)."' AND link_category='$location'");
-            $sql->db_Update("links_page", "link_order=link_order-1 WHERE link_id='$linkid' AND link_category='$location'");
-        }else{
-            $sql->db_Update("links_page_cat", "link_category_order=link_category_order+1 WHERE link_category_order='".($link_order-1)."' ");
-            $sql->db_Update("links_page_cat", "link_category_order=link_category_order-1 WHERE link_category_id='$linkid' ");
+		//$tmp = explode(".", $inc);
+        //$linkid = intval($tmp[0]);
+        //$link_order = intval($tmp[1]);
+        //$location = $tmp[2];
+        if($location)
+		{
+            $sql->db_Update("links_page", "link_order=link_order+1 WHERE link_order='".($link_order-1)."' AND link_category=".$location);
+            $sql->db_Update("links_page", "link_order=link_order-1 WHERE link_id='{$linkid}' AND link_category=".$location);
+        }
+		else
+		{
+            $sql->db_Update("links_page_cat", "link_category_order=link_category_order+1 WHERE link_category_order=".($link_order-1));
+            $sql->db_Update("links_page_cat", "link_category_order=link_category_order-1 WHERE link_category_id=".$linkid);
         }
     }
 
-    function dbOrderUpdateDec($dec) {
+	function dbOrderUpdateDec($linkid, $link_order, $location) 
+	{
         global $sql;
-        $tmp = explode(".", $dec);
-        $linkid = intval($tmp[0]);
-        $link_order = intval($tmp[1]);
-        $location = $tmp[2];
-        if(isset($location)){
-            $location = intval($location);
-            $sql->db_Update("links_page", "link_order=link_order-1 WHERE link_order='".($link_order+1)."' AND link_category='$location'");
-            $sql->db_Update("links_page", "link_order=link_order+1 WHERE link_id='$linkid' AND link_category='$location'");
-        }else{
+        //$tmp = explode(".", $dec);
+        //$linkid = intval($tmp[0]);
+        //$link_order = intval($tmp[1]);
+        //$location = $tmp[2];
+        if($location)
+		{
+            $sql->db_Update("links_page", "link_order=link_order-1 WHERE link_order=".($link_order+1)." AND link_category=".$location);
+            $sql->db_Update("links_page", "link_order=link_order+1 WHERE link_id='{$linkid}' AND link_category=".$location);
+        }
+		else
+		{
             $sql->db_Update("links_page_cat", "link_category_order=link_category_order-1 WHERE link_category_order='".($link_order+1)."' ");
-            $sql->db_Update("links_page_cat", "link_category_order=link_category_order+1 WHERE link_category_id='$linkid' ");
+            $sql->db_Update("links_page_cat", "link_category_order=link_category_order+1 WHERE link_category_id=".$linkid);
         }
     }
 
@@ -555,7 +607,8 @@
         }
     }
 
-    function show_link_create() {
+	function show_link_create()
+	{
         global $sql, $rs, $qs, $ns, $fl, $linkspage_pref;
 
         $row['link_category']       = "";
@@ -567,13 +620,16 @@
         $row['link_class']          = "";
         $link_resize_value          = (isset($linkspage_pref['link_resize_value']) && $linkspage_pref['link_resize_value'] ? $linkspage_pref['link_resize_value'] : "100");
 
-        if (isset($qs[1]) && $qs[1] == 'edit' && !isset($_POST['submit'])) {
-            if ($sql->db_Select("links_page", "*", "link_id='".intval($qs[2])."' ")) {
+        if (isset($qs[1]) && $qs[1] == 'edit' && !isset($_POST['submit'])) 
+		{
+            if ($sql->db_Select("links_page", "*", "link_id='".intval($qs[2])."' ")) 
+			{
                 $row = $sql->db_Fetch();
             }
         }
 
-        if (isset($qs[1]) && $qs[1] == 'sn') {
+        if (isset($qs[1]) && $qs[1] == 'sn') 
+		{
             if ($sql->db_Select("tmp", "*", "tmp_time='".intval($qs[2])."'")) {
                 $row = $sql->db_Fetch();
                 $submitted                  = explode("^", $row['tmp_info']);
@@ -723,6 +779,11 @@
         $ns->tablerender(LCLAN_ITEM_24, $text);
     }
 
+
+
+	/**
+	 *		Display list of links within a particular category
+	 */
     function show_links() 
 	{
         global $sql, $qs, $rs, $ns, $tp, $from;
@@ -783,15 +844,25 @@
                         }
                     }
                 }
-                if($row['link_order'] == "1"){
+
+				$name_suffix = URL_SEPARATOR.$linkid.URL_SEPARATOR.$row['link_order'].URL_SEPARATOR.$row['link_category'];
+                if($row['link_order'] == "1")
+				{
                     $up = "&nbsp;&nbsp;&nbsp;";
-                }else{
-                    $up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' value='".$linkid.".".$row['link_order'].".".$row['link_category']."' name='inc' />";
                 }
-                if($row['link_order'] == $link_total){
+				else
+				{
+					//$up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' value='".$linkid.".".$row['link_order'].".".$row['link_category']."' name='inc' />";
+					$up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' name='inc".$name_suffix."' />";
+                }
+                if($row['link_order'] == $link_total)
+				{
                     $down = "&nbsp;&nbsp;&nbsp;";
-                }else{
-                    $down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' value='".$linkid.".".$row['link_order'].".".$row['link_category']."' name='dec' />";
+                }
+				else
+				{
+                    //$down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' value='".$linkid.".".$row['link_order'].".".$row['link_category']."' name='dec' />";
+					$down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' name='dec".$name_suffix."' />";
                 }
                 $text .= "
                 <tr>
@@ -923,7 +994,15 @@
         unset($row['link_category_name'], $row['link_category_description'], $row['link_category_icon']);
     }
 
-    function show_categories($mode) {
+
+
+	/**
+	 *	Show a list of categories
+	 *
+	 *	@param string $mode = (cat)
+	 */
+	function show_categories($mode) 
+	{
         global $sql, $rs, $ns, $tp, $fl;
 
         if ($category_total = $sql->db_Select("links_page_cat", "*", "ORDER BY link_category_order ASC", "mode=no_where")) {
@@ -942,11 +1021,15 @@
             }
             $text .= "
             </tr>";
-            while ($row = $sql->db_Fetch()) {
+			while ($row = $sql->db_Fetch()) 
+			{
                 $linkcatid = $row['link_category_id'];
-                if ($row['link_category_icon']) {
+				if ($row['link_category_icon']) 
+				{
                     $img = (strstr($row['link_category_icon'], "/") ? "<img src='".e_BASE.$row['link_category_icon']."' alt='' style='vertical-align:middle' />" : "<img src='".e_PLUGIN_ABS."links_page/cat_images/".$row['link_category_icon']."' alt='' style='vertical-align:middle' />");
-                } else {
+                } 
+				else 
+				{
                     $img = "&nbsp;";
                 }
                 $text .= "
@@ -956,16 +1039,26 @@
                     <a href='".e_PLUGIN_ABS."links_page/links.php?cat.".$linkcatid."' rel='external'>".LINK_ICON_LINK."</a>
                     ".$row['link_category_name']."<br /><span class='smalltext'>".$row['link_category_description']."</span>
                 </td>";
-                if($mode == "cat"){
-                    if($row['link_category_order'] == "1"){
+				if($mode == "cat")
+				{
+					$name_suffix = URL_SEPARATOR.$linkcatid.URL_SEPARATOR.$row['link_category_order'].URL_SEPARATOR;
+                    if($row['link_category_order'] == "1")
+					{
                         $up = "&nbsp;&nbsp;&nbsp;";
-                    }else{
-                        $up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' value='".$linkcatid.".".$row['link_category_order']."' name='inc' />";
                     }
-                    if($row['link_category_order'] == $category_total){
+					else
+					{
+						//$up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' value='".$linkcatid.".".$row['link_category_order']."' name='inc' />";
+						$up = "<input type='image' src='".LINK_ICON_ORDER_UP_BASE."' name='inc".$name_suffix."' />";
+                    }
+                    if($row['link_category_order'] == $category_total)
+					{
                         $down = "&nbsp;&nbsp;&nbsp;";
-                    }else{
-                        $down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' value='".$linkcatid.".".$row['link_category_order']."' name='dec' />";
+                    }
+					else
+					{
+						//$down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' value='".$linkcatid.".".$row['link_category_order']."' name='dec' />";
+						$down = "<input type='image' src='".LINK_ICON_ORDER_DOWN_BASE."' name='dec".$name_suffix."' />";
                     }
                     $text .= "
                     <td style='width:10%; text-align:center; white-space: nowrap' class='forumheader3'>
@@ -978,19 +1071,23 @@
                     </td>
                     <td style='width:10%; text-align:center' class='forumheader3'>
                         <select name='link_category_order[]' class='tbox'>";
-                        for($a = 1; $a <= $category_total; $a++) {
+                        for($a = 1; $a <= $category_total; $a++) 
+						{
                             $text .= $rs -> form_option($a, ($row['link_category_order'] == $a ? "1" : "0"), $linkcatid.".".$a, "");
                         }
                         $text .= $rs -> form_select_close()."
                     </td>";
-                }else{
+                }
+				else
+				{
                     $text .= "<td style='width:10%; text-align:center; white-space: nowrap' class='forumheader3'>
                     <a href='".e_SELF."?link.view.".$linkcatid."' title='".LCLAN_CAT_9."'>".LINK_ICON_EDIT."</a></td>";
                 }
                 $text .= "
                 </tr>\n";
             }
-            if($mode == "cat"){
+            if($mode == "cat")
+			{
                 $text .= "
                 <tr>
                 <td class='forumheader' colspan='4'>&nbsp;</td>
@@ -1447,7 +1544,8 @@
         $ns->tablerender(LCLAN_OPT_2, $text);
     }
 
-    function pref_submit() {
+    function pref_submit() 
+	{
         global $rs;
         $text = "
         <tr>
diff -x .svn -aruN 1.0.0.src/e107_plugins/links_page/links_page_sql.php 1.0.2.src/e107_plugins/links_page/links_page_sql.php
--- 1.0.0.src/e107_plugins/links_page/links_page_sql.php	2012-10-30 15:39:55.475444605 +0000
+++ 1.0.2.src/e107_plugins/links_page/links_page_sql.php	2012-10-30 15:40:38.557441622 +0000
@@ -11,12 +11,12 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/links_page/links_page_sql.php $
-|     $Revision: 12092 $
-|     $Id: links_page_sql.php 12092 2011-03-11 18:49:56Z e107steved $
-|     $Author: e107steved $
+|     $Revision: 12938 $
+|     $Id: links_page_sql.php 12938 2012-08-10 03:57:15Z e107coders $
+|     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
-header("location:../index.php");
+header("location:../../index.php");
 exit;
 ?>
 # Table structure for table `links_page_cat`
diff -x .svn -aruN 1.0.0.src/e107_plugins/linkwords/linkwords.php 1.0.2.src/e107_plugins/linkwords/linkwords.php
--- 1.0.0.src/e107_plugins/linkwords/linkwords.php	2012-10-30 15:39:55.479445552 +0000
+++ 1.0.2.src/e107_plugins/linkwords/linkwords.php	2012-10-30 15:40:38.559444792 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/linkwords/linkwords.php $
-|     $Revision: 11678 $
-|     $Id: linkwords.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12885 $
+|     $Id: linkwords.php 12885 2012-07-18 20:41:53Z e107coders $
 |     $Author: e107coders $
 |
 +----------------------------------------------------------------------------+
@@ -59,11 +59,12 @@
 	  // Will probably need linkwords on this page - so get the info
 	  $this->lw_enabled = TRUE;
 	  $link_sql = new db;
+	  mb_internal_encoding(CHARSET);
 	  if($link_sql -> db_Select("linkwords", "*", "linkword_active=0"))
 	  {
 		  while ($row = $link_sql->db_Fetch())
 		  {
-		    $lw = trim(strtolower($row['linkword_word']));
+		    $lw = trim(mb_convert_case($row['linkword_word'],MB_CASE_LOWER));
 			if (strpos($lw,','))
 			{  // Several words to same link
 			  $lwlist = explode(',',$lw);
@@ -126,17 +127,19 @@
 	
 	function linksproc($text,$first,$limit)
 	{  // This function is called recursively - it splits the text up into blocks - some containing a particular linkword
-	  while (($first < $limit) && (stripos($text,$this->word_list[$first]) === FALSE))   { $first++; };
+	  while (($first < $limit) && (mb_stripos($text,$this->word_list[$first]) === FALSE))   { $first++; };
 	  if ($first == $limit) return $text;		// Return if no linkword found
 	  
 	  // There's at least one occurrence of the linkword in the text
 	  $ret = '';
 	  $lw = $this->word_list[$first];
 	  // This splits the text into blocks, some of which will precisely contain a linkword
-	  $split_line = preg_split('#\b('.$lw.')\b#i', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
+	  $split_line = preg_split('#\b('.$lw.')\b#iu', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
+	  //$split_line = mb_split('\b('.$lw.')\b', $text, -1);
+	  //mb_eregi('#\b('.$lw.')\b#i', $text , $split_line);
 	  foreach ($split_line AS $sl)
 	  {
-	    if (strcasecmp($sl,$lw) == 0)
+	    if (strcmp(mb_convert_case($sl,MB_CASE_LOWER),mb_convert_case($lw,MB_CASE_LOWER)) == 0)
 		{  // Do linkword replace
 		  $ret .= " <a href='".$this->link_list[$first]."' rel='external'>{$sl}</a>";
 		}
diff -x .svn -aruN 1.0.0.src/e107_plugins/list_new/list_class.php 1.0.2.src/e107_plugins/list_new/list_class.php
--- 1.0.0.src/e107_plugins/list_new/list_class.php	2012-10-30 15:39:55.508444377 +0000
+++ 1.0.2.src/e107_plugins/list_new/list_class.php	2012-10-30 15:40:38.563444400 +0000
@@ -10,8 +10,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/list_new/list_class.php $
-|     $Revision: 12229 $
-|     $Id: list_class.php 12229 2011-05-28 11:13:38Z e107steved $
+|     $Revision: 12575 $
+|     $Id: list_class.php 12575 2012-01-23 22:34:47Z e107steved $
 |     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
@@ -162,8 +162,8 @@
 
 		require_once(e_HANDLER."file_class.php");
 		$fl = new e_file;
-		$rejectlist = array('$.','$..','/','CVS','thumbs.db','Thumbs.db','*._$', 'index', 'null*', '.bak');
-		$iconlist = $fl->get_files(e_PLUGIN, "e_list\.php$", "standard", 1);
+		//$rejectlist = array('$.','$..','/','CVS','thumbs.db','Thumbs.db','*._$', 'index', 'null*', '.bak');
+		$iconlist = $fl->get_files(e_PLUGIN, "^e_list\.php$", "standard", 1);
 		foreach($iconlist as $icon)
 		{
 			$tmp = explode("/", $icon['path']);
diff -x .svn -aruN 1.0.0.src/e107_plugins/list_new/section/list_comment.php 1.0.2.src/e107_plugins/list_new/section/list_comment.php
--- 1.0.0.src/e107_plugins/list_new/section/list_comment.php	2012-10-30 15:39:55.508444377 +0000
+++ 1.0.2.src/e107_plugins/list_new/section/list_comment.php	2012-10-30 15:40:38.564444667 +0000
@@ -16,10 +16,13 @@
 }
 
 $data = $cobj->getCommentData(intval($arr[7]), '0', $qry);
-
+// SecretR - comment_itemurl - use if available
 foreach($data as $row){
 	$rowheading	= $this -> parse_heading($row['comment_title'], $mode);
-	if($row['comment_url']){
+	if(varsettrue($row['comment_itemurl'])){
+		$HEADING	= "<a href='".$row['comment_itemurl']."' title='".$row['comment_itemurl']."'>".$tp -> toHTML($rowheading, TRUE)."</a>";
+	}
+	elseif($row['comment_url']){
 		$HEADING	= "<a href='".$row['comment_url']."' title='".$row['comment_title']."'>".$tp -> toHTML($rowheading, TRUE)."</a>";
 	}else{
 		$HEADING	= $tp -> toHTML($rowheading, TRUE);
diff -x .svn -aruN 1.0.0.src/e107_plugins/log/consolidate.php 1.0.2.src/e107_plugins/log/consolidate.php
--- 1.0.0.src/e107_plugins/log/consolidate.php	2012-10-30 15:39:55.520444228 +0000
+++ 1.0.2.src/e107_plugins/log/consolidate.php	2012-10-30 15:40:38.565441783 +0000
@@ -11,13 +11,15 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/log/consolidate.php $
-|     $Revision: 11678 $
-|     $Id: consolidate.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12938 $
+|     $Id: consolidate.php 12938 2012-08-10 03:57:15Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
 
 /* first thing to do is check if the log file is out of date ... */
+if (!defined('e107_INIT')) { exit; }
+
 $pathtologs = e_PLUGIN."log/logs/";
 $date = date("z.Y", time());
 $yesterday = date("z.Y",(time() - 86400));		// This makes sure year wraps round OK
diff -x .svn -aruN 1.0.0.src/e107_plugins/log/log.php 1.0.2.src/e107_plugins/log/log.php
--- 1.0.0.src/e107_plugins/log/log.php	2012-10-30 15:39:55.519443545 +0000
+++ 1.0.2.src/e107_plugins/log/log.php	2012-10-30 15:40:38.576445057 +0000
@@ -9,7 +9,7 @@
 * Site access logging - 'receiver'
 *
 * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/log/log.php $
-* $Id: log.php 12227 2011-05-28 09:05:07Z e107steved $
+* $Id: log.php 12938 2012-08-10 03:57:15Z e107coders $
 *
 */
 
@@ -23,6 +23,7 @@
 		err_referer - referrer if came via error page
 */
 define('log_INIT', TRUE);
+error_reporting(0);
 
 //define('STATS_LOG_DEBUG', TRUE);			// Enables separate logging of first reference of each page to a separate file
 
diff -x .svn -aruN 1.0.0.src/e107_plugins/newsfeed/newsfeed_functions.php 1.0.2.src/e107_plugins/newsfeed/newsfeed_functions.php
--- 1.0.0.src/e107_plugins/newsfeed/newsfeed_functions.php	2012-10-30 15:39:55.478445833 +0000
+++ 1.0.2.src/e107_plugins/newsfeed/newsfeed_functions.php	2012-10-30 15:40:38.582444647 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/newsfeed/newsfeed_functions.php $
-|     $Revision: 12021 $
-|     $Id: newsfeed_functions.php 12021 2010-12-31 01:04:42Z e107coders $
+|     $Revision: 12626 $
+|     $Id: newsfeed_functions.php 12626 2012-04-08 20:52:35Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -59,7 +59,7 @@
 							echo NFLAN_48."<br /><br />".$serializedArray;
 						}
 					}
-					else
+					elseif(ADMIN)
 					{
 						echo $xml -> error;
 					}
diff -x .svn -aruN 1.0.0.src/e107_plugins/pdf/e107pdf.php 1.0.2.src/e107_plugins/pdf/e107pdf.php
--- 1.0.0.src/e107_plugins/pdf/e107pdf.php	2012-10-30 15:39:55.509441797 +0000
+++ 1.0.2.src/e107_plugins/pdf/e107pdf.php	2012-10-30 15:40:38.587444557 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_plugins/pdf/e107pdf.php $
-|     $Revision: 11678 $
-|     $Id: e107pdf.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12938 $
+|     $Id: e107pdf.php 12938 2012-08-10 03:57:15Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -20,6 +20,7 @@
 // Debug option - adds entries to rolling log (only works in 0.8)
 //define ('PDF_DEBUG', TRUE);
 define ('PDF_DEBUG', FALSE);
+if (!defined('e107_INIT')) { exit; }
 
 //extend fpdf class from package with custom functions
 class e107PDF extends UFPDF{
@@ -702,4 +703,4 @@
 
 }
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 1.0.0.src/e107_themes/core/admin_alt_nav.sc 1.0.2.src/e107_themes/core/admin_alt_nav.sc
--- 1.0.0.src/e107_themes/core/admin_alt_nav.sc	2012-10-30 15:39:55.544443925 +0000
+++ 1.0.2.src/e107_themes/core/admin_alt_nav.sc	2012-10-30 15:40:38.611444688 +0000
@@ -34,7 +34,7 @@
 		if ($cat_id) {
 			$text .= "<span class=\"menuItemArrow\">&#9654;</span>";
 		}
-			$text .= "</a>";
+			$text .= "</a>\n";
 		return $text;
 	}
 	if (file_exists(THEME.'nav_menu.js')) {
@@ -137,8 +137,10 @@
 		foreach($slinks->eLinkList['head_menu'] as $k=>$lk)
 		{
 			$link = (substr($lk['link_url'],0,1)!="/" && substr($lk['link_url'],0,3)!="{e_" && substr($lk['link_url'],0,4)!='http') ? "{e_BASE}".$lk['link_url'] : $lk['link_url'];
-			
-			$text .= adnav_main($tp->toHtml($lk['link_name'],'','defs'), $tp->replaceConstants($link,'full'), $tp->replaceConstants($lk['link_button'],'full'));	
+			$link = $tp->parseTemplate($link, TRUE); // dynamic URL support via Shortcodes. 
+			$img = (substr($lk['link_button'],0,3)=='{e_' || trim($lk['link_button'])=='') ? $lk['link_button'] : "{e_IMAGE}icons/".$lk['link_button'];
+			$imgTag = ($img) ? "<img src='".$img."' alt='".$tp->toAttribute($lk['link_name'])."' style='border: 0px none; vertical-align: bottom; width: 16px; height: 16px;' />" : "";
+			$text .= adnav_main($tp->toHtml($lk['link_name'],'','defs'), $tp->replaceConstants($link,'full'), $tp->replaceConstants($imgTag,'full'));	
 		}
 
 		$text .= "</div>";
diff -x .svn -aruN 1.0.0.src/e107_themes/core/admin_style.css 1.0.2.src/e107_themes/core/admin_style.css
--- 1.0.0.src/e107_themes/core/admin_style.css	2012-10-30 15:39:55.545479838 +0000
+++ 1.0.2.src/e107_themes/core/admin_style.css	2012-10-30 15:40:38.611444688 +0000
@@ -111,12 +111,11 @@
 .link_button a:hover { color:#666666; text-decoration:none; }
 .link_button_selected { padding:8px 8px 7px 8px; border:1px #B5B5B7 solid; font-weight:bold; color:#111111; -webkit-border-radius:3px; -moz-border-radius:3px; border-radius:3px; background-color:#FFFFFF; }
 
-
 .admin_main_col .helpbox { background-color:transparent; border:0px none ! important; }
 .admin_main_col .tbox { padding:5px 10px; margin:3px 5px ; width:90%; }
 .admin_main_col textarea.tbox { padding:5px 10px; margin:3px 5px ; width:90% ! important; }
 .admin_main_col input.tbox { padding:5px 10px; margin:3px 5px ; width:auto; }
-.admin_main_col select.tbox { padding:3px 3px 3px 3px; margin:3px 5px ; max-width:180px; }
+.admin_main_col select.tbox { padding:3px 3px 3px 3px; margin:3px 5px ; min-width:60px; max-width:220px; }
 .admin_main_col .nextprev{ border:0px none; background-color:transparent; border-collapse:collapse; padding:15px; margin:15px 0px ; text-align:left; width:auto; font-size:13px; font-weight:bold; }
 .admin_main_col .nextprev_link { background-color:#EDEDED; border:1px solid #B5B5B7; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:3px; color:#000000; margin:0px; padding:2px 6px; text-decoration:none; }
 .admin_main_col .nextprev_link:hover { background-color:#FFFFFF; color:#333333; text-decoration:none; }
@@ -131,7 +130,7 @@
 td.admin_left_col .bottmomenus_text,
 td.admin_right_col .bottmomenus_text { padding:10px 10px 0px 10px !important; }
 
-td.admin_mid_col { vertical-align:top; background-color:#FEFEFE; }
+td.admin_mid_col { vertical-align:top; background-color:#FEFEFE; color: #000000}
 td.admin_mid_col td.forumheader3  { width:auto; background-color:#FEFEFE; border:1px #B5B5B7 solid; vertical-align:top; padding:10px 10px; margin:0px; }
 td.admin_mid_col td.forumheader3 .td { width:auto; padding:0px;  }
 td.admin_mid_col td.forumheader3:hover { width:auto; background-color:#FEFEFE; border:1px #B5B5B7 solid; vertical-align:top; padding:10px 10px; margin:0px; }
@@ -174,4 +173,10 @@
 select.bb-preimageselect { min-width: 345px; max-width: 700px; width: 30%; }
 table.bb-preimageselect { -moz-box-shadow: 2px 2px 4px #999; -webkit-box-shadow: 2px 2px 4px #999; box-shadow: 2px 2px 4px #999; }
 
+#new-version { color:#FFCC00; width:250px; padding:5px; float:right; margin-left:50px;margin-top:10px; }
+#new-version-caption {font-weight:bold}
+.forumheader3 a, .forumheader2 a, .forumheader a {
+	color: #3399cc;
+}
+.debug-footer {color:white;}
 
diff -x .svn -aruN 1.0.0.src/e107_themes/core/admin_template.php 1.0.2.src/e107_themes/core/admin_template.php
--- 1.0.0.src/e107_themes/core/admin_template.php	2012-10-30 15:39:55.544443925 +0000
+++ 1.0.2.src/e107_themes/core/admin_template.php	2012-10-30 15:40:38.612444658 +0000
@@ -9,10 +9,10 @@
 	$ADMIN_HEADER = '
 	<div class="admin_header clearfix">
 		<div class="admin_header_left">
-			{ADMIN_LOGO}
+			{ADMIN_LOGO} {ADMIN_UPDATE=adminpanel|text}
 		</div>
 		<div class="admin_header_right">
-			<div style="padding: 0px 30px 0px 0px;">{ADMIN_SEL_LAN}</div><div>{ADMIN_LOGGED}</div><div>{ADMIN_SITEINFO=version}</div>
+			<div>{ADMIN_SEL_LAN}</div><div>{ADMIN_LOGGED}</div><div>{ADMIN_SITEINFO=version}</div>
 		</div>
 	</div>
 	<div class="clear"></div>
@@ -55,7 +55,7 @@
 			{ADMIN_LOGO=link=index}
 		</div>
 		<div class="admin_header_right">
-			<div style="padding: 0px 30px 0px 0px;">{ADMIN_SEL_LAN}</div><div>{ADMIN_LOGGED}</div><div>{ADMIN_SITEINFO=version}</div>
+			<div>{ADMIN_SEL_LAN}</div><div>{ADMIN_LOGGED}</div><div>{ADMIN_SITEINFO=version}</div>
 		</div>
 	</div>
 	<div class="clear"></div>
diff -x .svn -aruN 1.0.0.src/e107_themes/core/usersettings_template.php 1.0.2.src/e107_themes/core/usersettings_template.php
--- 1.0.0.src/e107_themes/core/usersettings_template.php	2012-10-30 15:39:55.546444772 +0000
+++ 1.0.2.src/e107_themes/core/usersettings_template.php	2012-10-30 15:40:38.622444558 +0000
@@ -76,6 +76,18 @@
 $sc_style['PHOTO_UPLOAD']['post'] = "</span></td></tr>";
 
 
+$sc_style['SIGNATURE']['pre']	= "	<tr><td colspan='2' class='forumheader'>".LAN_USET_8."</td></tr>
+	<tr>
+	<td style='width:40%;vertical-align:top' class='forumheader3'>".LAN_120.req($pref['signup_option_signature'])."</td>
+	<td style='width:60%' class='forumheader2'>";
+	
+	
+$sc_style['SIGNATURE']['post']	= "<br />";
+
+$sc_style['SIGNATURE_HELP']['pre']	= "";
+$sc_style['SIGNATURE_HELP']['post']	= "	</td></tr>";
+
+
 $sc_style['XUP']['pre'] = "
 <tr>
 <td colspan='2' class='forumheader'>".LAN_435."</td>
@@ -152,15 +164,10 @@
 	{USERCLASSES}
 	{USEREXTENDED_ALL}
 
-	<tr><td colspan='2' class='forumheader'>".LAN_USET_8."</td></tr>
-	<tr>
-	<td style='width:40%;vertical-align:top' class='forumheader3'>".LAN_120.req($pref['signup_option_signature'])."</td>
-	<td style='width:60%' class='forumheader2'>
+
 	{SIGNATURE=cols=58&rows=4}
-	<br />
 	{SIGNATURE_HELP}
-	</td>
-	</tr>
+
 
 	<tr>
 	<td style='width:40%' class='forumheader3'>".LAN_122.req($pref['signup_option_timezone'])."</td>
diff -x .svn -aruN 1.0.0.src/e107_themes/templates/footer_default.php 1.0.2.src/e107_themes/templates/footer_default.php
--- 1.0.0.src/e107_themes/templates/footer_default.php	2012-10-30 15:39:55.561477120 +0000
+++ 1.0.2.src/e107_themes/templates/footer_default.php	2012-10-30 15:40:38.677444623 +0000
@@ -9,7 +9,7 @@
 * Default footer for user pages
 *
 * $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_themes/templates/footer_default.php $
-* $Id: footer_default.php 12060 2011-01-30 19:22:47Z secretr $
+* $Id: footer_default.php 12938 2012-08-10 03:57:15Z e107coders $
 *
 */
 
@@ -218,14 +218,14 @@
 // see e107.js and class2.php
 // This must be done as late as possible in page processing.
 $_serverTime=time();
-$lastSet = isset($_COOKIE['e107_tdSetTime']) ? $_COOKIE['e107_tdSetTime'] : 0;
+$lastSet = isset($_COOKIE['e107_tdSetTime']) ? intval($_COOKIE['e107_tdSetTime']) : 0;
 if (abs($_serverTime - $lastSet) > 120) {
 	/* update time delay every couple of minutes.
 	* Benefit: account for user time corrections and changes in internet delays
 	* Drawback: each update may cause all server times to display a bit different
 	*/
 	echo "<script type='text/javascript'>\n";
-	echo "SyncWithServerTime('{$_serverTime}');
+	echo "SyncWithServerTime('{$_serverTime}','".e_DOMAIN."');
        </script>\n";
 }
 
diff -x .svn -aruN 1.0.0.src/e107_themes/templates/header_default.php 1.0.2.src/e107_themes/templates/header_default.php
--- 1.0.0.src/e107_themes/templates/header_default.php	2012-10-30 15:39:55.561477120 +0000
+++ 1.0.2.src/e107_themes/templates/header_default.php	2012-10-30 15:40:38.678444597 +0000
@@ -6,8 +6,8 @@
 |     Released under the terms and conditions of the GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_themes/templates/header_default.php $
-|     $Revision: 12477 $
-|     $Id: header_default.php 12477 2011-12-28 03:12:22Z e107coders $
+|     $Revision: 12853 $
+|     $Id: header_default.php 12853 2012-07-01 05:25:24Z e107coders $
 |     $Author: e107coders $
 +-----------------------------------------------------------------------------------------------+
 */
@@ -250,7 +250,7 @@
 	}
 	elseif($type == 'og')
 	{
-		if(!defined("META_OG") || !defined("XMLNS"))
+		if(!defined("META_OG") )
 		{
 			return;
 		}
@@ -261,7 +261,18 @@
 		// FB will still utilize 'name' instead of 'property' (which is not valid XHTML)
 		foreach($tmp as $k=>$v)
 		{
-			$ret .= '<meta name="og:'.$k.'" content="'.$v.'" />'."\n";
+			if($k == 'image')
+			{
+				foreach($v as $img)
+				{
+					$ret .= '<meta name="og:image" content="'.$img.'" />'."\n";	
+				}
+			}
+			else
+			{
+				$ret .= '<meta name="og:'.$k.'" content="'.$v.'" />'."\n";	
+			}
+			
 		}
 
 		return $ret;		
@@ -275,15 +286,18 @@
 echo "\n<!-- Core Meta Tags -->\n";
 echo (defined("META_DESCRIPTION")) ? "<meta name=\"description\" content=\"".$diz_merge.META_DESCRIPTION."\" />\n" : render_meta('description');
 echo (defined("META_KEYWORDS")) ? "<meta name=\"keywords\" content=\"".$key_merge.META_KEYWORDS."\" />\n" : render_meta('keywords');
+echo (defined("VIEWPORT")) ? "<meta name=\"viewport\" content=\"".VIEWPORT."\" />\n" : "";
+
 echo render_meta('copyright');
 echo render_meta('author');
-echo render_meta('tag');
 echo render_meta('og');
+echo render_meta('tag');
 
 
 unset($key_merge,$diz_merge);
 
 // ---------- Favicon ---------
+	echo "\n<!-- *FAV-ICONS* -->\n";
 if (file_exists(THEME."favicon.ico")) {
 	echo "<link rel='icon' href='".THEME_ABS."favicon.ico' type='image/x-icon' />\n<link rel='shortcut icon' href='".THEME_ABS."favicon.ico' type='image/xicon' />\n";
 }elseif (file_exists(e_BASE."favicon.ico")) {
@@ -443,6 +457,14 @@
 			}
 		}
 		parseheader(($e107ParseHeaderFlag ? $cust_header : $HEADER));
+		if($e107ParseHeaderFlag== TRUE)
+		{
+			define('THEME_LAYOUT',$key_extract);	
+		}
+		else
+		{
+			define('THEME_LAYOUT','default');	
+		}
 	}
 
 
diff -x .svn -aruN 1.0.0.src/e107_themes/templates/usersettings_template.php 1.0.2.src/e107_themes/templates/usersettings_template.php
--- 1.0.0.src/e107_themes/templates/usersettings_template.php	2012-10-30 15:39:55.561477120 +0000
+++ 1.0.2.src/e107_themes/templates/usersettings_template.php	2012-10-30 15:40:38.680444425 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/e107_themes/templates/usersettings_template.php $
-|     $Revision: 11678 $
-|     $Id: usersettings_template.php 11678 2010-08-22 00:43:45Z e107coders $
+|     $Revision: 12891 $
+|     $Id: usersettings_template.php 12891 2012-07-20 20:46:04Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -76,6 +76,18 @@
 $sc_style['PHOTO_UPLOAD']['post'] = "</span></td></tr>";
 
 
+$sc_style['SIGNATURE']['pre']	= "	<tr><td colspan='2' class='forumheader'>".LAN_USET_8."</td></tr>
+	<tr>
+	<td style='width:40%;vertical-align:top' class='forumheader3'>".LAN_120.req($pref['signup_option_signature'])."</td>
+	<td style='width:60%' class='forumheader2'>";
+	
+	
+$sc_style['SIGNATURE']['post']	= "<br />";
+
+$sc_style['SIGNATURE_HELP']['pre']	= "";
+$sc_style['SIGNATURE_HELP']['post']	= "	</td></tr>";
+
+
 $sc_style['XUP']['pre'] = "
 <tr>
 <td colspan='2' class='forumheader'>".LAN_435."</td>
@@ -152,15 +164,10 @@
 	{USERCLASSES}
 	{USEREXTENDED_ALL}
 
-	<tr><td colspan='2' class='forumheader'>".LAN_USET_8."</td></tr>
-	<tr>
-	<td style='width:40%;vertical-align:top' class='forumheader3'>".LAN_120.req($pref['signup_option_signature'])."</td>
-	<td style='width:60%' class='forumheader2'>
+
 	{SIGNATURE=cols=58&rows=4}
-	<br />
 	{SIGNATURE_HELP}
-	</td>
-	</tr>
+
 
 	<tr>
 	<td style='width:40%' class='forumheader3'>".LAN_122.req($pref['signup_option_timezone'])."</td>
diff -x .svn -aruN 1.0.0.src/news.php 1.0.2.src/news.php
--- 1.0.0.src/news.php	2012-10-30 15:39:55.473442025 +0000
+++ 1.0.2.src/news.php	2012-10-30 15:40:38.686239290 +0000
@@ -11,8 +11,8 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/news.php $
-|     $Revision: 12324 $
-|     $Id: news.php 12324 2011-07-23 21:02:44Z e107coders $
+|     $Revision: 12705 $
+|     $Id: news.php 12705 2012-05-11 02:31:43Z e107coders $
 |     $Author: e107coders $
 +----------------------------------------------------------------------------+
 */
@@ -686,28 +686,67 @@
  */
 function setNewsMeta($mode,$news)
 {
-	if($news['news_thumbnail'])
-	{
-		$image = (substr($news['news_thumbnail'],0,3)=="{e_") ? $tp->replaceConstants($news['news_thumbnail']) : SITEURL.e_IMAGE."newspost_images/".$news['news_thumbnail'];	
-	}
-	else
-	{
-		$image = "";
-	}
+	global $tp;
 		
 	$og_array = array(
 		'title'			=> $news['news_title'],
 		'type'			=> 'article',		  		
 		'url'			=> e_SELF."?".$mode.".".$news['news_id'],
-		'image'			=> ($image) ? $image : '',
 		'description' 	=> $news['news_summary'],
 		'site_name'		=> SITENAME
 	);
-		  	
+	
+	//YouTube Thumbs
+	preg_match_all("/\[youtube(?:[^\]]*)?]([^\[]*)(?:\[\/youtube])/im",$news['news_body'],$match);
+	
+	if(is_array($match[1]))
+	{
+		foreach($match[1] as $i)
+		{
+			list($img,$tmp) = explode("?",$i);
+			$og_array['image'][] = "http://img.youtube.com/vi/".$img."/0.jpg"; 	
+		}
+	}
+	
+	// Embedded Images
+	preg_match_all("/\[img(?:[^\]]*)?]([^\[]*)(?:\[\/img])/im",$news['news_body'],$mtch);
+	
+	if(is_array($mtch[1]))
+	{
+		foreach($mtch[1] as $i)
+		{
+			if(substr($i,0,4)=='http')
+			{
+				$og_array['image'][] = $i;
+			}
+			elseif(substr($i,0,3)=="{e_")
+			{
+				$og_array['image'][] = $tp->replaceConstants($i,'full');
+			}
+			else
+			{
+				$og_array['image'][] = SITEURL.e_IMAGE."newspost_images/".$i;	
+			}
+			
+		}
+	}
+	
+
+	if($news['news_thumbnail'])
+	{
+		$og_array['image'][] = (substr($news['news_thumbnail'],0,3)=="{e_") ? $tp->replaceConstants($news['news_thumbnail'],'full') : SITEURL.e_IMAGE."newspost_images/".$news['news_thumbnail'];	
+	}
+
+			  	
 	define('META_OG',serialize($og_array));
 	define('META_DESCRIPTION',SITENAME.': '.$news['news_title'].' - '.$news['news_summary']);
 }
 
+
+
+
+
+
 function checkCache($cacheString){
 	global $pref,$e107cache;
 	$cache_data = $e107cache->retrieve($cacheString);
diff -x .svn -aruN 1.0.0.src/search.php 1.0.2.src/search.php
--- 1.0.0.src/search.php	2012-10-30 15:39:55.423446497 +0000
+++ 1.0.2.src/search.php	2012-10-30 15:40:38.688444380 +0000
@@ -11,9 +11,9 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/search.php $
-|     $Revision: 12341 $
-|     $Id: search.php 12341 2011-09-02 10:38:04Z secretr $
-|     $Author: secretr $
+|     $Revision: 12572 $
+|     $Id: search.php 12572 2012-01-22 14:33:23Z e107steved $
+|     $Author: e107steved $
 +----------------------------------------------------------------------------+
 */
 
@@ -464,29 +464,39 @@
 	$_GET['q'] = rawurlencode($_GET['q']);
 	foreach ($search_info as $key => $a) 
 	{
-		if (isset($searchtype[$key]) || isset($searchtype['all'])) {
+		if (isset($searchtype[$key]) || isset($searchtype['all'])) 
+		{
 			unset($text);
-			if (file_exists($search_info[$key]['sfile'])) {
+			if (file_exists($search_info[$key]['sfile'])) 
+			{
 				$pre_title = ($search_info[$key]['pre_title'] == 2) ? $search_info[$key]['pre_title_alt'] : $search_info[$key]['pre_title'];
 				$search_chars = $search_info[$key]['chars'];
 				$search_res = $search_info[$key]['results'];
 				@require_once($search_info[$key]['sfile']);
 				$parms = $results.",".$search_res.",".$_GET['r'].",".e_SELF."?q=".$_GET['q']."&t=".$key."&r=[FROM]";
 				$core_parms = array('r' => '', 'q' => '', 't' => '', 's' => '');
-				foreach ($_GET as $pparm_key => $pparm_value) {
-					if (!isset($core_parms[$pparm_key])) {
-						$parms .= "&".$pparm_key."=".$_GET[$pparm_key];
+				foreach ($_GET as $pparm_key => $pparm_value) 
+				{
+					$temp = preg_replace('/[^\w_]/i','',$pparm_key);
+					$temp1 = preg_replace('/[^\w_ +]/i','',$pparm_value);		// Filter 'non-word' charcters in search term
+					if (($temp == $pparm_key) && !isset($core_parms[$pparm_key])) 
+					{
+						$parms .= "&".$pparm_key."=".$temp1;
 					}
 				}
-				if ($results > $search_res) {
+				if ($results > $search_res) 
+				{
 					$nextprev = ($results > $search_res) ? $tp -> parseTemplate("{NEXTPREV={$parms}}") : "";
 					$text .= "<div class='nextprev' style='text-align: center'>".$nextprev."</div>";
 				}
-				if ($results > 0) {
+				if ($results > 0) 
+				{
 					$res_from = $_GET['r'] + 1;
 					$res_to = ($_GET['r'] + $search_res) > $results ? $results : ($_GET['r'] + $search_res);
 					$res_display = $res_from." - ".$res_to." ".LAN_SEARCH_12." ".$results;
-				} else {
+				} 
+				else 
+				{
 					$res_display = "";
 				}
 				$ns->tablerender(LAN_SEARCH_11." ".$res_display." ".LAN_SEARCH_13." ".(isset($_GET[$advanced_caption['id']]) ? $advanced_caption['title'][$_GET[$advanced_caption['id']]] : $search_info[$key]['qtype']), $text);
diff -x .svn -aruN 1.0.0.src/signup.php 1.0.2.src/signup.php
--- 1.0.0.src/signup.php	2012-10-30 15:39:55.423446497 +0000
+++ 1.0.2.src/signup.php	2012-10-30 15:40:38.688444380 +0000
@@ -11,7 +11,7 @@
 |     GNU General Public License (http://gnu.org).
 |
 |     $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.7/signup.php $
-|     $Id: signup.php 12130 2011-04-12 21:09:45Z e107steved $
+|     $Id: signup.php 12985 2012-09-27 08:45:46Z secretr $
 +----------------------------------------------------------------------------+
 */
 
@@ -522,7 +522,18 @@
 	}
 	
 	// Always validate an email address if entered. If its blank, that's OK if checking disabled
-	$_POST['email'] = $tp->toDB(trim(varset($_POST['email'],'')));
+	//$_POST['email'] = $tp->toDB(trim(varset($_POST['email'],'')));
+	$_POST['email'] = trim(varset($_POST['email'],''));
+	if(!empty($_POST['email']))
+	{
+		$_POST['email'] = preg_replace('/[^_a-zA-Z0-9\-+@\.]/', '', $_POST['email']);
+	}
+	$_POST['email_confirm'] = trim(varset($_POST['email_confirm'],''));
+	if(!empty($_POST['email_confirm']))
+	{
+		$_POST['email_confirm'] = preg_replace('/[^_a-zA-Z0-9\-+@\.]/', '', $_POST['email_confirm']);
+	}
+	
 	$do_email_validate = !varset($pref['disable_emailcheck'],FALSE) || ($_POST['email'] !='');
 
 
@@ -802,6 +813,7 @@
 
 		$username = $tp -> toDB(strip_tags($_POST['name']));
 		$loginname = $tp -> toDB(strip_tags($_POST['loginname']));
+		$signature = strip_tags($_POST['signature'],"<b><i><u><strong>"); // minimal html in signature during signup. Maybe be permitted in usersettings if admin so wishes.
 		$time = time();
 		$ip = $e107->getip();
 
@@ -818,7 +830,7 @@
 		}
 
 		$u_key = md5(uniqid(rand(), 1));
-		$nid = $sql->db_Insert("user", "0, '{$username}', '{$loginname}', '', '".md5($_POST['password1'])."', '{$u_key}', '".$_POST['email']."', '".$tp -> toDB($_POST['signature'])."', '".$tp -> toDB($_POST['image'])."', '".$tp -> toDB($_POST['timezone'])."', '".$tp -> toDB($_POST['hideemail'])."', '".$time."', '0', '".$time."', '0', '0', '0', '0', '".$ip."', '2', '0', '', '', '0', '0', '".$tp -> toDB($_POST['realname'])."', '', '', '', '0', '".$tp -> toDB($_POST['xupexist'])."' ");
+		$nid = $sql->db_Insert("user", "0, '{$username}', '{$loginname}', '', '".md5($_POST['password1'])."', '{$u_key}', '".$_POST['email']."', '".$tp -> toDB($signature)."', '".$tp -> toDB($_POST['image'])."', '".$tp -> toDB($_POST['timezone'])."', '".$tp -> toDB($_POST['hideemail'])."', '".$time."', '0', '".$time."', '0', '0', '0', '0', '".$ip."', '2', '0', '', '', '0', '0', '".$tp -> toDB($_POST['realname'])."', '', '', '', '0', '".$tp -> toDB($_POST['xupexist'])."' ");
 		if(!$nid)
 		{
 			require_once(HEADERF);
