diff -aruN --binary 18/administrator/components/com_admin/admin.admin.html.php 20/administrator/components/com_admin/admin.admin.html.php
--- 18/administrator/components/com_admin/admin.admin.html.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_admin/admin.admin.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: admin.admin.html.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: admin.admin.html.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Admin
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -137,6 +137,8 @@
 		$fullhelpurl = $helpurl . '/index2.php?option=com_content&amp;task=findkey&amp;pop=1&amp;keyref=';
 
 		$helpsearch = JRequest::getString('helpsearch');
+		$helpsearch = str_replace(array('=', '<', '"'), '', $helpsearch);
+
 		$page		= JRequest::getCmd('page', 'joomla.whatsnew15.html');
 		$toc		= getHelpToc( $helpsearch );
 		$lang		=& JFactory::getLanguage();
@@ -159,7 +161,7 @@
 						<td>
 							<strong><?php echo JText::_( 'Search' ); ?>:</strong>
 							<input class="text_area" type="hidden" name="option" value="com_admin" />
-							<input type="text" name="helpsearch" value="<?php echo $helpsearch;?>" class="inputbox" />
+							<input type="text" name="helpsearch" value="<?php echo htmlspecialchars($helpsearch);?>" class="inputbox" />
 							<input type="submit" value="<?php echo JText::_( 'Go' ); ?>" class="button" />
 							<input type="button" value="<?php echo JText::_( 'Clear Results' ); ?>" class="button" onclick="f=document.adminForm;f.helpsearch.value='';f.submit()" />
 						</td>
diff -aruN --binary 18/administrator/components/com_banners/config.xml 20/administrator/components/com_banners/config.xml
--- 18/administrator/components/com_banners/config.xml	2009-05-29 14:51:00.000000000 +0200
+++ 20/administrator/components/com_banners/config.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <config>
- <params>
-  <param name="track_impressions" type="radio" default="0" label="TRACK BANNER IMPRESSION LABEL" description="TRACK BANNER IMPRESSION DESC">
-	<option value="0">NO</option>
-	<option value="1">YES</option>
-  </param>
-  <param name="track_clicks" type="radio" default="0" label="TRACK BANNER CLICK LABEL" description="TRACK BANNER CLICK DESC">
-	<option value="0">NO</option>
-	<option value="1">YES</option>
-  </param>
+ <params>
+  <param name="track_impressions" type="radio" default="0" label="TRACK BANNER IMPRESSION LABEL" description="TRACK BANNER IMPRESSION DESC">
+	<option value="0">NO</option>
+	<option value="1">YES</option>
+  </param>
+  <param name="track_clicks" type="radio" default="0" label="TRACK BANNER CLICK LABEL" description="TRACK BANNER CLICK DESC">
+	<option value="0">NO</option>
+	<option value="1">YES</option>
+  </param>
   <param name="tag_prefix" type="text" default="" label="TAG PREFIX LABEL" description="TAG PREFIX DESC" />
  </params>
 </config>
diff -aruN --binary 18/administrator/components/com_banners/controllers/banner.php 20/administrator/components/com_banners/controllers/banner.php
--- 18/administrator/components/com_banners/controllers/banner.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_banners/controllers/banner.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: banner.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: banner.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Banners
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -78,6 +78,12 @@
 		}
 
 		$where		= count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '';
+
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('b.name', 'c.name', 'cc.title', 'b.showBanner', 'b.ordering', 'b.sticky', 'b.impmade', 'b.clicks', 'b.bid'))) {
+			$filter_order = 'cc.title';
+		}
+
 		$orderby	= ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', b.ordering';
 
 		// get the total number of records
diff -aruN --binary 18/administrator/components/com_banners/controllers/client.php 20/administrator/components/com_banners/controllers/client.php
--- 18/administrator/components/com_banners/controllers/client.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_banners/controllers/client.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: client.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: client.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Banners
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -59,6 +59,11 @@
 		}
 
 		$where		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+		if (!in_array($filter_order, array('a.name', 'a.contact', 'bid', 'a.cid'))) {
+			$filter_order = 'a.name';
+		}
+
 		$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', a.cid';
 
 		// get the total number of records
diff -aruN --binary 18/administrator/components/com_banners/views/banner.php 20/administrator/components/com_banners/views/banner.php
--- 18/administrator/components/com_banners/views/banner.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_banners/views/banner.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: banner.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: banner.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Banners
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -139,25 +139,25 @@
 						<?php echo $checked; ?>
 					</td>
 					<td>
-					<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit' );?>::<?php echo $row->name; ?>">
+					<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit' );?>::<?php echo htmlspecialchars($row->name); ?>">
 						<?php
 						if ( JTable::isCheckedOut($user->get ('id'), $row->checked_out ) ) {
-							echo $row->name;
+							echo htmlspecialchars($row->name);
 						} else {
 							?>
 
 							<a href="<?php echo $link; ?>">
-								<?php echo $row->name; ?></a>
+								<?php echo htmlspecialchars($row->name); ?></a>
 							<?php
 						}
 						?>
 						</span>
 					</td>
 					<td align="center">
-						<?php echo $row->client_name;?>
+						<?php echo htmlspecialchars($row->client_name);?>
 					</td>
 					<td align="center">
-						<?php echo $row->category_name;?>
+						<?php echo htmlspecialchars($row->category_name);?>
 					</td>
 					<td align="center">
 						<?php echo $published;?>
diff -aruN --binary 18/administrator/components/com_banners/views/client.php 20/administrator/components/com_banners/views/client.php
--- 18/administrator/components/com_banners/views/client.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_banners/views/client.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: client.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: client.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Banners
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -102,9 +102,9 @@
 							echo $row->name;
 						} else {
 							?>
-								<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit' );?>::<?php echo $row->name; ?>">
+								<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit' );?>::<?php echo htmlspecialchars($row->name); ?>">
 							<a href="<?php echo $link; ?>">
-								<?php echo $row->name; ?></a>
+								<?php echo htmlspecialchars($row->name); ?></a>
 								</span>
 							<?php
 						}
diff -aruN --binary 18/administrator/components/com_categories/admin.categories.php 20/administrator/components/com_categories/admin.categories.php
--- 18/administrator/components/com_categories/admin.categories.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_categories/admin.categories.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: admin.categories.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: admin.categories.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Categories
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -128,6 +128,16 @@
 	$section_name 	= '';
 	$content_add 	= '';
 	$content_join 	= '';
+
+	// ensure we have a good value for $filter_order
+	if (!in_array($filter_order, array('c.title', 'c.published', 'c.ordering', 'groupname', 'section_name', 'c.id'))) {
+		$filter_order = 'c.ordering';
+	}
+
+	if (intval($section) <= 0 && $section != 'com_content' && $filter_order == 'section_name') {
+		$filter_order = 'c.ordering';
+	}
+
 	$order 			= ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', c.ordering';
 	if (intval( $section ) > 0) {
 		$table = 'content';
@@ -193,6 +203,7 @@
 		$content_add 	= ' , z.title AS section_name';
 		$content_join 	= ' LEFT JOIN #__sections AS z ON z.id = c.section';
 		$where 			= ' WHERE c.section NOT LIKE "%com_%"';
+
 		if ($filter_order == 'c.ordering'){
 			$order 			= ' ORDER BY  z.title, c.ordering '. $filter_order_Dir;
 		} else {
@@ -424,7 +435,7 @@
 
 	// Initialize variables
 	$db		 =& JFactory::getDBO();
-	$menu 		= JRequest::getCmd( 'menu', 'mainmenu', 'post' );
+	$menu 		= JRequest::getVar( 'menu', 'mainmenu', 'post', 'menutype' );
 	$menuid		= JRequest::getVar( 'menuid', 0, 'post', 'int' );
 	$redirect 	= JRequest::getCmd( 'redirect', '', 'post' );
 	$oldtitle 	= JRequest::getString( 'oldtitle', '', 'post' );
@@ -489,11 +500,14 @@
 	switch ( JRequest::getCmd('task') )
 	{
 		case 'go2menu':
-			$mainframe->redirect( 'index.php?option=com_menus&menutype='. $menu );
+			$mainframe->redirect('index.php?option=com_menus&menutype=' . $menu);
 			break;
 
 		case 'go2menuitem':
-			$mainframe->redirect( 'index.php?option=com_menus&menutype='. $menu .'&task=edit&id='. $menuid );
+			$mainframe->redirect(
+				'index.php?option=com_menus&menutype=' . $menu 
+				. '&task=edit&id='. $menuid 
+			);
 			break;
 
 		case 'apply':
diff -aruN --binary 18/administrator/components/com_contact/admin.contact.html.php 20/administrator/components/com_contact/admin.contact.html.php
--- 18/administrator/components/com_contact/admin.contact.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_contact/admin.contact.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.contact.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.contact.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Contact
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -114,12 +114,12 @@
 					<td>
 					<?php
 					if (JTable::isCheckedOut($user->get ('id'), $row->checked_out )) :
-						echo $row->name;
+						echo htmlspecialchars($row->name);
 					else :
 						?>
-						<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Contact' );?>::<?php echo $row->name; ?>">
+						<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Contact' );?>::<?php echo htmlspecialchars($row->name); ?>">
 						<a href="<?php echo $link; ?>">
-							<?php echo $row->name; ?></a> </span>
+							<?php echo htmlspecialchars($row->name); ?></a> </span>
 						<?php
 					endif;
 					?>
diff -aruN --binary 18/administrator/components/com_contact/admin.contact.php 20/administrator/components/com_contact/admin.contact.php
--- 18/administrator/components/com_contact/admin.contact.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_contact/admin.contact.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.contact.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.contact.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Contact
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -131,6 +131,11 @@
 		}
 	}
 
+	// sanitize $filter_order
+	if (!in_array($filter_order, array('cd.name', 'cd.published', 'cd.ordering', 'cd.access', 'category', 'user', 'cd.id'))) {
+		$filter_order = 'cd.ordering';
+	}
+
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
 	if ($filter_order == 'cd.ordering'){
 		$orderby 	= ' ORDER BY category, cd.ordering';
diff -aruN --binary 18/administrator/components/com_content/admin.content.php 20/administrator/components/com_content/admin.content.php
--- 18/administrator/components/com_content/admin.content.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_content/admin.content.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,7 +1,7 @@
 <?php
 
 /**
-* @version		$Id: admin.content.php 14401 2010-01-26 14:10:00Z louis $
+* @version		$Id: admin.content.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Content
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -87,10 +87,6 @@
 		ContentController::orderContent(1);
 		break;
 
-	//case 'showarchive' :
-	//	JContentController::viewArchive();
-	//	break;
-
 	case 'movesect' :
 		ContentController::moveSection();
 		break;
diff -aruN --binary 18/administrator/components/com_content/controller.php 20/administrator/components/com_content/controller.php
--- 18/administrator/components/com_content/controller.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_content/controller.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: controller.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: controller.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Content
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -75,9 +75,14 @@
 		//$where[] = "c.state >= 0";
 		$where[] = 'c.state != -2';
 
-		if (!$filter_order) {
+		// ensure we have a valid value for filter_order
+		if (!in_array($filter_order, array('c.title', 'c.state', 'frontpage', 'c.ordering', 'groupname',
+									'section_name', 'cc.title', 'author', 'c.created', 'c.hits', 'c.id')))
+		{
 			$filter_order = 'section_name';
+
 		}
+
 		if ($filter_order == 'c.ordering') {
 			$order = ' ORDER BY section_name, cc.title, c.ordering '. $filter_order_Dir;
 		} else {
@@ -203,142 +208,6 @@
 	}
 
 	/**
-	* Shows a list of archived articles
-	* @param int The section id
-	*/
-	function viewArchive()
-	{
-		global $mainframe;
-
-		// Initialize variables
-		$db						=& JFactory::getDBO();
-
-		$sectionid				= JRequest::getVar( 'sectionid', 0, '', 'int' );
-		$option					= JRequest::getCmd( 'option' );
-
-		$filter_order			= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_order",		'filter_order',		'sectname',	'cmd');
-		$filter_order_Dir		= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_order_Dir",	'filter_order_Dir',	'',			'word');
-		$catid					= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.catid",				'catid',			0,			'int');
-		$limit					= $mainframe->getUserStateFromRequest('global.list.limit',									'limit',			$mainframe->getCfg('list_limit'), 'int');
-		$limitstart				= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.limitstart",			'limitstart',		0,			'int');
-		$filter_authorid		= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_authorid",		'filter_authorid',	0,			'int');
-		$filter_sectionid		= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.filter_sectionid",	'filter_sectionid',	0,			'int');
-		$search					= $mainframe->getUserStateFromRequest("$option.$sectionid.viewarchive.search",				'search',			'',			'string');
-		if (strpos($search, '"') !== false) {
-			$search = str_replace(array('=', '<'), '', $search);
-		}
-		$search = JString::strtolower($search);
-		$redirect				= $sectionid;
-
-		// A section id of zero means view all articles [all sections]
-		if ($sectionid == 0)
-		{
-			$where = array ('c.state 	= -1', 'c.catid	= cc.id', 'cc.section = s.id', 's.scope  	= "content"');
-			$filter = ' , #__sections AS s WHERE s.id = c.section';
-			$all = 1;
-		}
-		else
-		{
-			 //We are viewing a specific section
-			$where = array ('c.state 	= -1', 'c.catid	= cc.id', 'cc.section	= s.id', 's.scope	= "content"', 'c.sectionid= '.(int) $sectionid);
-			$filter = ' WHERE section = '.$db->Quote($sectionid);
-			$all = NULL;
-		}
-
-		// Section filter
-		if ($filter_sectionid > 0)
-		{
-			$where[] = 'c.sectionid = ' . (int) $filter_sectionid;
-		}
-		// Author filter
-		if ($filter_authorid > 0)
-		{
-			$where[] = 'c.created_by = ' . (int) $filter_authorid;
-		}
-		// Category filter
-		if ($catid > 0)
-		{
-			$where[] = 'c.catid = ' . (int) $catid;
-		}
-		// Keyword filter
-		if ($search)
-		{
-			$where[] = 'LOWER( c.title ) LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false );
-		}
-
-		// TODO: Sanitise $filter_order
-		$filter_order_Dir = ($filter_order_Dir == 'ASC' ? 'ASC' : 'DESC');
-		$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', sectname, cc.name, c.ordering';
-		$where = (count($where) ? ' WHERE '.implode(' AND ', $where) : '');
-
-		// get the total number of records
-		$query = 'SELECT COUNT(*)' .
-				' FROM #__content AS c' .
-				' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
-				' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
-				$where;
-		$db->setQuery($query);
-		$total = $db->loadResult();
-
-		jimport('joomla.html.pagination');
-		$pagination = new JPagination($total, $limitstart, $limit);
-
-		$query = 'SELECT c.*, g.name AS groupname, cc.name, v.name AS author, s.title AS sectname' .
-				' FROM #__content AS c' .
-				' LEFT JOIN #__categories AS cc ON cc.id = c.catid' .
-				' LEFT JOIN #__sections AS s ON s.id = c.sectionid' .
-				' LEFT JOIN #__groups AS g ON g.id = c.access' .
-				' LEFT JOIN #__users AS v ON v.id = c.created_by' .
-				$where .
-				$orderby;
-		$db->setQuery($query, $pagination->limitstart, $pagination->limit);
-		$rows = $db->loadObjectList();
-
-		// If there is a database query error, throw a HTTP 500 and exit
-		if ($db->getErrorNum())
-		{
-			JError::raiseError( 500, $db->stderr() );
-			return false;
-		}
-
-		// get list of categories for dropdown filter
-		$query = 'SELECT c.id AS value, c.title AS text' .
-				' FROM #__categories AS c' .
-				$filter .
-				' ORDER BY c.ordering';
-		$lists['catid'] = ContentHelper::filterCategory($query, $catid);
-
-		// get list of sections for dropdown filter
-		$javascript = 'onchange="document.adminForm.submit();"';
-		$lists['sectionid'] = JAdminMenus::SelectSection('filter_sectionid', $filter_sectionid, $javascript);
-
-		$section = & JTable::getInstance('section');
-		$section->load($sectionid);
-
-		// get list of Authors for dropdown filter
-		$query = 'SELECT c.created_by, u.name' .
-				' FROM #__content AS c' .
-				' INNER JOIN #__sections AS s ON s.id = c.sectionid' .
-				' LEFT JOIN #__users AS u ON u.id = c.created_by' .
-				' WHERE c.state = -1' .
-				' GROUP BY u.name' .
-				' ORDER BY u.name';
-		$db->setQuery($query);
-		$authors[] = JHTML::_('select.option', '0', '- '.JText::_('Select Author').' -', 'created_by', 'name');
-		$authors = array_merge($authors, $db->loadObjectList());
-		$lists['authorid'] = JHTML::_('select.genericlist',  $authors, 'filter_authorid', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'created_by', 'name', $filter_authorid);
-
-		// table ordering
-		$lists['order_Dir']	= $filter_order_Dir;
-		$lists['order']		= $filter_order;
-
-		// search filter
-		$lists['search'] = $search;
-
-		ContentView::showArchive($rows, $section, $lists, $pagination, $option, $all, $redirect);
-	}
-
-	/**
 	* Compiles information to add or edit the record
 	*
 	* @param database A database connector object
@@ -604,7 +473,7 @@
 		$task		= JRequest::getCmd( 'task' );
 		$sectionid	= JRequest::getVar( 'sectionid', 0, '', 'int' );
 		$redirect	= JRequest::getVar( 'redirect', $sectionid, 'post', 'int' );
-		$menu		= JRequest::getVar( 'menu', 'mainmenu', 'post', 'cmd' );
+		$menu		= JRequest::getVar( 'menu', 'mainmenu', 'post', 'menutype' );
 		$menuid		= JRequest::getVar( 'menuid', 0, 'post', 'int' );
 		$nullDate	= $db->getNullDate();
 
@@ -763,11 +632,14 @@
 		switch ($task)
 		{
 			case 'go2menu' :
-				$mainframe->redirect('index.php?option=com_menus&menutype='.$menu);
+				$mainframe->redirect('index.php?option=com_menus&menutype=' . $menu);
 				break;
 
 			case 'go2menuitem' :
-				$mainframe->redirect('index.php?option=com_menus&menutype='.$menu.'&task=edit&id='.$menuid);
+				$mainframe->redirect(
+					'index.php?option=com_menus&menutype=' . $menu
+					. '&task=edit&id=' . $menuid
+				);
 				break;
 
 			case 'menulink' :
diff -aruN --binary 18/administrator/components/com_content/helper.php 20/administrator/components/com_content/helper.php
--- 18/administrator/components/com_content/helper.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_content/helper.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: helper.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: helper.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Content
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -84,6 +84,54 @@
 	}
 
 	/**
+	* Applies the content tag filters to arbitrary text as per settings for current user group
+	* @param text The string to filter
+	* @return string The filtered string
+	*/
+	function filterText( $text )
+	{
+		// Filter settings
+		jimport( 'joomla.application.component.helper' );
+		$config	= JComponentHelper::getParams( 'com_content' );
+		$user	= &JFactory::getUser();
+		$gid	= $user->get( 'gid' );
+
+		$filterGroups	=  $config->get( 'filter_groups' );
+		
+		// convert to array if one group selected
+		if ( (!is_array($filterGroups) && (int) $filterGroups > 0) ) { 
+			$filterGroups = array($filterGroups);
+		}
+
+		if (is_array($filterGroups) && in_array( $gid, $filterGroups ))
+		{
+			$filterType		= $config->get( 'filter_type' );
+			$filterTags		= preg_split( '#[,\s]+#', trim( $config->get( 'filter_tags' ) ) );
+			$filterAttrs	= preg_split( '#[,\s]+#', trim( $config->get( 'filter_attritbutes' ) ) );
+			switch ($filterType)
+			{
+				case 'NH':
+					$filter	= new JFilterInput();
+					break;
+				case 'WL':
+					$filter	= new JFilterInput( $filterTags, $filterAttrs, 0, 0, 0);  // turn off xss auto clean
+					break;
+				case 'BL':
+				default:
+					$filter	= new JFilterInput( $filterTags, $filterAttrs, 1, 1 );
+					break;
+			}
+			$text	= $filter->clean( $text );
+		} elseif(empty($filterGroups) && $gid != '25') { // no default filtering for super admin (gid=25)
+			$filter = new JFilterInput( array(), array(), 1, 1 );
+			$text	= $filter->clean( $text );
+		}
+		return $text;
+	}
+
+
+
+	/**
 	* Function to reset Hit count of an article
 	*
 	*/
diff -aruN --binary 18/administrator/components/com_cpanel/admin.cpanel.php 20/administrator/components/com_cpanel/admin.cpanel.php
--- 18/administrator/components/com_cpanel/admin.cpanel.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_cpanel/admin.cpanel.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.cpanel.php 14401 2010-01-26 14:10:00Z louis $
+* @version		$Id: admin.cpanel.php 18130 2010-07-14 11:21:35Z louis $
 * @package		Joomla
 * @subpackage	Admin
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -20,6 +20,52 @@
 {
 	default:
 	{
+		// Check to see if the mootools upgrade plugin is enabled.
+		if (!JPluginHelper::getPlugin('system', 'mtupgrade')) {
+
+			// Only do the mtupgrade plugin check once per session.
+			$app = &JFactory::getApplication();
+			if (!$app->getUserState('com_cpanel.mtupgrade.checked')) {
+
+				// If it is not enabled, let's check to see if it is even installed.
+				$db = &JFactory::getDBO();
+				$db->setQuery(
+					'SELECT id' .
+					' FROM #__plugins' .
+					' WHERE folder = "system"' .
+					' AND element = "mtupgrade"'
+				);
+				$exists = (bool) $db->loadResult();
+
+				// If it is not installed, install it as disabled and raise a notice.
+				if (!$exists) {
+					$plg = & JTable::getInstance('plugin');
+					$plg->name = 'System - Mootools Upgrade';
+					$plg->ordering = 0;
+					$plg->folder = 'system';
+					$plg->iscore = 0;
+					$plg->access = 0;
+					$plg->client_id = 0;
+					$plg->element = 'mtupgrade';
+					$plg->published = 0;
+
+					// If unable to store the plugin, raise a notice.
+					if (!$plg->store()) {
+						JError::raiseNotice(500, $plg->getError() /*JText::sprintf('Unable to auto-install the Mootools Upgrade plugin.', $plg->getError())*/);
+					}
+					// Show a message stating that the plugin is now available.
+					else {
+						//$app->enqueueMessage(JText::_('Mootools Upgrade plugin available.'));
+					}
+				}
+
+				// Set the mtupgrade plugin checked flag for the session.
+				$app->setUserState('com_cpanel.mtupgrade.checked', true);
+			}
+
+
+		}
+
 		//set the component specific template file in the request
 		JRequest::setVar('tmpl', 'cpanel');
 		HTML_cpanel::display();
diff -aruN --binary 18/administrator/components/com_frontpage/admin.frontpage.php 20/administrator/components/com_frontpage/admin.frontpage.php
--- 18/administrator/components/com_frontpage/admin.frontpage.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_frontpage/admin.frontpage.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.frontpage.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.frontpage.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Content
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -135,6 +135,12 @@
 	}
 
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+	// ensure we have a good vale for $filter_order
+	if (!in_array($filter_order, array('c.title', 'c.state', 'fpordering', 'groupname', 'c.id', 'sect_name', 'cc.name', 'author'))) {
+		$filter_order = 'fpordering';
+	}
+
 	$orderby 	= ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', fpordering';
 
 	// get the total number of records
diff -aruN --binary 18/administrator/components/com_menus/classes/ilink.php 20/administrator/components/com_menus/classes/ilink.php
--- 18/administrator/components/com_menus/classes/ilink.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_menus/classes/ilink.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: ilink.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: ilink.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -44,7 +44,7 @@
 		}
 
 		if ($menutype) {
-			$this->_menutype = "&amp;menutype=".$menutype;
+			$this->_menutype = "&amp;menutype=" . JFilterInput::clean($menutype, 'menutype');
 		} else {
 			$this->_menutype = null;
 		}
@@ -115,12 +115,20 @@
 		$this->_output .= "<li".$last.">\n";
 
 		// Print the url
-		if ($this->_current->hasChildren()) {
-			$this->_output .= "<div class=\"".$classes."\"><span></span><a class=\"hasTip\" title=\"". JText::_( $this->_current->title ) ."::". JText::_( $this->_current->msg ) ."\">". JText::_( $this->_current->title ) ."</a></div>";
-		} else {
-			$this->_output .= "<div class=\"".$classes."\"><span></span><a class=\"hasTip\" href=\"index.php?option=com_menus&amp;task=edit&amp;type=component&amp;".$this->_current->url.$this->_cid.$this->_menutype."\" title=\"". JText::_( $this->_current->title ) ."::". JText::_( $this->_current->msg ) ."\">". JText::_( $this->_current->title ) ."</a></div>";
-		}
-
+		$this->_output .= '<div class="' . $classes . '"><span></span>'
+			. '<a class="hasTip" ';
+		if (! $this->_current->hasChildren()) {
+			$this->_output .= 'href="index.php?option=com_menus'
+				. '&amp;task=edit&amp;type=component&amp;'
+				. $this->_current->url . $this->_cid
+				. $this->_menutype . '" '
+			;
+		}
+		$this->_output .= 'title="' . JText::_($this->_current->title)
+			. '::' . JText::_($this->_current->msg) . '">'
+			. JText::_($this->_current->title) . '</a></div>'
+		;
+		
 		// Recurse through children if they exist
 		while ($this->_current->hasChildren())
 		{
diff -aruN --binary 18/administrator/components/com_menus/config.xml 20/administrator/components/com_menus/config.xml
--- 18/administrator/components/com_menus/config.xml	2009-05-29 14:50:56.000000000 +0200
+++ 20/administrator/components/com_menus/config.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <config>
- <params>
-  <param name="default_itemid" type="menuitem" default="0" label="DEFAULT ITEM LABEL" description="DEFAULT ITEM DESC" />
+ <params>
+  <param name="default_itemid" type="menuitem" default="0" label="DEFAULT ITEM LABEL" description="DEFAULT ITEM DESC" />
  </params>
 </config>
diff -aruN --binary 18/administrator/components/com_menus/controller.php 20/administrator/components/com_menus/controller.php
--- 18/administrator/components/com_menus/controller.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_menus/controller.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: controller.php 15095 2010-02-27 14:14:06Z ian $
+ * @version		$Id: controller.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -93,12 +93,19 @@
 		$item =& $model->getItem();
 		switch ( $this->_task ) {
 			case 'apply':
-				$this->setRedirect( 'index.php?option=com_menus&menutype='.$item->menutype.'&task=edit&cid[]='.$item->id.'' , $msg );
+				$this->setRedirect( 
+					'index.php?option=com_menus&menutype=' . $item->menutype
+					. '&task=edit&cid[]=' . $item->id,
+					$msg
+				);
 				break;
 
 			case 'save':
 			default:
-				$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$item->menutype, $msg );
+				$this->setRedirect(
+					'index.php?option=com_menus&task=view&menutype=' . $item->menutype,
+					$msg
+				);
 				break;
 		}
 	}
@@ -112,12 +119,12 @@
 
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
-		$menutype = $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'string' );
+		$menutype = $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'menutype' );
 
 		$model = $this->getModel('item');
 		$model->checkin();
 
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menutype);
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype);
 	}
 
 	/**
@@ -150,7 +157,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	 	= JRequest::getString( 'menu', '', 'post');
+		$menu       = JRequest::getVar('menu', '', 'post', 'menutype');
 		$cid		= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -169,7 +176,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menu, $msg);
 	}
 
 	/**
@@ -194,7 +201,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menu', '', 'post', 'string' );
+		$menu	= JRequest::getVar( 'menu', '', 'post', 'menutype' );
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -213,7 +220,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menu, $msg);
 	}
 
 	/**
@@ -225,7 +232,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -235,7 +242,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -247,7 +254,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -257,7 +264,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -268,14 +275,17 @@
 		// Check for request forgeries
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
 		if (isset($cid[0]) && $cid[0]) {
 			$id = $cid[0];
 		} else {
-			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
+			$this->setRedirect(
+				'index.php?option=com_menus&task=view&menutype=' . $menutype,
+				JText::_('No Items Selected')
+			);
 			return false;
 		}
 
@@ -285,7 +295,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -296,14 +306,17 @@
 		// Check for request forgeries
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
 		if (isset($cid[0]) && $cid[0]) {
 			$id = $cid[0];
 		} else {
-			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
+			$this->setRedirect(
+				'index.php?option=com_menus&task=view&menutype=' . $menutype,
+				JText::_('No Items Selected')
+			);
 			return false;
 		}
 
@@ -313,7 +326,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -324,17 +337,17 @@
 		// Check for request forgeries
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
 		$model =& $this->getModel( 'List' );
-		if ($model->setOrder($cid, $menu)) {
+		if ($model->setOrder($cid, $menutype)) {
 			$msg = JText::_( 'New ordering saved' );
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype='. $menutype, $msg);
 	}
 
 	/**
@@ -346,7 +359,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -356,7 +369,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -368,7 +381,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype	= JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -378,7 +391,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -390,7 +403,7 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
@@ -400,7 +413,7 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect('index.php?option=com_menus&task=view&menutype=' . $menutype, $msg);
 	}
 
 	/**
@@ -412,21 +425,27 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
 		if (isset($cid[0]) && $cid[0]) {
 			$id = $cid[0];
 		} else {
-			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
+			$this->setRedirect( 
+				'index.php?option=com_menus&task=view&menutype=' . $menutype,
+				JText::_('No Items Selected') 
+			);
 			return false;
 		}
 
 		$item =& JTable::getInstance( 'menu' );
 		$item->load($id);
 		if(!$item->get('published')) {
-			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('The Default Menu Item Must Be Published') );
+			$this->setRedirect(
+				'index.php?option=com_menus&task=view&menutype=' . $menutype,
+				JText::_('The Default Menu Item Must Be Published') 
+			);
 			return false;
 		}
 
@@ -436,7 +455,10 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect(
+			'index.php?option=com_menus&task=view&menutype=' . $menutype,
+			$msg
+		);
 	}
 
 	function remove()
@@ -445,12 +467,15 @@
 		JRequest::checkToken() or jexit( 'Invalid Token' );
 
 		// Get some variables from the request
-		$menu	= JRequest::getVar( 'menutype', '', 'post', 'string' );
+		$menutype = JRequest::getVar('menutype', '', 'post', 'menutype');
 		$cid	= JRequest::getVar( 'cid', array(), 'post', 'array' );
 		JArrayHelper::toInteger($cid);
 
 		if (!count($cid)) {
-			$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, JText::_('No Items Selected') );
+			$this->setRedirect( 
+				'index.php?option=com_menus&task=view&menutype=' . $menutype,
+				JText::_('No Items Selected') 
+			);
 			return false;
 		}
 
@@ -460,7 +485,10 @@
 		} else {
 			$msg = $model->getError();
 		}
-		$this->setRedirect( 'index.php?option=com_menus&task=view&menutype='.$menu, $msg );
+		$this->setRedirect( 
+			'index.php?option=com_menus&task=view&menutype=' . $menutype,
+			$msg
+		);
 	}
 
 	/**
@@ -693,7 +721,7 @@
 
 		$db				=& JFactory::getDBO();
 		$type			= JRequest::getVar( 'type', '', 'post', 'string' );
-		$menu_name		= JRequest::getVar( 'menu_name', 'New Menu', 'post', 'string' );
+		$menu_name		= JRequest::getVar( 'menu_name', 'New Menu', 'post', 'menutype' );
 		$module_name	= JRequest::getVar( 'module_name', 'New Module', 'post', 'string' );
 
 		// check for unique menutype for new menu copy
diff -aruN --binary 18/administrator/components/com_menus/models/item.php 20/administrator/components/com_menus/models/item.php
--- 18/administrator/components/com_menus/models/item.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_menus/models/item.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: item.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: item.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -92,8 +92,8 @@
 		}
 
 		// Override the current item's menutype field if defined in the request
-		if ($menu_type = JRequest::getString('menutype')) {
-			$table->menutype = $menu_type;
+		if ($menutype = JRequest::getVar('menutype', '', '', 'menutype')) {
+			$table->menutype = $menutype;
 		}
 
 		switch ($table->type)
@@ -144,7 +144,7 @@
 	{
 		$item				= &$this->getItem();
 		$return['option']	= JRequest::getCmd('expand');
-		$menutype			= JRequest::getString('menutype');
+		$menutype			= JRequest::getVar('menutype', '', '', 'menutype');
 
 		if ($return['option'])
 		{
diff -aruN --binary 18/administrator/components/com_menus/models/list.php 20/administrator/components/com_menus/models/list.php
--- 18/administrator/components/com_menus/models/list.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_menus/models/list.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: list.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: list.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -53,7 +53,7 @@
 
 		$db =& $this->getDBO();
 
-		$menutype			= $mainframe->getUserStateFromRequest( "com_menus.menutype",						'menutype',			'mainmenu',		'string' );
+		$menutype			= $mainframe->getUserStateFromRequest( 'com_menus.menutype',						'menutype',			'mainmenu',		'menutype' );
 		$filter_order		= $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_order',		'filter_order',		'm.ordering',	'cmd' );
 		$filter_order_Dir	= $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_order_Dir',	'filter_order_Dir',	'ASC',			'word' );
 		$filter_state		= $mainframe->getUserStateFromRequest( 'com_menus.'.$menutype.'.filter_state',		'filter_state',		'',				'word' );
@@ -76,6 +76,11 @@
 			}
 		}
 
+		// ensure $filter_order has a good value
+		if (!in_array($filter_order, array('m.name', 'm.published', 'm.ordering', 'groupname', 'm.type', 'm.id'))) {
+			$filter_order = 'm.ordering';
+		}
+
 		// just in case filter_order get's messed up
 		if ($filter_order) {
 			$orderby = ' ORDER BY '.$filter_order .' '. $filter_order_Dir .', m.parent, m.ordering';
diff -aruN --binary 18/administrator/components/com_menus/models/menutype.php 20/administrator/components/com_menus/models/menutype.php
--- 18/administrator/components/com_menus/models/menutype.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/administrator/components/com_menus/models/menutype.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: menutype.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: menutype.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -146,7 +146,7 @@
 	{
 		$table = & $this->getTable();
 		if ($table->menutype == '') {
-			$table->menutype = JRequest::getString('menutype');
+			$table->menutype = JRequest::getVar('menutype', '', '', 'menutype');
 		}
 
 		$db = &$this->getDBO();
diff -aruN --binary 18/administrator/components/com_menus/views/item/tmpl/form.php 20/administrator/components/com_menus/views/item/tmpl/form.php
--- 18/administrator/components/com_menus/views/item/tmpl/form.php	2009-11-04 19:51:18.000000000 +0100
+++ 20/administrator/components/com_menus/views/item/tmpl/form.php	2010-07-18 05:15:44.000000000 +0200
@@ -56,7 +56,7 @@
 						<?php echo JText::_( 'Menu Item Type' ); ?>
 					</legend>
 					<div style="float:right">
-						<button type="button" onclick="location.href='index.php?option=com_menus&amp;task=type&amp;menutype=<?php echo $this->item->menutype;?><?php echo $this->item->expansion; ?>&amp;cid[]=<?php echo $this->item->id; ?>';">
+						<button type="button" onclick="location.href='index.php?option=com_menus&amp;task=type&amp;menutype=<?php echo htmlspecialchars($this->item->menutype);?><?php echo $this->item->expansion; ?>&amp;cid[]=<?php echo $this->item->id; ?>';">
 							<?php echo JText::_( 'Change Type' ); ?></button>
 					</div>
 					<h2><?php echo $this->name; ?></h2>
diff -aruN --binary 18/administrator/components/com_menus/views/item/tmpl/type.php 20/administrator/components/com_menus/views/item/tmpl/type.php
--- 18/administrator/components/com_menus/views/item/tmpl/type.php	2009-05-29 14:50:56.000000000 +0200
+++ 20/administrator/components/com_menus/views/item/tmpl/type.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,4 +1,11 @@
-<?php defined('_JEXEC') or die('Restricted access'); ?>
+<?php
+defined('_JEXEC') or die('Restricted access'); 
+
+// Precompute the menu type and CID
+$typeCid = '&amp;menutype=' . htmlspecialchars($this->item->menutype) 
+	. '&amp;cid[]=' . $this->item->id
+;
+?>
 
 <script language="javascript" type="text/javascript">
 	<!--
@@ -19,20 +26,20 @@
 							<ul>
 								<?php for ($i=0,$n=count($this->components);$i<$n;$i++) : ?>
 									<?php if($this->components[$i]->legacy) : ?>
-										<li><div class="node-open"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=component&amp;url[option]=<?php echo $this->components[$i]->option; ?>&amp;menutype=<?php echo $this->item->menutype; ?>&amp;cid[]=<?php echo $this->item->id; ?>" id="<?php echo str_replace('com_', '', $this->components[$i]->option); ?>"><?php echo $this->components[$i]->name; ?></a></div>
+										<li><div class="node-open"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=component&amp;url[option]=<?php echo $this->components[$i]->option . $typeCid; ?>" id="<?php echo str_replace('com_', '', $this->components[$i]->option); ?>"><?php echo $this->components[$i]->name; ?></a></div>
 									<?php elseif ($this->expansion['option'] == str_replace('com_', '', $this->components[$i]->option)) : ?>
 										<li <?php echo ($i == $n-1)? 'class="last"' : '' ?>><div class="node-open"><span></span><a id="<?php echo str_replace('com_', '', $this->components[$i]->option); ?>"><?php echo JText::_($this->components[$i]->name); ?></a></div>
 										<?php echo $this->expansion['html']; ?>
 									<?php else : ?>
-										<li <?php echo ($i == $n-1)? 'class="last"' : '' ?>><div class="node"><span></span><a href="index.php?option=com_menus&amp;task=type&amp;menutype=<?php echo $this->item->menutype; ?>&amp;cid[]=<?php echo $this->item->id; ?>&amp;expand=<?php echo str_replace('com_', '', $this->components[$i]->option); ?>" id="<?php echo str_replace('com_', '', $this->components[$i]->option); ?>"><?php echo JText::_($this->components[$i]->name); ?></a></div>
+										<li <?php echo ($i == $n-1)? 'class="last"' : '' ?>><div class="node"><span></span><a href="index.php?option=com_menus&amp;task=type<?php echo $typeCid; ?>&amp;expand=<?php echo str_replace('com_', '', $this->components[$i]->option); ?>" id="<?php echo str_replace('com_', '', $this->components[$i]->option); ?>"><?php echo JText::_($this->components[$i]->name); ?></a></div>
 									<?php endif; ?>
 								</li>
 								<?php endfor; ?>
 							</ul>
 						</li>
-						<li id="external-node"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=url&amp;menutype=<?php echo $this->item->menutype; ?>&amp;cid[]=<?php echo $this->item->id; ?>"><?php echo JText::_('External Link'); ?></a></div></li>
-						<li id="separator-node"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=separator&amp;menutype=<?php echo $this->item->menutype; ?>&amp;cid[]=<?php echo $this->item->id; ?>"><?php echo JText::_('Separator'); ?></a></div></li>
-						<li id="link-node" class="last"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=menulink&amp;menutype=<?php echo $this->item->menutype; ?>&amp;cid[]=<?php echo $this->item->id; ?>"><?php echo JText::_('Alias'); ?></a></div></li>
+						<li id="external-node"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=url<?php echo $typeCid; ?>"><?php echo JText::_('External Link'); ?></a></div></li>
+						<li id="separator-node"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=separator<?php echo $typeCid; ?>"><?php echo JText::_('Separator'); ?></a></div></li>
+						<li id="link-node" class="last"><div class="base"><span></span><a href="index.php?option=com_menus&amp;task=edit&amp;type=menulink<?php echo $typeCid; ?>"><?php echo JText::_('Alias'); ?></a></div></li>
 					</ul>
 				</fieldset>
 			</td>
diff -aruN --binary 18/administrator/components/com_menus/views/list/tmpl/copy.php 20/administrator/components/com_menus/views/list/tmpl/copy.php
--- 18/administrator/components/com_menus/views/list/tmpl/copy.php	2009-05-29 14:50:56.000000000 +0200
+++ 20/administrator/components/com_menus/views/list/tmpl/copy.php	2010-07-18 05:15:44.000000000 +0200
@@ -41,7 +41,7 @@
 
 	<input type="hidden" name="option" value="com_menus" />
 	<input type="hidden" name="boxchecked" value="0" />
-	<input type="hidden" name="menutype" value="<?php echo $this->menutype; ?>" />
+	<input type="hidden" name="menutype" value="<?php echo htmlspecialchars($this->menutype); ?>" />
 	<input type="hidden" name="task" value="" />
 <?php foreach ( $this->items as $item ) : ?>
 	<input type="hidden" name="cid[]" value="<?php echo $item->id; ?>" />
diff -aruN --binary 18/administrator/components/com_menus/views/list/tmpl/default.php 20/administrator/components/com_menus/views/list/tmpl/default.php
--- 18/administrator/components/com_menus/views/list/tmpl/default.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_menus/views/list/tmpl/default.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php defined('_JEXEC') or die('Restricted access'); ?>
 
-<form action="index.php?option=com_menus&amp;menutype=<?php echo $this->menutype; ?>" method="post" name="adminForm">
+<form action="index.php?option=com_menus&amp;menutype=<?php echo htmlspecialchars($this->menutype); ?>" method="post" name="adminForm">
 
 	<table>
 		<tr>
@@ -83,7 +83,7 @@
 				<?php echo $row->treename; ?>
 				<?php else : ?>
 				<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Menu' );?>::<?php echo $row->treename; ?>">
-				<a href="<?php echo JRoute::_( 'index.php?option=com_menus&menutype='.$row->menutype.'&task=edit&cid[]='.$row->id ); ?>"><?php echo $row->treename; ?></a></span>
+				<a href="<?php echo JRoute::_('index.php?option=com_menus&menutype=' . htmlspecialchars($row->menutype) . '&task=edit&cid[]=' . $row->id); ?>"><?php echo $row->treename; ?></a></span>
 				<?php endif; ?>
 			</td>
 			<td align="center">
@@ -121,7 +121,7 @@
 	</table>
 
 	<input type="hidden" name="option" value="com_menus" />
-	<input type="hidden" name="menutype" value="<?php echo $this->menutype; ?>" />
+	<input type="hidden" name="menutype" value="<?php echo htmlspecialchars($this->menutype); ?>" />
 	<input type="hidden" name="task" value="view" />
 	<input type="hidden" name="boxchecked" value="0" />
 	<input type="hidden" name="filter_order" value="<?php echo $this->lists['order']; ?>" />
diff -aruN --binary 18/administrator/components/com_menus/views/list/tmpl/move.php 20/administrator/components/com_menus/views/list/tmpl/move.php
--- 18/administrator/components/com_menus/views/list/tmpl/move.php	2009-05-29 14:50:56.000000000 +0200
+++ 20/administrator/components/com_menus/views/list/tmpl/move.php	2010-07-18 05:15:44.000000000 +0200
@@ -44,7 +44,7 @@
 	<input type="hidden" name="option" value="com_menus" />
 	<input type="hidden" name="boxchecked" value="1" />
 	<input type="hidden" name="task" value="" />
-	<input type="hidden" name="menutype" value="<?php echo $this->menutype; ?>" />
+	<input type="hidden" name="menutype" value="<?php echo htmlspecialchars($this->menutype); ?>" />
 <?php foreach ( $this->items as $item ) : ?>
 	<input type="hidden" name="cid[]" value="<?php echo $item->id; ?>" />
 <?php endforeach; ?>
diff -aruN --binary 18/administrator/components/com_menus/views/list/view.php 20/administrator/components/com_menus/views/list/view.php
--- 18/administrator/components/com_menus/views/list/view.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_menus/views/list/view.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: view.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: view.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Menus
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -35,7 +35,7 @@
 		/*
 		 * Set toolbar items for the page
 		 */
-		$menutype 	= $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'string' );
+		$menutype 	= $mainframe->getUserStateFromRequest('com_menus.menutype', 'menutype', 'mainmenu', 'menutype');
 
 		JToolBarHelper::title( JText::_( 'MENU ITEM MANAGER' ) .': <small><small>['.$menutype.']</small></small>', 'menu.png' );
 
@@ -102,7 +102,7 @@
 		$document = & JFactory::getDocument();
 		$document->setTitle(JText::_('Copy Menu Items'));
 
-		$menutype 	= $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'string' );
+		$menutype 	= $mainframe->getUserStateFromRequest('com_menus.menutype', 'menutype', 'mainmenu', 'menutype');
 
 		// Build the menutypes select list
 		$menuTypes 	= MenusHelper::getMenuTypes();
@@ -138,7 +138,7 @@
 		$document = & JFactory::getDocument();
 		$document->setTitle(JText::_('Move Menu Items'));
 
-		$menutype 	= $mainframe->getUserStateFromRequest( 'com_menus.menutype', 'menutype', 'mainmenu', 'string' );
+		$menutype 	= $mainframe->getUserStateFromRequest('com_menus.menutype', 'menutype', 'mainmenu', 'menutype');
 
 		// Build the menutypes select list
 		$menuTypes 	= MenusHelper::getMenuTypes();
@@ -162,7 +162,7 @@
 		global $mainframe;
 		$db		=& JFactory::getDBO();
 
-		$menutype			= $mainframe->getUserStateFromRequest( "com_menus.menutype",					'menutype',			'mainmenu',		'string' );
+		$menutype			= $mainframe->getUserStateFromRequest( 'com_menus.menutype',					'menutype',			'mainmenu',		'menutype' );
 		$filter_order		= $mainframe->getUserStateFromRequest( "com_menus.$menutype.filter_order",		'filter_order',		'm.ordering',	'cmd' );
 		$filter_order_Dir	= $mainframe->getUserStateFromRequest( "com_menus.$menutype.filter_order_Dir",	'filter_order_Dir',	'ASC',			'word' );
 		$filter_state		= $mainframe->getUserStateFromRequest( "com_menus.$menutype.filter_state",		'filter_state',		'',				'word' );
@@ -173,6 +173,11 @@
 		}
 		$search = JString::strtolower($search);
 
+		// ensure $filter_order has a good value
+		if (!in_array($filter_order, array('m.name', 'm.published', 'm.ordering', 'groupname', 'm.type', 'm.id'))) {
+			$filter_order = 'm.ordering';
+		}
+
 		// level limit filter
 		$lists['levellist'] = JHTML::_('select.integerlist',    1, 20, 1, 'levellimit', 'size="1" onchange="document.adminForm.submit();"', $levellimit );
 
diff -aruN --binary 18/administrator/components/com_menus/views/menus/tmpl/copy.php 20/administrator/components/com_menus/views/menus/tmpl/copy.php
--- 18/administrator/components/com_menus/views/menus/tmpl/copy.php	2009-05-29 14:50:54.000000000 +0200
+++ 20/administrator/components/com_menus/views/menus/tmpl/copy.php	2010-07-18 05:15:44.000000000 +0200
@@ -58,6 +58,6 @@
 
 	<input type="hidden" name="option" value="com_menus" />
 	<input type="hidden" name="task" value="" />
-	<input type="hidden" name="type" value="<?php echo $this->table->menutype; ?>" />
+	<input type="hidden" name="type" value="<?php echo htmlspecialchars($this->table->menutype); ?>" />
 	<?php echo JHTML::_( 'form.token' ); ?>
 </form>
\ No hay ningún carácter de nueva línea al final del fichero
diff -aruN --binary 18/administrator/components/com_menus/views/menus/tmpl/default.php 20/administrator/components/com_menus/views/menus/tmpl/default.php
--- 18/administrator/components/com_menus/views/menus/tmpl/default.php	2009-05-29 14:50:54.000000000 +0200
+++ 20/administrator/components/com_menus/views/menus/tmpl/default.php	2010-07-18 05:15:44.000000000 +0200
@@ -76,7 +76,7 @@
 		<?php
 			// Get the current iteration and set a few values
 			$link 	= 'index.php?option=com_menus&amp;task=editMenu&amp;id='. $menu->id;
-			$linkA 	= 'index.php?option=com_menus&amp;task=view&amp;menutype='. $menu->menutype;
+			$linkA 	= 'index.php?option=com_menus&amp;task=view&amp;menutype='. htmlspecialchars($menu->menutype);
 		?>
 		<tr class="<?php echo "row". $k; ?>">
 			<td align="center" width="30">
@@ -86,12 +86,12 @@
 				<input type="radio" id="cb<?php echo $i;?>" name="id" value="<?php echo $menu->id; ?>" onclick="isChecked(this.checked);" />
 			</td>
 			<td>
-			<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Menu Name' );?>::<?php echo $menu->title; ?>">
+			<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Menu Name' );?>::<?php echo htmlspecialchars($menu->title); ?>">
 				<a href="<?php echo $link; ?>">
-					<?php echo $menu->title; ?></a></span>
+					<?php echo htmlspecialchars($menu->title); ?></a></span>
 			</td>
 			<td>
-				<?php echo $menu->menutype; ?>
+				<?php echo htmlspecialchars($menu->menutype); ?>
 			</td>
 			<td align="center">
 				<a href="<?php echo $linkA; ?>" title="<?php echo JText::_( 'Edit Menu Items' ); ?>">
diff -aruN --binary 18/administrator/components/com_menus/views/menus/tmpl/edit.php 20/administrator/components/com_menus/views/menus/tmpl/edit.php
--- 18/administrator/components/com_menus/views/menus/tmpl/edit.php	2009-05-29 14:50:54.000000000 +0200
+++ 20/administrator/components/com_menus/views/menus/tmpl/edit.php	2010-07-18 05:15:44.000000000 +0200
@@ -41,7 +41,7 @@
 			</label>
 		</td>
 		<td>
-			<input class="inputbox" type="text" name="menutype" id="menutype" size="30" maxlength="25" value="<?php echo $this->row->menutype; ?>" />			<?php echo JHTML::_('tooltip', JText::_( 'TIPNAMEUSEDTOIDENTIFYMENU' )); ?>
+			<input class="inputbox" type="text" name="menutype" id="menutype" size="30" maxlength="25" value="<?php echo htmlspecialchars($this->row->menutype); ?>" />			<?php echo JHTML::_('tooltip', JText::_( 'TIPNAMEUSEDTOIDENTIFYMENU' )); ?>
 		</td>
 	</tr>
 	<tr>
@@ -51,7 +51,7 @@
 			</label>
 		</td>
 		<td>
-			<input class="inputbox" type="text" name="title" id="title" size="30" maxlength="255" value="<?php echo $this->row->title; ?>" />
+			<input class="inputbox" type="text" name="title" id="title" size="30" maxlength="255" value="<?php echo $this->escape($this->row->title); ?>" />
 			<?php echo JHTML::_('tooltip',  JText::_( 'A proper title for the Menu' ) ); ?>
 		</td>
 	</tr>
@@ -62,7 +62,7 @@
 			</label>
 		</td>
 		<td>
-			<input class="inputbox" type="text" name="description" id="description" size="30" maxlength="255" value="<?php echo $this->row->description; ?>" />
+			<input class="inputbox" type="text" name="description" id="description" size="30" maxlength="255" value="<?php echo $this->escape($this->row->description); ?>" />
 			<?php echo JHTML::_('tooltip',  JText::_( 'A description for the Menu' ) ); ?>
 		</td>
 	</tr>
diff -aruN --binary 18/administrator/components/com_messages/admin.messages.html.php 20/administrator/components/com_messages/admin.messages.html.php
--- 18/administrator/components/com_messages/admin.messages.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_messages/admin.messages.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.messages.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.messages.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Messages
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -100,7 +100,7 @@
 					</td>
 					<td>
 						<a href="#edit" onclick="return listItemTask('cb<?php echo $i;?>','view')">
-							<?php echo $row->subject; ?></a>
+							<?php echo htmlspecialchars($row->subject); ?></a>
 					</td>
 					<td align="center">
 						<a href="javascript: void(0);">
@@ -209,7 +209,7 @@
 					<?php echo JText::_( 'Subject' ); ?>:
 				</td>
 				<td bgcolor="#ffffff">
-					<?php echo $row->subject;?>
+					<?php echo htmlspecialchars($row->subject);?>
 				</td>
 			</tr>
 			<tr>
@@ -227,7 +227,7 @@
 		<input type="hidden" name="boxchecked" value="1" />
 		<input type="hidden" name="cid[]" value="<?php echo $row->message_id; ?>" />
 		<input type="hidden" name="userid" value="<?php echo $row->user_id_from; ?>" />
-		<input type="hidden" name="subject" value="Re: <?php echo $row->subject; ?>" />
+		<input type="hidden" name="subject" value="Re: <?php echo htmlspecialchars($row->subject); ?>" />
 		<?php echo JHTML::_( 'form.token' ); ?>
 		</form>
 		<?php
diff -aruN --binary 18/administrator/components/com_messages/admin.messages.php 20/administrator/components/com_messages/admin.messages.php
--- 18/administrator/components/com_messages/admin.messages.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_messages/admin.messages.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.messages.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.messages.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Messages
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -95,6 +95,12 @@
 	}
 
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+	// sanitize $filter_order``
+	if (!in_array($filter_order, array('a.subject', 'a.state', 'user_from', 'a.date_time'))) {
+		$filter_order = 'a.date_time';
+	}
+
 	$orderby 	= ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', a.date_time DESC';
 
 	$query = 'SELECT COUNT(*)'
diff -aruN --binary 18/administrator/components/com_modules/admin.modules.html.php 20/administrator/components/com_modules/admin.modules.html.php
--- 18/administrator/components/com_modules/admin.modules.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_modules/admin.modules.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.modules.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.modules.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Modules
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -128,12 +128,12 @@
 					<td>
 					<?php
 					if (  JTable::isCheckedOut($user->get ('id'), $row->checked_out ) ) {
-						echo $row->title;
+						echo htmlspecialchars($row->title);
 					} else {
 						?>
-						<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Module' );?>::<?php echo $row->title; ?>">
+						<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Module' );?>::<?php echo htmlspecialchars($row->title); ?>">
 						<a href="<?php echo $link; ?>">
-							<?php echo $row->title; ?></a>
+							<?php echo htmlspecialchars($row->title); ?></a>
 						</span>
 						<?php
 					}
diff -aruN --binary 18/administrator/components/com_modules/controller.php 20/administrator/components/com_modules/controller.php
--- 18/administrator/components/com_modules/controller.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_modules/controller.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: controller.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: controller.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Modules
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -100,6 +100,11 @@
 			}
 		}
 
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('m.title', 'm.published', 'm.ordering', 'groupname', 'm.position', 'pages', 'm.module', 'm.id'))) {
+			$filter_order = 'm.position';
+		}
+
 		$where 		= ' WHERE ' . implode( ' AND ', $where );
 		$join 		= ' ' . implode( ' ', $joins );
 		if ($filter_order == 'm.ordering') {
diff -aruN --binary 18/administrator/components/com_newsfeeds/admin.newsfeeds.html.php 20/administrator/components/com_newsfeeds/admin.newsfeeds.html.php
--- 18/administrator/components/com_newsfeeds/admin.newsfeeds.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_newsfeeds/admin.newsfeeds.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.newsfeeds.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.newsfeeds.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Newsfeeds
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -117,9 +117,9 @@
 							echo $row->name;
 						} else {
 							?>
-								<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Newsfeed' );?>::<?php echo $row->name; ?>">
+								<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Newsfeed' );?>::<?php echo htmlspecialchars($row->name); ?>">
 							<a href="<?php echo $link; ?>">
-								<?php echo $row->name; ?></a></span>
+								<?php echo htmlspecialchars($row->name); ?></a></span>
 							<?php
 						}
 						?>
diff -aruN --binary 18/administrator/components/com_newsfeeds/admin.newsfeeds.php 20/administrator/components/com_newsfeeds/admin.newsfeeds.php
--- 18/administrator/components/com_newsfeeds/admin.newsfeeds.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_newsfeeds/admin.newsfeeds.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.newsfeeds.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.newsfeeds.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Newsfeeds
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -114,6 +114,11 @@
 		}
 	}
 
+	// sanitize $filter_order
+	if (!in_array($filter_order, array('a.name', 'a.published', 'a.ordering', 'catname', 'a.numarticles', 'a.cache_time', 'a.id'))) {
+		$filter_order = 'a.ordering';
+	}
+
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
 	if ($filter_order == 'a.ordering'){
 		$orderby 	= ' ORDER BY catname, a.ordering';
diff -aruN --binary 18/administrator/components/com_plugins/views/plugins/tmpl/default.php 20/administrator/components/com_plugins/views/plugins/tmpl/default.php
--- 18/administrator/components/com_plugins/views/plugins/tmpl/default.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_plugins/views/plugins/tmpl/default.php	2010-07-18 05:15:44.000000000 +0200
@@ -97,9 +97,9 @@
 				echo $row->name;
 			} else {
 			?>
-				<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Plugin' );?>::<?php echo $row->name; ?>">
+				<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Plugin' );?>::<?php echo htmlspecialchars($row->name); ?>">
 				<a href="<?php echo $link; ?>">
-					<?php echo $row->name; ?></a></span>
+					<?php echo htmlspecialchars($row->name); ?></a></span>
 			<?php } ?>
 		</td>
 		<td align="center">
diff -aruN --binary 18/administrator/components/com_plugins/views/plugins/view.html.php 20/administrator/components/com_plugins/views/plugins/view.html.php
--- 18/administrator/components/com_plugins/views/plugins/view.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_plugins/views/plugins/view.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: view.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: view.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Config
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -73,13 +73,18 @@
 		}
 
 		$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('p.name', 'p.published', 'p.ordering', 'groupname', 'p.folder', 'p.element', 'p.id'))) {
+			$filter_order = 'p.folder';
+		}
+
 		if ($filter_order == 'p.ordering') {
 			$orderby = ' ORDER BY p.folder, p.ordering '. $filter_order_Dir;
 		} else {
 			$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', p.ordering ASC';
 		}
 
-
 		// get the total number of records
 		$query = 'SELECT COUNT(*)'
 			. ' FROM #__plugins AS p'
diff -aruN --binary 18/administrator/components/com_poll/views/polls/tmpl/default.php 20/administrator/components/com_poll/views/polls/tmpl/default.php
--- 18/administrator/components/com_poll/views/polls/tmpl/default.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_poll/views/polls/tmpl/default.php	2010-07-18 05:15:44.000000000 +0200
@@ -87,9 +87,9 @@
 				echo $row->title;
 			} else {
 				?>
-				<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Poll' );?>::<?php echo $row->title; ?>">
+				<span class="editlinktip hasTip" title="<?php echo JText::_( 'Edit Poll' );?>::<?php echo htmlspecialchars($row->title); ?>">
 				<a href="<?php echo $link  ?>">
-					<?php echo $row->title; ?></a></span>
+					<?php echo htmlspecialchars($row->title); ?></a></span>
 				<?php
 			}
 			?>
diff -aruN --binary 18/administrator/components/com_poll/views/polls/view.html.php 20/administrator/components/com_poll/views/polls/view.html.php
--- 18/administrator/components/com_poll/views/polls/view.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_poll/views/polls/view.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: view.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: view.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Config
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -63,6 +63,12 @@
 		}
 
 		$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('m.title', 'm.published', 'a.ordering', 'catname', 'm.voters', 'numoptions', 'm.lag', 'm.id'))) {
+			$filter_order = 'm.id';
+		}
+
 		$orderby 	= ' ORDER BY '. $filter_order .' '. $filter_order_Dir;
 
 		$query = 'SELECT COUNT(m.id)'
diff -aruN --binary 18/administrator/components/com_search/models/search.php 20/administrator/components/com_search/models/search.php
--- 18/administrator/components/com_search/models/search.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_search/models/search.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: search.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: search.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Search
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -58,6 +58,11 @@
 		$search = JString::strtolower($search);
 		$showResults		= JRequest::getInt('search_results');
 
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('search_term', 'hits'))) {
+			$filter_order = 'hits';
+		}
+
 		// table ordering
 		if ( $filter_order_Dir == 'ASC' ) {
 			$this->lists['order_Dir'] = 'ASC';
@@ -75,6 +80,7 @@
 		}
 
 		$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
 		$orderby 	= ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', hits DESC';
 
 		// get the total number of records
diff -aruN --binary 18/administrator/components/com_sections/admin.sections.html.php 20/administrator/components/com_sections/admin.sections.html.php
--- 18/administrator/components/com_sections/admin.sections.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_sections/admin.sections.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.sections.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.sections.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Sections
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -118,14 +118,14 @@
 					<?php echo $checked; ?>
 				</td>
 				<td>
-					<span class="editlinktip hasTip" title="<?php echo JText::_( 'Title' );?>::<?php echo $row->title; ?>">
+					<span class="editlinktip hasTip" title="<?php echo JText::_( 'Title' );?>::<?php echo htmlspecialchars($row->title); ?>">
 					<?php
 					if (  JTable::isCheckedOut($user->get ('id'), $row->checked_out ) ) {
-						echo $row->title;
+						echo htmlspecialchars($row->title);
 					} else {
 						?>
 						<a href="<?php echo JRoute::_( $link ); ?>">
-							<?php echo $row->title; ?></a>
+							<?php echo htmlspecialchars($row->title); ?></a>
 						<?php
 					}
 					?></span>
@@ -250,7 +250,7 @@
 						</label>
 					</td>
 					<td colspan="2">
-						<input class="text_area" type="text" name="title" id="title" value="<?php echo $row->title; ?>" size="50" maxlength="50" title="<?php echo JText::_( 'TIPTITLEFIELD' ); ?>" />
+						<input class="text_area" type="text" name="title" id="title" value="<?php echo htmlspecialchars($row->title); ?>" size="50" maxlength="50" title="<?php echo JText::_( 'TIPTITLEFIELD' ); ?>" />
 					</td>
 				</tr>
 				<tr>
diff -aruN --binary 18/administrator/components/com_sections/admin.sections.php 20/administrator/components/com_sections/admin.sections.php
--- 18/administrator/components/com_sections/admin.sections.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_sections/admin.sections.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.sections.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.sections.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Sections
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -132,6 +132,12 @@
 	}
 
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+	// ensure filter_order has a valid value
+	if (!in_array($filter_order, array('s.title', 's.published', 's.ordering', 'groupname', 's.id'))) {
+		$filter_order = 's.ordering';
+	}
+
 	$orderby 	= ' ORDER BY '.$filter_order.' '. $filter_order_Dir .', s.ordering';
 
 	// get the total number of records
@@ -277,18 +283,20 @@
 {
 	global $mainframe;
 
+	require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_content'.DS.'helper.php');
+
 	// Check for request forgeries
 	JRequest::checkToken() or jexit( 'Invalid Token' );
 
 	$db			=& JFactory::getDBO();
-	$menu		= JRequest::getVar( 'menu', 'mainmenu', 'post', 'string' );
+	$menu		= JRequest::getVar( 'menu', 'mainmenu', 'post', 'menutype' );
 	$menuid		= JRequest::getVar( 'menuid', 0, 'post', 'int' );
 	$oldtitle	= JRequest::getVar( 'oldtitle', '', '', 'post', 'string' );
 
 	$post = JRequest::get('post');
 
 	// fix up special html fields
-	$post['description'] = JRequest::getVar( 'description', '', 'post', 'string', JREQUEST_ALLOWRAW );
+	$post['description'] = ContentHelper::filterText(JRequest::getVar( 'description', '', 'post', 'string', JREQUEST_ALLOWRAW ));
 
 	$row =& JTable::getInstance('section');
 	if (!$row->bind($post)) {
@@ -298,7 +306,7 @@
 		JError::raiseError(500, $row->getError() );
 	}
 	if ( $oldtitle ) {
-		if ( $oldtitle <> $row->title ) {
+		if ( $oldtitle != $row->title ) {
 			$query = 'UPDATE #__menu'
 			. ' SET name = '.$db->Quote($row->title)
 			. ' WHERE name = '.$db->Quote($oldtitle)
@@ -322,11 +330,16 @@
 	switch ( $task )
 	{
 		case 'go2menu':
-			$mainframe->redirect( 'index.php?option=com_menus&menutype='. $menu );
+			$mainframe->redirect( 
+				'index.php?option=com_menus&menutype=' . $menu 
+			);
 			break;
 
 		case 'go2menuitem':
-			$mainframe->redirect( 'index.php?option=com_menus&menutype='. $menu .'&task=edit&id='. $menuid );
+			$mainframe->redirect( 
+				'index.php?option=com_menus&menutype=' . $menu
+				. '&task=edit&id=' . $menuid 
+			);
 			break;
 
 		case 'apply':
diff -aruN --binary 18/administrator/components/com_translationsmanager/admin.translationsmanager.php 20/administrator/components/com_translationsmanager/admin.translationsmanager.php
--- 18/administrator/components/com_translationsmanager/admin.translationsmanager.php	2007-12-28 16:41:02.000000000 +0100
+++ 20/administrator/components/com_translationsmanager/admin.translationsmanager.php	2010-06-09 14:26:10.000000000 +0200
@@ -25,7 +25,7 @@
 
 // run the controller
 $controller = new TranslationsController( array('default_task' => 'languages') );
-$controller->execute( JRequest::getVar( 'task' ) );
+$controller->execute( JRequest::getCmd( 'task' ) );
 $controller->redirect();
 
-?>
\ No hay ningún carácter de nueva línea al final del fichero
+?>
diff -aruN --binary 18/administrator/components/com_translationsmanager/CHANGELOG.php 20/administrator/components/com_translationsmanager/CHANGELOG.php
--- 18/administrator/components/com_translationsmanager/CHANGELOG.php	2008-02-25 16:09:22.000000000 +0100
+++ 20/administrator/components/com_translationsmanager/CHANGELOG.php	2010-06-14 10:49:40.000000000 +0200
@@ -12,6 +12,11 @@
 - -> Removed
 ! -> Note
 
+09-Jun-2010 Security RELEASE (J!1.5.1) ( Joomla Spanish )
+* -> Replace JRequest::getVar for JRequest::getCmd
+* -> Fix path JPath::clean() and JFile::makeSafe
+# -> Change config.xml to translationsmanager.xml to fix installation error (Thanks to jorgechess for report)
+
 25-Feb-2008 RELEASE (J!1.5.1)
 ^ Change to allow languages in "xxx-XX" format
 ^ Updated Component Translation: German
diff -aruN --binary 18/administrator/components/com_translationsmanager/controller.php 20/administrator/components/com_translationsmanager/controller.php
--- 18/administrator/components/com_translationsmanager/controller.php	2008-02-25 16:06:06.000000000 +0100
+++ 20/administrator/components/com_translationsmanager/controller.php	2010-06-09 14:27:44.000000000 +0200
@@ -204,7 +204,12 @@
 		}
 
 		// set the filename
-		$options['filename'] = $options['cid'][0];
+		$options['filename'] = $options['cid'][0];
+
+
+jimport('joomla.filesystem.file');
+$options['filename'] = JFile::makeSafe($options['filename']);
+
 
 		// build the autocorrect array
 		$autoCorrect = array();
@@ -287,6 +292,7 @@
 				// get the language and language path
 				$lang = substr($file,0,$options['langLen']);
 				$langPath = JLanguage::getLanguagePath( $options['basePath'], $lang );
+				$langPath = JPath::clean($langPath );
 
 				// ensure that XML files are only affected by XML tasks
 				if ( (substr($file,-4)=='.xml') && (substr($task,-3)!='xml') ) {
@@ -302,9 +308,9 @@
 				};
 
 				// get file path-names
-				$chk_file = 'chk.'.$file;
-				$pub_file = $file;
-				$unpub_file = 'xx.'.$file;
+				$chk_file = JFile::makeSafe('chk.'.$file);
+				$pub_file = JFile::makeSafe($file);
+				$unpub_file = JFile::makeSafe('xx.'.$file);
 
 				// check for an unpublished file
 				if (JFile::exists($langPath.DS.$unpub_file)) {
@@ -409,7 +415,7 @@
 		// we are in the process of creating a new file
 		// the filename is set by the 'newfilename' field
 		if ( $options['newprocess'] ) {
-			$options['newfilename'] = strtolower(JRequest::getVar('newfilename','','','string'));
+			$options['newfilename'] = JFile::makeSafe(strtolower(JRequest::getVar('newfilename','','','string')));
 			// validate the filename
 			if ($options['newfilename']) {
 				// strip off ini
@@ -421,7 +427,7 @@
 					$options['newfilename'] = substr($options['newfilename'],6);
 				}
 				// set variables
-				$options['filename'] = $options['lang'].'.'.$options['newfilename'].'.ini';
+				$options['filename'] = JFile::makeSafe($options['lang'].'.'.$options['newfilename'].'.ini');
 			}
 			// no filename
 			else {
@@ -441,7 +447,7 @@
 		else if (empty($options['filename'])) {
 			$mainframe->enqueueMessage( JText::_('You must select a file to edit') );
 			$mainframe->redirect( 'index.php?option=com_translationsmanager&task=files' );
-		} else if ( $content = @file_get_contents($options['langPath'].DS.'chk.'.$options['filename'])) {
+		} else if ( $content = @file_get_contents(JFile::makeSafe($options['langPath'].DS.'chk.'.$options['filename']))) {
 			list ($timestamp,$userid,$username) = explode( '#', $content.'##' );
 			$user = & JFactory::getUser();
 			// validate the checkout
@@ -451,7 +457,7 @@
 			&&	( $userid <> $user->get('id','0') )
 				) {
 				// report and redirect
-				$checkin = '<a href="index.php?option=com_translationsmanager&task=checkin&id='.$options['filename'].'" title="'. JText::_( 'Force Checkin' ) . '" style="font-size:smaller">[' . JText::_( 'Checkin' ) . ']</a>';
+				$checkin = '<a href="index.php?option=com_translationsmanager&task=checkin&id='. JFile::makeSafe($options['filename']) .'" title="'. JText::_( 'Force Checkin' ) . '" style="font-size:smaller">[' . JText::_( 'Checkin' ) . ']</a>';
 				$mainframe->enqueueMessage(sprintf(JText::_('checked out by'), $options['filename'], $username, $checkin ) );
 				$mainframe->redirect( 'index.php?option=com_translationsmanager&task=files' );
 			}
@@ -553,7 +559,7 @@
 		$options['XMLmeta'] = TranslationsHelper::getXMLMeta($options['langPath'].DS.$options['lang'].'.xml');
 		$statusMeta = TranslationsHelper::getINIstatus( $refStrings, $editStrings );
 		$editMeta = array_merge( $options['XMLmeta'], $fileMeta, $statusMeta );
-		$editMeta['filename'] = $options['filename'];
+		$editMeta['filename'] = JFile::makeSafe($options['filename']);
 
 		// META: apply any user form values
 		foreach($editMeta as $k=>$v) {
@@ -1530,4 +1536,4 @@
 	}
 
 }
-?>
\ No hay ningún carácter de nueva línea al final del fichero
+?>
diff -aruN --binary 18/administrator/components/com_translationsmanager/helper.php 20/administrator/components/com_translationsmanager/helper.php
--- 18/administrator/components/com_translationsmanager/helper.php	2008-01-03 12:20:30.000000000 +0100
+++ 20/administrator/components/com_translationsmanager/helper.php	2010-06-09 14:28:10.000000000 +0200
@@ -152,7 +152,9 @@
 	* @param string $xmlFile	The file to parse including the path.
 	* @return array				The Meta Info in an array
 	*/
-	function getXMLMeta( $xmlFile ) {
+	function getXMLMeta( $xmlFile ) {
+		jimport('joomla.filesystem.file');
+		$xmlFile = JFile::makeSafe($xmlFile);
 
 		$xmlData = array(
 			'author' 		=> '',
@@ -218,4 +220,4 @@
 		return $s;
 	}
 }
-?>
\ No hay ningún carácter de nueva línea al final del fichero
+?>
diff -aruN --binary 18/administrator/components/com_translationsmanager/translationsmanager.xml 20/administrator/components/com_translationsmanager/translationsmanager.xml
--- 18/administrator/components/com_translationsmanager/translationsmanager.xml	2008-01-07 21:44:14.000000000 +0100
+++ 20/administrator/components/com_translationsmanager/translationsmanager.xml	2010-06-14 12:51:50.000000000 +0200
@@ -1,13 +1,13 @@
 <?xml version="1.0" ?>
-<install version="1.5.0" type="component">
+<install version="1.5.2" type="component">
 
 	<name>Translations Manager</name>
-	<creationDate>January 208</creationDate>
+	<creationDate>June 2010</creationDate>
 	<author>Ifan Evans</author>
 	<copyright>(C) 2008 Ifan Evans</copyright>
 	<authorEmail>post@ffenest.co.uk</authorEmail>
 	<authorUrl></authorUrl>
-	<version>1.5.0 RC4</version>
+	<version>1.5.2</version>
 
 	<description>
 		<![CDATA[
@@ -56,7 +56,7 @@
 			<filename>views/translations/tmpl/languages.php</filename>
 			<filename>admin.translationsmanager.php</filename>
 			<filename>CHANGELOG.php</filename>
-			<filename>config.xml</filename>
+			<filename>translationsmanager.xml</filename>
 			<filename>controller.php</filename>
 			<filename>helper.php</filename>
 			<filename>index.html</filename>
@@ -69,7 +69,6 @@
 			<language tag="da-DK">da-DK.com_translationsmanager.ini</language>
 			<language tag="de-DE">de-DE.com_translationsmanager.ini</language>
 			<language tag="de-DE">de-DE.com_translationsmanager.menu.ini</language>
-			<language tag="de-DE">de-DE.com_translationsmanager.menu.ini</language>
 			<language tag="en-GB">en-GB.com_translationsmanager.ini</language>
 			<language tag="es-ES">es-ES.com_translationsmanager.ini</language>
 			<language tag="hu-HU">hu-HU.com_translationsmanager.ini</language>
@@ -79,4 +78,4 @@
 		</languages>
 	</administration>
 
-</install>
\ No hay ningún carácter de nueva línea al final del fichero
+</install>
diff -aruN --binary 18/administrator/components/com_trash/admin.trash.php 20/administrator/components/com_trash/admin.trash.php
--- 18/administrator/components/com_trash/admin.trash.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_trash/admin.trash.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: admin.trash.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: admin.trash.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Trash
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -94,6 +94,12 @@
 	}
 
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+	// ensure filter_order has a valid value
+	if (!in_array($filter_order, array('c.title', 'c.id', 'sectname', 'catname'))) {
+		$filter_order = 'sectname';
+	}
+
 	$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', s.name, cc.name, c.title';
 
 	// get the total number of content
@@ -165,6 +171,12 @@
 	}
 
 	$where 		= ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' );
+
+	// ensure filter_order has a valid value
+	if (!in_array($filter_order, array('m.name', 'm.id', 'm.menutype', 'm.type'))) {
+		$filter_order = 'm.menutype';
+	}
+
 	$orderby 	= ' ORDER BY '. $filter_order . ' ' . $filter_order_Dir .', m.menutype, m.ordering, m.ordering,  m.name';
 
 	$query = 'SELECT count(*)'
diff -aruN --binary 18/administrator/components/com_users/views/users/view.html.php 20/administrator/components/com_users/views/users/view.html.php
--- 18/administrator/components/com_users/views/users/view.html.php	2010-05-28 03:28:54.000000000 +0200
+++ 20/administrator/components/com_users/views/users/view.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: view.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: view.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Users
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -92,6 +92,11 @@
 			$filter = ' INNER JOIN #__session AS s ON s.userid = a.id';
 		}
 
+		// ensure filter_order has a valid value.
+		if (!in_array($filter_order, array('a.name', 'a.username', 'a.block', 'groupname', 'a.email', 'a.lastvisitdate', 'a.id'))) {
+			$filter_order = 'a.name';
+		}
+
 		$orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir;
 		$where = ( count( $where ) ? ' WHERE (' . implode( ') AND (', $where ) . ')' : '' );
 
diff -aruN --binary 18/administrator/components/com_weblinks/models/weblinks.php 20/administrator/components/com_weblinks/models/weblinks.php
--- 18/administrator/components/com_weblinks/models/weblinks.php	2010-05-28 03:28:56.000000000 +0200
+++ 20/administrator/components/com_weblinks/models/weblinks.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: weblinks.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: weblinks.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Content
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -147,6 +147,11 @@
 		$filter_order		= $mainframe->getUserStateFromRequest( $option.'filter_order',		'filter_order',		'a.ordering',	'cmd' );
 		$filter_order_Dir	= $mainframe->getUserStateFromRequest( $option.'filter_order_Dir',	'filter_order_Dir',	'',				'word' );
 
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('a.title', 'a.published', 'a.ordering', 'category', 'a.hits', 'a.id'))) {
+			$filter_order = 'a.ordering';
+		}
+
 		if ($filter_order == 'a.ordering'){
 			$orderby 	= ' ORDER BY category, a.ordering '.$filter_order_Dir;
 		} else {
diff -aruN --binary 18/administrator/components/com_weblinks/views/weblinks/view.html.php 20/administrator/components/com_weblinks/views/weblinks/view.html.php
--- 18/administrator/components/com_weblinks/views/weblinks/view.html.php	2010-05-28 03:28:56.000000000 +0200
+++ 20/administrator/components/com_weblinks/views/weblinks/view.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: view.html.php 17299 2010-05-27 16:06:54Z ian $
+* @version		$Id: view.html.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @subpackage	Weblinks
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -44,6 +44,11 @@
 		}
 		$search = JString::strtolower($search);
 
+		// sanitize $filter_order
+		if (!in_array($filter_order, array('a.title', 'a.published', 'a.ordering', 'category', 'a.hits', 'a.id'))) {
+			$filter_order = 'a.ordering';
+		}
+
 		// Get data from the model
 		$items		= & $this->get( 'Data');
 		$total		= & $this->get( 'Total');
diff -aruN --binary 18/administrator/help/en-GB/screen.banners.html 20/administrator/help/en-GB/screen.banners.html
--- 18/administrator/help/en-GB/screen.banners.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.banners.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Banner Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Banner Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Banner Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Banner Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.banners.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.categories.html 20/administrator/help/en-GB/screen.categories.html
--- 18/administrator/help/en-GB/screen.categories.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.categories.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Category Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Category Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Category Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Category Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.categories.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.checkin.html 20/administrator/help/en-GB/screen.checkin.html
--- 18/administrator/help/en-GB/screen.checkin.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.checkin.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Global Check-in</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Global Check-in</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Global Check-in</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Global Check-in</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.checkin.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.config.html 20/administrator/help/en-GB/screen.config.html
--- 18/administrator/help/en-GB/screen.config.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.config.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Global Configuration</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Global Configuration</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Global Configuration</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Global Configuration</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.config.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.contactmanager.html 20/administrator/help/en-GB/screen.contactmanager.html
--- 18/administrator/help/en-GB/screen.contactmanager.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.contactmanager.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Contact Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Contact Manager</h1>
-<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.contactmanager.15">online version</a>.</p>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Contact Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Contact Manager</h1>
+<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.contactmanager.15">online version</a>.</p>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.content.html 20/administrator/help/en-GB/screen.content.html
--- 18/administrator/help/en-GB/screen.content.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.content.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Article Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Article Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Article Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Article Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.content.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.cpanel.html 20/administrator/help/en-GB/screen.cpanel.html
--- 18/administrator/help/en-GB/screen.cpanel.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.cpanel.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Control Panel</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Control Panel</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Control Panel</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Control Panel</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.cpanel.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.frontpage.html 20/administrator/help/en-GB/screen.frontpage.html
--- 18/administrator/help/en-GB/screen.frontpage.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.frontpage.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Frontpage Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Frontpage Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Frontpage Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Frontpage Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.frontpage.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.languages.html 20/administrator/help/en-GB/screen.languages.html
--- 18/administrator/help/en-GB/screen.languages.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.languages.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Language Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Language Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Language Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Language Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.languages.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.mediamanager.html 20/administrator/help/en-GB/screen.mediamanager.html
--- 18/administrator/help/en-GB/screen.mediamanager.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.mediamanager.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Media Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Media Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Media Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Media Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.mediamanager.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.menumanager.html 20/administrator/help/en-GB/screen.menumanager.html
--- 18/administrator/help/en-GB/screen.menumanager.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.menumanager.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Menu Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Menu Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Menu Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Menu Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.menumanager.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.modules.edit.html 20/administrator/help/en-GB/screen.modules.edit.html
--- 18/administrator/help/en-GB/screen.modules.edit.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.modules.edit.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Module - Edit</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Module - Edit</h1>
-<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.edit.15">online version</a>.</p>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Module - Edit</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Module - Edit</h1>
+<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.edit.15">online version</a>.</p>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.modules.html 20/administrator/help/en-GB/screen.modules.html
--- 18/administrator/help/en-GB/screen.modules.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.modules.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Module Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Module Manager</h1>
-<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.15">online version</a>.</p>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Module Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Module Manager</h1>
+<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.15">online version</a>.</p>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.modules.new.html 20/administrator/help/en-GB/screen.modules.new.html
--- 18/administrator/help/en-GB/screen.modules.new.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.modules.new.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Module - New</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Module - New</h1>
-<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.new.15">online version</a>.</p>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Module - New</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Module - New</h1>
+<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.modules.new.15">online version</a>.</p>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.newsfeeds.html 20/administrator/help/en-GB/screen.newsfeeds.html
--- 18/administrator/help/en-GB/screen.newsfeeds.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.newsfeeds.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>News Feeds Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>News Feeds Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>News Feeds Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>News Feeds Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.newsfeeds.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.plugins.html 20/administrator/help/en-GB/screen.plugins.html
--- 18/administrator/help/en-GB/screen.plugins.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.plugins.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Plugin Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All Rights Reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Plugin Manager</h1>
-<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.plugins.15">online version</a>.</p>
-</body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Plugin Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All Rights Reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Plugin Manager</h1>
+<p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.plugins.15">online version</a>.</p>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.polls.html 20/administrator/help/en-GB/screen.polls.html
--- 18/administrator/help/en-GB/screen.polls.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.polls.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Poll Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Poll Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Poll Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Poll Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.polls.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.sections.html 20/administrator/help/en-GB/screen.sections.html
--- 18/administrator/help/en-GB/screen.sections.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.sections.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Section Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Section Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Section Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Section Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.sections.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.stats.searches.html 20/administrator/help/en-GB/screen.stats.searches.html
--- 18/administrator/help/en-GB/screen.stats.searches.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.stats.searches.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Search Statistics</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Search Statistics</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Search Statistics</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Search Statistics</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.stats.searches.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.system.info.html 20/administrator/help/en-GB/screen.system.info.html
--- 18/administrator/help/en-GB/screen.system.info.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.system.info.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>System Information</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>System Information</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>System Information</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>System Information</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.system.info.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.templates.html 20/administrator/help/en-GB/screen.templates.html
--- 18/administrator/help/en-GB/screen.templates.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.templates.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Template Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Template Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Template Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Template Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.templates.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.trashmanager.html 20/administrator/help/en-GB/screen.trashmanager.html
--- 18/administrator/help/en-GB/screen.trashmanager.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.trashmanager.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Trash Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Trash Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Trash Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Trash Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.trashmanager.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.users.edit.html 20/administrator/help/en-GB/screen.users.edit.html
--- 18/administrator/help/en-GB/screen.users.edit.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.users.edit.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>User Manager - Add or Edit Users</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>User Manager - Add or Edit Users</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>User Manager - Add or Edit Users</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>User Manager - Add or Edit Users</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.users.edit.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.users.massmail.html 20/administrator/help/en-GB/screen.users.massmail.html
--- 18/administrator/help/en-GB/screen.users.massmail.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.users.massmail.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Mass Mail Users</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Mass Mail Users</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Mass Mail Users</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Mass Mail Users</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.users.massmail.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.weblink.edit.html 20/administrator/help/en-GB/screen.weblink.edit.html
--- 18/administrator/help/en-GB/screen.weblink.edit.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.weblink.edit.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Web Link Manager : New / Edit</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Web Link Manager : New / Edit</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Web Link Manager : New / Edit</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Web Link Manager : New / Edit</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.weblink.edit.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/help/en-GB/screen.weblink.html 20/administrator/help/en-GB/screen.weblink.html
--- 18/administrator/help/en-GB/screen.weblink.html	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/help/en-GB/screen.weblink.html	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-<head>
-<title>Web Link Manager</title>
-<link href="css/help.css" rel="stylesheet" type="text/css" />
-<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
-<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
-</head>
-<body>
-<h1>Web Link Manager</h1>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
+<head>
+<title>Web Link Manager</title>
+<link href="css/help.css" rel="stylesheet" type="text/css" />
+<meta name="copyright" content="Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved." />
+<meta name="license" content="http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL" />
+</head>
+<body>
+<h1>Web Link Manager</h1>
 <p>The local copy of this help file is no longer maintained.  Please use the <a href="http://help.joomla.org/index2.php?option=com_content&task=findkey&pop=1&keyref=screen.weblink.15">online version</a>.</p>
-</body>
+</body>
 </html>
diff -aruN --binary 18/administrator/includes/framework.php 20/administrator/includes/framework.php
--- 18/administrator/includes/framework.php	2010-05-28 03:28:56.000000000 +0200
+++ 20/administrator/includes/framework.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: framework.php 17262 2010-05-25 15:11:15Z ian $
+* @version		$Id: framework.php 18172 2010-07-17 19:46:57Z ian $
 * @package		Joomla
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
diff -aruN --binary 18/administrator/modules/mod_menu/helper.php 20/administrator/modules/mod_menu/helper.php
--- 18/administrator/modules/mod_menu/helper.php	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/modules/mod_menu/helper.php	2010-07-18 05:15:44.000000000 +0200
@@ -94,7 +94,14 @@
 		 */
 		if (count($menuTypes)) {
 			foreach ($menuTypes as $menuType) {
-				$menu->addChild(new JMenuNode($menuType->title.($menuType->home ? ' *' : ''), 'index.php?option=com_menus&task=view&menutype='.$menuType->menutype, 'class:menu'));
+				$menu->addChild(
+					new JMenuNode(
+						$menuType->title . ($menuType->home ? ' *' : ''), 
+						'index.php?option=com_menus&task=view&menutype='
+						. $menuType->menutype,
+						'class:menu'
+					)
+				);
 			}
 		}
 
diff -aruN --binary 18/administrator/modules/mod_stats/mod_stats.php 20/administrator/modules/mod_stats/mod_stats.php
--- 18/administrator/modules/mod_stats/mod_stats.php	2010-04-23 13:40:12.000000000 +0200
+++ 20/administrator/modules/mod_stats/mod_stats.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: mod_stats.php 14401 2010-01-26 14:10:00Z louis $
+* @version		$Id: mod_stats.php 18162 2010-07-16 07:00:47Z ian $
 * @package		Joomla
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
@@ -35,7 +35,7 @@
 <?php
 foreach ($rows as $row)
 {
-	$link = 'index.php?option=com_menus&amp;task=view&amp;menutype='. $row->menutype;
+	$link = 'index.php?option=com_menus&amp;task=view&amp;menutype=' . $row->menutype;
 	?>
 	<tr>
 		<td>
diff -aruN --binary 18/CHANGELOG.php 20/CHANGELOG.php
--- 18/CHANGELOG.php	2010-05-28 03:28:52.000000000 +0200
+++ 20/CHANGELOG.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: CHANGELOG.php 17301 2010-05-27 21:08:11Z ian $
+* @version		$Id: CHANGELOG.php 18172 2010-07-17 19:46:57Z ian $
 * @package		Joomla
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
@@ -36,6 +36,26 @@
 - -> Removed
 ! -> Note
 
+
+-------------------- 1.5.20 Stable Release [18-July-2010] ------------------
+
+
+-------------------- 1.5.19 Stable Release [15-July-2010] ------------------
+
+15-July-2010 Mark Dexter
+# [#21419] Incorrect Joomla! Community Magazine address
+^ [#21421] *Credits.php update for 1.5.19
+
+14-July-2010 Ian MacLennan
+ + [#21404] New installation language bs-BA
+ + [#20984] New installation language ta-IN 
+
+14-July-2010 Louis Landry
+ + [#21416] Mootools 1.2.4 Upgrade Plugin
+
+02-June-2010 Sam Moffat
+ ! Line ending fix for some XML/HTML files
+
 -------------------- 1.5.18 Stable Release [27-May-2010] ------------------
 
 25-May-2010 Ian MacLennan
diff -aruN --binary 18/components/com_contact/metadata.xml 20/components/com_contact/metadata.xml
--- 18/components/com_contact/metadata.xml	2009-05-29 14:53:02.000000000 +0200
+++ 20/components/com_contact/metadata.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Id: metadata.xml 8178 2007-07-23 05:39:47Z eddieajau $ -->
-<metadata>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+<!-- $Id: metadata.xml 17437 2010-06-01 14:35:04Z pasamio $ -->
+<metadata>
+</metadata>
diff -aruN --binary 18/components/com_contact/views/category/view.html.php 20/components/com_contact/views/category/view.html.php
--- 18/components/com_contact/views/category/view.html.php	2010-04-23 13:40:12.000000000 +0200
+++ 20/components/com_contact/views/category/view.html.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: view.html.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: view.html.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla
  * @subpackage	Contact
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -45,6 +45,11 @@
 
 		$limit = $mainframe->getUserStateFromRequest('com_contact.'.$this->getLayout().'.limit', 'limit', $default_limit, 'int');
 
+		// sanitize $orderBy
+		if (!in_array($filter_order, array('cd.ordering', 'cd.name', 'cd.con_position'))) {
+			$filter_order = 'cd.ordering';
+		}
+
 		// query options
 		$options['aid'] 		= $user->get('aid', 0);
 		$options['category_id']	= $categoryId;
diff -aruN --binary 18/components/com_contact/views/contact/tmpl/default.xml 20/components/com_contact/views/contact/tmpl/default.xml
--- 18/components/com_contact/views/contact/tmpl/default.xml	2009-05-29 14:53:02.000000000 +0200
+++ 20/components/com_contact/views/contact/tmpl/default.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- $Id: default.xml 8178 2007-07-23 05:39:47Z eddieajau $ -->
-<metadata>
-	<layout title="Standard Contact Layout">
-		<message>
-			<![CDATA[STANDARD CONTACT LAYOUT DESC]]>
-		</message>
-	</layout>
-	<state>
-		<name>Standard Contact Layout</name>
-		<description>STANDARD CONTACT LAYOUT DESC</description>
-		<url addpath="/administrator/components/com_contact/elements">
-			<param name="id" type="contact" default="" label="Select Contact" description="The contact to link to" />
-		</url>
-		<params>
-			<param name="show_contact_list" type="radio" default="0" label="Drop Down" description="PARAMDROPDOWN">
-				<option value="0">Hide</option>
-				<option value="1">Show</option>
-			</param>
-			<param name="show_category_crumb" type="radio" default="0" label="Show Category in Breadcrumbs" description="Show/Hide the category in the breadcrumbs">
-				<option value="0">Hide</option>
-				<option value="1">Show</option>
-			</param>
-		</params>
-	</state>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+<!-- $Id: default.xml 17437 2010-06-01 14:35:04Z pasamio $ -->
+<metadata>
+	<layout title="Standard Contact Layout">
+		<message>
+			<![CDATA[STANDARD CONTACT LAYOUT DESC]]>
+		</message>
+	</layout>
+	<state>
+		<name>Standard Contact Layout</name>
+		<description>STANDARD CONTACT LAYOUT DESC</description>
+		<url addpath="/administrator/components/com_contact/elements">
+			<param name="id" type="contact" default="" label="Select Contact" description="The contact to link to" />
+		</url>
+		<params>
+			<param name="show_contact_list" type="radio" default="0" label="Drop Down" description="PARAMDROPDOWN">
+				<option value="0">Hide</option>
+				<option value="1">Show</option>
+			</param>
+			<param name="show_category_crumb" type="radio" default="0" label="Show Category in Breadcrumbs" description="Show/Hide the category in the breadcrumbs">
+				<option value="0">Hide</option>
+				<option value="1">Show</option>
+			</param>
+		</params>
+	</state>
+</metadata>
diff -aruN --binary 18/components/com_content/views/article/tmpl/default.xml 20/components/com_content/views/article/tmpl/default.xml
--- 18/components/com_content/views/article/tmpl/default.xml	2009-05-29 14:52:58.000000000 +0200
+++ 20/components/com_content/views/article/tmpl/default.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8"?>
-<metadata>
-	<layout title="Standard Article Layout">
-		<message>
-			<![CDATA[STANDARD ARTICLE LAYOUT DESC]]>
-		</message>
-	</layout>
-	<state>
-		<name>Standard Article Layout</name>
-		<description>STANDARD ARTICLE LAYOUT DESC</description>
+<?xml version="1.0" encoding="utf-8"?>
+<metadata>
+	<layout title="Standard Article Layout">
+		<message>
+			<![CDATA[STANDARD ARTICLE LAYOUT DESC]]>
+		</message>
+	</layout>
+	<state>
+		<name>Standard Article Layout</name>
+		<description>STANDARD ARTICLE LAYOUT DESC</description>
 		<url addpath="/administrator/components/com_content/elements">
 			<param name="id" type="article" default="0" label="Select Article" description="An article" />
 		</url>
 		<params>
-		</params>
-	</state>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+		</params>
+	</state>
+</metadata>
diff -aruN --binary 18/components/com_content/views/article/tmpl/form.xml 20/components/com_content/views/article/tmpl/form.xml
--- 18/components/com_content/views/article/tmpl/form.xml	2009-05-29 14:52:58.000000000 +0200
+++ 20/components/com_content/views/article/tmpl/form.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
-<metadata>
-	<layout title="Article Submission Layout">
-		<message>
-			<![CDATA[ARTICLE SUBMISSION LAYOUT DESC]]>
-		</message>
-	</layout>
-	<state>
-		<name>Article Submission Layout</name>
-		<description>ARTICLE SUBMISSION LAYOUT DESC</description>
+<?xml version="1.0" encoding="utf-8"?>
+<metadata>
+	<layout title="Article Submission Layout">
+		<message>
+			<![CDATA[ARTICLE SUBMISSION LAYOUT DESC]]>
+		</message>
+	</layout>
+	<state>
+		<name>Article Submission Layout</name>
+		<description>ARTICLE SUBMISSION LAYOUT DESC</description>
 		<params>
-		</params>
-	</state>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+		</params>
+	</state>
+</metadata>
diff -aruN --binary 18/components/com_user/views/login/tmpl/default.xml 20/components/com_user/views/login/tmpl/default.xml
--- 18/components/com_user/views/login/tmpl/default.xml	2009-05-29 14:53:04.000000000 +0200
+++ 20/components/com_user/views/login/tmpl/default.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="utf-8"?>
-<metadata>
-	<layout title="DEFAULT LOGIN LAYOUT">
-		<message>
-			<![CDATA[DEFAULT LOGIN LAYOUT DESC]]>
-		</message>
-	</layout>
-	<state>
-		<name>Default Login Layout</name>
+<?xml version="1.0" encoding="utf-8"?>
+<metadata>
+	<layout title="DEFAULT LOGIN LAYOUT">
+		<message>
+			<![CDATA[DEFAULT LOGIN LAYOUT DESC]]>
+		</message>
+	</layout>
+	<state>
+		<name>Default Login Layout</name>
 		<description>DEFAULT LOGIN LAYOUT DESC</description>
 		<params>
 			<param name="show_login_title" type="radio" default="1" label="Show Login Page Title" description="Show/Hide the Login Page Title">
@@ -50,6 +50,6 @@
 				<option value="left">Left</option>
 				<option value="right">Right</option>
 			</param>
-		</params>
-	</state>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+		</params>
+	</state>
+</metadata>
diff -aruN --binary 18/components/com_weblinks/views/weblink/tmpl/form.xml 20/components/com_weblinks/views/weblink/tmpl/form.xml
--- 18/components/com_weblinks/views/weblink/tmpl/form.xml	2009-05-29 14:53:08.000000000 +0200
+++ 20/components/com_weblinks/views/weblink/tmpl/form.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
-<metadata>
-	<layout title="WEBLINK SUBMISSION LAYOUT">
-		<message>
-			<![CDATA[WEBLINK SUBMISSION LAYOUT DESC]]>
-		</message>
-	</layout>
-	<state>
-		<name>WEBLINK SUBMISSION LAYOUT</name>
-		<description>WEBLINK SUBMISSION LAYOUT DESC</description>
+<?xml version="1.0" encoding="utf-8"?>
+<metadata>
+	<layout title="WEBLINK SUBMISSION LAYOUT">
+		<message>
+			<![CDATA[WEBLINK SUBMISSION LAYOUT DESC]]>
+		</message>
+	</layout>
+	<state>
+		<name>WEBLINK SUBMISSION LAYOUT</name>
+		<description>WEBLINK SUBMISSION LAYOUT DESC</description>
 		<params>
-		</params>
-	</state>
-</metadata>
\ No hay ningún carácter de nueva línea al final del fichero
+		</params>
+	</state>
+</metadata>
diff -aruN --binary 18/CREDITS.php 20/CREDITS.php
--- 18/CREDITS.php	2010-04-23 13:40:10.000000000 +0200
+++ 20/CREDITS.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: CREDITS.php 16380 2010-04-23 09:19:48Z ian $
+ * @version		$Id: CREDITS.php 18151 2010-07-15 09:33:47Z dextercowley $
  * @package		Joomla
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
  * @license		GNU/GPL, see LICENSE.php
@@ -72,6 +72,7 @@
 Basque (eu-ES) - Basque Translation Team (Basque Language School of Santurtzi) - Abel Camacho, Pedro Lonbide
 Belarusian (be-BY) - Dennis Hermacki
 Bengali (bn-BD) – Kamal Sikder
+Bosnian (bs-BA) - Bosnian Translation Team - Admir Agic
 Bulgarian (bg-BG) - Bulgarian Translation Team - Bultrans
 Catalan (ca-ES) - Catalan Translation Team - Damià Verger
 Chinese Simplified (zh-CN) - Johnathan Cheung
@@ -121,6 +122,7 @@
 Syriac (sy-IQ) - East Syriac Translation (Syriac Joomla) - Pauls Dinka
 Tagalog (Philippines) (tl-PH) - Tagalog (Philippines) Translation Community - Aristedes Royo
 Tamil (ta-LK) - Sri Lanka -UoM, LK, sarves
+Tamil (ta-IN) - Ilagnayeru 'MIG' Manickam, Elango Samy Manim
 Thai (th-TH) - Joomla LaiThai Team (JoomlaCorner) - Akarawuth Tamrareang , Supachai Teasakul, Pisan Chueachatchai
 Turkish (tr-TR) - Joomla! Turkiye - Ümit Kenan Gönüllü
 Ukrainian (uk-UA) - Ukrainian Translation Team - Denys Nosov
diff -aruN --binary 18/includes/framework.php 20/includes/framework.php
--- 18/includes/framework.php	2010-05-28 03:28:56.000000000 +0200
+++ 20/includes/framework.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version		$Id: framework.php 17262 2010-05-25 15:11:15Z ian $
+* @version		$Id: framework.php 18172 2010-07-17 19:46:57Z ian $
 * @package		Joomla
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
diff -aruN --binary 18/libraries/joomla/database/table/menutypes.php 20/libraries/joomla/database/table/menutypes.php
--- 18/libraries/joomla/database/table/menutypes.php	2010-04-23 13:40:18.000000000 +0200
+++ 20/libraries/joomla/database/table/menutypes.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: menutypes.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: menutypes.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla.Framework
  * @subpackage	Table
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -49,17 +49,8 @@
 	 */
 	function check()
 	{
-		
-		$this->menutype = str_replace('-', ' ', $this->menutype);
-
-		$lang =& JFactory::getLanguage();
-		$this->menutype = $lang->transliterate($this->menutype);
-
-		$this->menutype = preg_replace(array('/\s+/','/[^A-Za-z0-9\-\_]/'), array('-',''), $this->menutype);
-
-		$this->menutype = trim(strtolower($this->menutype));
-		
-		if(empty($this->menutype)) {
+		$this->menutype = JFilterInput::clean($this->menutype, 'menutype');
+		if (empty($this->menutype)) {
 			$this->setError( "Cannot save: Empty menu type" );
 			return false;
 		}
diff -aruN --binary 18/libraries/joomla/filter/filterinput.php 20/libraries/joomla/filter/filterinput.php
--- 18/libraries/joomla/filter/filterinput.php	2010-04-23 13:40:18.000000000 +0200
+++ 20/libraries/joomla/filter/filterinput.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: filterinput.php 14401 2010-01-26 14:10:00Z louis $
+ * @version		$Id: filterinput.php 18162 2010-07-16 07:00:47Z ian $
  * @package		Joomla.Framework
  * @subpackage	Filter
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
@@ -169,6 +169,17 @@
 			case 'USERNAME' :
 				$result = (string) preg_replace( '/[\x00-\x1F\x7F<>"\'%&]/', '', $source );
 				break;
+				
+			case 'MENUTYPE':
+				$result = str_replace('-', ' ', $source);
+				$lang = &JFactory::getLanguage();
+				$result = $lang->transliterate($result);
+				$result = (string) preg_replace(
+					array('/\s+/','/[^A-Za-z0-9\-\_]/'), array('-',''), $result
+				);
+				$result = strtolower(trim($result));
+				break;
+
 
 			default :
 				// Check for static usage and assign $filter the proper variable
diff -aruN --binary 18/libraries/joomla/version.php 20/libraries/joomla/version.php
--- 18/libraries/joomla/version.php	2010-05-28 03:28:56.000000000 +0200
+++ 20/libraries/joomla/version.php	2010-07-18 05:15:44.000000000 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version		$Id: version.php 17299 2010-05-27 16:06:54Z ian $
+ * @version		$Id: version.php 18172 2010-07-17 19:46:57Z ian $
  * @package	Joomla.Framework
  * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
  * @license		GNU/GPL, see LICENSE.php
@@ -26,13 +26,13 @@
 	/** @var string Development Status */
 	var $DEV_STATUS = 'Stable';
 	/** @var int Sub Release Level */
-	var $DEV_LEVEL 	= '18';
+	var $DEV_LEVEL 	= '20';
 	/** @var int build Number */
 	var $BUILD	= '';
 	/** @var string Codename */
-	var $CODENAME 	= 'wojmamni ama wojnaiki';
+	var $CODENAME 	= 'senu takaa';
 	/** @var string Date */
-	var $RELDATE 	= '27-May-2010';
+	var $RELDATE 	= '18-July-2010';
 	/** @var string Time */
 	var $RELTIME 	= '18:00';
 	/** @var string Timezone */
diff -aruN --binary 18/media/system/js/modal.js 20/media/system/js/modal.js
--- 18/media/system/js/modal.js	2009-05-29 14:50:40.000000000 +0200
+++ 20/media/system/js/modal.js	2010-07-18 05:15:44.000000000 +0200
@@ -368,6 +368,6 @@
 	extend: $extend
 };
 
-SqueezeBox.extend(Events.prototype);
-SqueezeBox.extend(Options.prototype);
-SqueezeBox.extend(Chain.prototype);
\ No hay ningún carácter de nueva línea al final del fichero
+SqueezeBox.extend(SqueezeBox, Events.prototype);
+SqueezeBox.extend(SqueezeBox, Options.prototype);
+SqueezeBox.extend(SqueezeBox, Chain.prototype);
\ No hay ningún carácter de nueva línea al final del fichero
diff -aruN --binary 18/modules/mod_sections/mod_sections.xml 20/modules/mod_sections/mod_sections.xml
--- 18/modules/mod_sections/mod_sections.xml	2010-04-23 13:40:18.000000000 +0200
+++ 20/modules/mod_sections/mod_sections.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<install type="module" version="1.5.0">
-	<name>Sections</name>
-	<author>Joomla! Project</author>
-	<creationDate>July 2006</creationDate>
-	<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
-	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
-	<authorEmail>admin@joomla.org</authorEmail>
-	<authorUrl>www.joomla.org</authorUrl>
-	<version>1.5.0</version>
-	<description>DESCSECTIONS</description>
-	<files>
-	<filename module="mod_sections">mod_sections.php</filename>
-	</files>
-	<params>
-		<param name="count" type="text" default="5" label="Count" description="The number of items to display (default is 5)" />
-		<param name="@spacer" type="spacer" default="" label="" description="" />
+<?xml version="1.0" encoding="utf-8"?>
+<install type="module" version="1.5.0">
+	<name>Sections</name>
+	<author>Joomla! Project</author>
+	<creationDate>July 2006</creationDate>
+	<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
+	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
+	<authorEmail>admin@joomla.org</authorEmail>
+	<authorUrl>www.joomla.org</authorUrl>
+	<version>1.5.0</version>
+	<description>DESCSECTIONS</description>
+	<files>
+	<filename module="mod_sections">mod_sections.php</filename>
+	</files>
+	<params>
+		<param name="count" type="text" default="5" label="Count" description="The number of items to display (default is 5)" />
+		<param name="@spacer" type="spacer" default="" label="" description="" />
 		<param name="moduleclass_sfx" type="text" default="" label="Module Class Suffix" description="PARAMMODULECLASSSUFFIX" />
-	</params>
-	<params group="advanced">
-		<param name="cache" type="list" default="0" label="Caching" description="Select whether to cache the content of this module">
-			<option value="1">Use global</option>
-			<option value="0">No caching</option>
-		</param>
-		<param name="cache_time" type="text" default="900" label="Cache Time" description="The time before the module is recached" />
-	</params>
-</install>
+	</params>
+	<params group="advanced">
+		<param name="cache" type="list" default="0" label="Caching" description="Select whether to cache the content of this module">
+			<option value="1">Use global</option>
+			<option value="0">No caching</option>
+		</param>
+		<param name="cache_time" type="text" default="900" label="Cache Time" description="The time before the module is recached" />
+	</params>
+</install>
diff -aruN --binary 18/plugins/authentication/openid.xml 20/plugins/authentication/openid.xml
--- 18/plugins/authentication/openid.xml	2010-04-23 13:40:20.000000000 +0200
+++ 20/plugins/authentication/openid.xml	2010-07-18 05:15:44.000000000 +0200
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8"?>
-<install version="1.5" type="plugin"  group="authentication">
-	<name>Authentication - OpenID</name>
-	<author>Joomla! Project</author>
-	<creationDate>February 2006</creationDate>
-	<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
-	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
-	<authorEmail>admin@joomla.org</authorEmail>
-	<authorUrl>www.joomla.org</authorUrl>
-	<version>1.5</version>
-	<description>Handles user authentication with an OpenID (Requires PHP5)</description>
-	<files>
-		<filename plugin="openid">openid.php</filename>
-	</files>
+<?xml version="1.0" encoding="utf-8"?>
+<install version="1.5" type="plugin"  group="authentication">
+	<name>Authentication - OpenID</name>
+	<author>Joomla! Project</author>
+	<creationDate>February 2006</creationDate>
+	<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
+	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
+	<authorEmail>admin@joomla.org</authorEmail>
+	<authorUrl>www.joomla.org</authorUrl>
+	<version>1.5</version>
+	<description>Handles user authentication with an OpenID (Requires PHP5)</description>
+	<files>
+		<filename plugin="openid">openid.php</filename>
+	</files>
 	<params>
 		<param name="usermode" type="radio" default="2" label="Convert old usernames" description="OPENID_USERMODE_DESC">
 			<option value="2">Yes</option>
@@ -20,12 +20,12 @@
 		<param name="phishing-resistant" type="radio" default="0" label="Require Policy phishing resistant" description="PHISHING_RESISTANT_DESC">
 			<option value="1">Yes</option>
 			<option value="0">No</option>
-		</param>
-		<param name="multi-factor" type="radio" default="0" label="Require Policy multi factor" description="MULTI_FACTOR_DESC">
+		</param>
+		<param name="multi-factor" type="radio" default="0" label="Require Policy multi factor" description="MULTI_FACTOR_DESC">
 			<option value="1">Yes</option>
 			<option value="0">No</option>
 		</param>
-		<param name="multi-factor-physical" type="radio" default="0" label="Require Policy multi factor physical" description="MULTI_FACTOR_PHYSICAL_DESC">
+		<param name="multi-factor-physical" type="radio" default="0" label="Require Policy multi factor physical" description="MULTI_FACTOR_PHYSICAL_DESC">
 			<option value="1">Yes</option>
 			<option value="0">No</option>
 		</param>
diff -aruN --binary 18/plugins/system/mtupgrade/behavior.php 20/plugins/system/mtupgrade/behavior.php
--- 18/plugins/system/mtupgrade/behavior.php	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade/behavior.php	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1,604 @@
+<?php
+/**
+* @version		$Id: behavior.php 18130 2010-07-14 11:21:35Z louis $
+* @package		Joomla.Framework
+* @subpackage	HTML
+* @copyright	Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
+* @license		GNU/GPL, see LICENSE.php
+*
+* Joomla! is free software. This version may have been modified pursuant
+* to the GNU General Public License, and as distributed it includes or
+* is derivative of works licensed under the GNU General Public License or
+* other free or open source software licenses.
+* See COPYRIGHT.php for copyright notices and details.
+*/
+
+defined('JPATH_BASE') or die();
+
+/**
+ * JHTML helper class for loading JavaScript behaviors into the document head.  This version is
+ * designed to load MooTools version 1.2 plus the 1.1 compatibility layer.
+ *
+ * @package     Joomla.Framework
+ * @subpackage  HTML
+ *
+ * @since       1.5.19
+ * @static
+ */
+class JHTMLBehavior
+{
+	/**
+	 * Method to load the mootools framework and compatibility layer into the document head.  If the
+	 * optional debug flag is set then a uncompressed version of the files will be loaded.
+	 *
+	 * @param   boolean  $debug  True to enable debugging mode.  If no value is set the value will
+	 *                           be taken from the application configuration settings.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function mootools($debug = null)
+	{
+		// Check to see if it has already been loaded.
+		static $loaded;
+		if (!empty($loaded)) {
+			return;
+		}
+
+		// If no debugging value is set, use the setting from  the application configuration.
+		if ($debug === null) {
+			$debug = JFactory::getConfig()->getValue('config.debug');
+		}
+
+		/*
+		 * Note: Konqueror browser check.
+		 *  - If they fix thier issue with compressed javascript we can remove this.
+		 */
+		$kcheck = isset($_SERVER['HTTP_USER_AGENT']) ? strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'konqueror') : null;
+
+		// If the debugging flag is set or the browser is Konqueror use the uncompressed file.
+		if ($debug || $kcheck) {
+			JHTML::script('mootools-uncompressed.js', 'plugins/system/mtupgrade/', false);
+		}
+		else {
+			JHTML::script('mootools.js', 'plugins/system/mtupgrade/', false);
+		}
+
+		// Set the MooTools version string in the application object.
+		JFactory::getApplication()->set('MooToolsVersion', '1.2.4 +Compat');
+
+		// Ensure the files aren't loaded more than once.
+		$loaded = true;
+	}
+
+	/**
+	 * Method to load the system caption behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function caption()
+	{
+		JHTML::script('caption.js');
+	}
+
+	/**
+	 * Method to load the system form validation behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function formvalidation()
+	{
+		JHTML::script('validate.js');
+	}
+
+	/**
+	 * Method to load the system container switcher behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function switcher()
+	{
+		JHTML::script('switcher.js');
+	}
+
+	/**
+	 * Method to load the system combobox behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function combobox()
+	{
+		JHTML::script('combobox.js');
+	}
+
+	/**
+	 * Method to load the system tooltips behavior.  Because the tooltips class and interface has
+	 * changed between Mootools 1.2 and 1.1, we are including our 1.2 version and making it to work
+	 * in the same way as the old one.
+	 *
+	 * @param   string  $selector  The CSS selector for elements to apply the behavior.
+	 * @param   array   $params    The array of options to use for the behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function tooltip($selector='.hasTip', $params = array())
+	{
+		// Setup the static array of tooltip instance options.
+		static $instances;
+		if (!isset($instances)) {
+			$instances = array();
+		}
+
+		// Generate the behavior/option signature and check to see if it has already been loaded.
+		$sig = md5(serialize(array($selector,$params)));
+		if (!empty($instances[$sig])) {
+			return;
+		}
+
+		// Load the Mootools framework.
+		JHTMLBehavior::mootools();
+
+		// Setup the options object.
+		$opt['maxTitleChars']	= (isset($params['maxTitleChars']) && ($params['maxTitleChars'])) ? (int)$params['maxTitleChars'] : 50 ;
+		$opt['showDelay']		= (isset($params['showDelay'])) ? (int)$params['showDelay'] : null;
+		$opt['hideDelay']		= (isset($params['hideDelay'])) ? (int)$params['hideDelay'] : null;
+		$opt['className']		= (isset($params['className'])) ? $params['className'] : null;
+		$opt['fixed']			= (isset($params['fixed']) && ($params['fixed'])) ? '\\true' : '\\false';
+
+		// Optional event handler methods.
+		$opt['onShow']			= (isset($params['onShow'])) ? '\\'.$params['onShow'] : null;
+		$opt['onHide']			= (isset($params['onHide'])) ? '\\'.$params['onHide'] : null;
+
+		// Offsets needs an array in the format: array('x'=>20, 'y'=>30).
+		$opt['offsets']			= (isset($params['offsets']) && (is_array($params['offsets']))) ? $params['offsets'] : null;
+
+		// Build the script.
+		$script = array(
+			'window.addEvent("domready", function() {',
+			'	var JTooltips = new Tips($$("'.$selector.'"), '.JHTMLBehavior::_getJSObject($opt).');',
+			'});'
+		);
+
+		// Load the script into the document head.
+		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
+
+		// Ensure the same instance isn't loaded more than once.
+		$instances[$sig] = true;
+	}
+
+	/**
+	 * Method to load the system modal behavior.
+	 *
+	 * @param   string  $selector  The CSS selector for elements to apply the behavior.
+	 * @param   array   $params    The array of options to use for the behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function modal($selector='a.modal', $params = array())
+	{
+		// Setup the static array of modal instance options.
+		static $instances;
+		if (!isset($instances)) {
+			$instances = array();
+		}
+
+		// Generate the behavior/option signature and check to see if it has already been loaded.
+		$sig = md5(serialize(array($selector,$params)));
+		if (!empty($instances[$sig])) {
+			return;
+		}
+
+		// Load the behavior and stylesheet files into the document head.
+		JHTML::script('modal.js');
+		JHTML::stylesheet('modal.css');
+
+		// Setup the options object.
+		$opt['ajaxOptions']	= (isset($params['ajaxOptions']) && (is_array($params['ajaxOptions']))) ? $params['ajaxOptions'] : null;
+		$opt['size']		= (isset($params['size']) && (is_array($params['size']))) ? $params['size'] : null;
+
+		// Optional event handler methods.
+		$opt['onOpen']		= (isset($params['onOpen'])) ? $params['onOpen'] : null;
+		$opt['onClose']		= (isset($params['onClose'])) ? $params['onClose'] : null;
+		$opt['onUpdate']	= (isset($params['onUpdate'])) ? $params['onUpdate'] : null;
+		$opt['onResize']	= (isset($params['onResize'])) ? $params['onResize'] : null;
+		$opt['onMove']		= (isset($params['onMove'])) ? $params['onMove'] : null;
+		$opt['onShow']		= (isset($params['onShow'])) ? $params['onShow'] : null;
+		$opt['onHide']		= (isset($params['onHide'])) ? $params['onHide'] : null;
+
+		// Build the script.
+		$script = array(
+			'window.addEvent("domready", function() {',
+			'	SqueezeBox.initialize('.JHTMLBehavior::_getJSObject($opt).');',
+			'	$$("'.$selector.'").each(function(el) {',
+			'		el.addEvent("click", function(e) {',
+			'			new Event(e).stop();',
+			'			SqueezeBox.fromElement(el);',
+			'		});',
+			'	});',
+			'});'
+		);
+
+		// Load the script into the document head.
+		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
+
+		// Ensure the same instance isn't loaded more than once.
+		$instances[$sig] = true;
+	}
+
+	/**
+	 * Method to load the system file uploader behavior.
+	 *
+	 * @param   string  $id      The DOM node id for the element to apply the behavior.
+	 * @param   array   $params  The array of options to use for the behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function uploader($id='file-upload', $params = array())
+	{
+		// Setup the static array of behavior instances.
+		static $instances;
+		if (!isset($instances)) {
+			$instances = array();
+		}
+
+		// Check to see if it has already been loaded.
+		if (!empty($instances[$id])) {
+			return;
+		}
+
+		// Load the behavior files into the document head.
+		JHTML::script('swf.js');
+		JHTML::script('uploader.js');
+
+		// Setup the options object.
+		$opt['url']					= (isset($params['targetURL'])) ? $params['targetURL'] : null ;
+		$opt['swf']					= (isset($params['swf'])) ? $params['swf'] : JURI::root(true).'/media/system/swf/uploader.swf';
+		$opt['multiple']			= (isset($params['multiple']) && !($params['multiple'])) ? '\\false' : '\\true';
+		$opt['queued']				= (isset($params['queued']) && !($params['queued'])) ? '\\false' : '\\true';
+		$opt['queueList']			= (isset($params['queueList'])) ? $params['queueList'] : 'upload-queue';
+		$opt['instantStart']		= (isset($params['instantStart']) && ($params['instantStart'])) ? '\\true' : '\\false';
+		$opt['allowDuplicates']		= (isset($params['allowDuplicates']) && !($params['allowDuplicates'])) ? '\\false' : '\\true';
+		$opt['limitSize']			= (isset($params['limitSize']) && ($params['limitSize'])) ? (int)$params['limitSize'] : null;
+		$opt['limitFiles']			= (isset($params['limitFiles']) && ($params['limitFiles'])) ? (int)$params['limitFiles'] : null;
+		$opt['optionFxDuration']	= (isset($params['optionFxDuration'])) ? (int)$params['optionFxDuration'] : null;
+		$opt['container']			= (isset($params['container'])) ? '\\$('.$params['container'].')' : '\\$(\''.$id.'\').getParent()';
+
+		// JSON object with ('description': 'extension') pairs. eg. (default: Images (*.jpg; *.jpeg; *.gif; *.png));
+		$opt['types']				= (isset($params['types'])) ?'\\'.$params['types'] : '\\{\'All Files (*.*)\': \'*.*\'}';
+
+		// Optional functions.
+		$opt['createReplacement']	= (isset($params['createReplacement'])) ? '\\'.$params['createReplacement'] : null;
+		$opt['onComplete']			= (isset($params['onComplete'])) ? '\\'.$params['onComplete'] : null;
+		$opt['onAllComplete']		= (isset($params['onAllComplete'])) ? '\\'.$params['onAllComplete'] : null;
+
+		// Build the script.
+		$script = array(
+			'sBrowseCaption="'.JText::_('Browse Files', true).'";',
+			'sRemoveToolTip="'.JText::_('Remove from queue', true).'";',
+			'',
+			'window.addEvent("load", function() {',
+			'	var Uploader = new FancyUpload($("'.$id.'"), '.JHTMLBehavior::_getJSObject($opt).');',
+			'	$("upload-clear").adopt(new Element("input", {type: "button", events: { click: Uploader.clearList.bind(Uploader, [false])}, value: "'.JText::_('Clear Completed').'" }));',
+			'});'
+		);
+
+		// Load the script into the document head.
+		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
+
+		// Ensure the same instance isn't loaded more than once.
+		$instances[$id] = true;
+	}
+
+	/**
+	 * Method to load the system tree behavior.
+	 *
+	 * @param   string  $id      The DOM node id for the element to apply the behavior.
+	 * @param   array   $params  The array of options to use for the behavior.
+	 * @param   array   $root    The array of root node options.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function tree($id, $params = array(), $root = array())
+	{
+		// Setup the static array of behavior instances.
+		static $instances;
+		if (!isset($instances)) {
+			$instances = array();
+		}
+
+		// Check to see if it has already been loaded.
+		if (!empty($instances[$id])) {
+			return;
+		}
+
+		// Load the behavior and stylesheet files into the document head.
+		JHTML::script('mootree.js');
+		JHTML::stylesheet('mootree.css');
+
+		// Setup the options object.
+		$opt['div']		= (isset($params['div'])) ? $params['div'] : $id.'_tree';
+		$opt['mode']	= (isset($params['mode'])) ? $params['mode'] : 'folders';
+		$opt['grid']	= (isset($params['grid'])) ? '\\'.$params['grid'] : '\\true';
+		$opt['theme']	= (isset($params['theme'])) ? $params['theme'] : JURI::root(true).'/media/system/images/mootree.gif';
+
+		// Optional event handler methods.
+		$opt['onExpand']	= (isset($params['onExpand'])) ? '\\'.$params['onExpand'] : null;
+		$opt['onSelect']	= (isset($params['onSelect'])) ? '\\'.$params['onSelect'] : null;
+		$opt['onClick']		= (isset($params['onClick'])) ? '\\'.$params['onClick'] : '\\function(node){  window.open(node.data.url, $chk(node.data.target) ? node.data.target : \'_self\'); }';
+
+		// Setup the root node options.
+		$rt['text']		= (isset($root['text'])) ? $root['text'] : 'Root';
+		$rt['id']		= (isset($root['id'])) ? $root['id'] : null;
+		$rt['color']	= (isset($root['color'])) ? $root['color'] : null;
+		$rt['open']		= (isset($root['open'])) ? '\\'.$root['open'] : '\\true';
+		$rt['icon']		= (isset($root['icon'])) ? $root['icon'] : null;
+		$rt['openicon']	= (isset($root['openicon'])) ? $root['openicon'] : null;
+		$rt['data']		= (isset($root['data'])) ? $root['data'] : null;
+
+		// Get the optional name of the tree.
+		$name = (isset($params['treeName'])) ? $params['treeName'] : '';
+
+		// Build the script.
+		$script = array(
+			'window.addEvent(\'domready\', function(){',
+			'	tree'.$name.' = new MooTreeControl('.JHTMLBehavior::_getJSObject($opt).','.JHTMLBehavior::_getJSObject($rt).');',
+			'	tree'.$name.'.adopt(\''.$id.'\');',
+			'})'
+		);
+
+		// Load the script into the document head.
+		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
+
+		// Ensure the same instance isn't loaded more than once.
+		$instances[$id] = true;
+	}
+
+	/**
+	 * Method to load the system calendar behavior.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function calendar()
+	{
+		// Load the behavior and stylesheet files into the document head.
+		JHTML::stylesheet('calendar-jos.css', 'media/system/css/', array(' title' => JText::_('green') ,' media' => 'all'));
+		JHTML::script('calendar.js');
+		JHTML::script('calendar-setup.js');
+
+		// Get and load the calendar translation string into the document head.
+		if ($translation = JHTMLBehavior::_calendartranslation()) {
+			JFactory::getDocument()->addScriptDeclaration($translation);
+		}
+	}
+
+	/**
+	 * Method to load the system keepalive behavior.  This will send an ascynchronous request to the
+	 * server via AJAX on an interval just under the session expiration lifetime so that the session
+	 * does not expire.
+	 *
+	 * @return  void
+	 *
+	 * @since   1.5.19
+	 * @static
+	 */
+	function keepalive()
+	{
+		// Load the behavior framework into the document head.
+		JHTMLBehavior::mootools();
+
+		// Get the session lifetime in microseconds.
+		$lifetime = (JFactory::getConfig()->getValue('lifetime', 900) * 60000);
+
+		// Set the session refresh period to one minute less than the session lifetime.
+		$refreshTime = (int) ($lifetime <= 60000) ? 30000 : $lifetime - 60000;
+
+		// Build the keepalive script.
+		$script = array(
+			'function keepAlive() { new Ajax("index.php", {method: "get"}).request(); }',
+			'window.addEvent("domready", function() { keepAlive.periodical('.$refreshTime.'); });'
+		);
+
+		// Load the keepalive script into the document head.
+		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
+	}
+
+	/**
+	 * Method to get a simple JavaScript Object Notation (JSON) representation of an input
+	 * associative array.
+	 *
+	 * @param   array   $array  The array to convert to JavaScript Object Notation.
+	 *
+	 * @return  string  JavaScript Object Notation representation of the array.
+	 *
+	 * @access  protected
+	 * @since   1.5.19
+	 * @static
+	 */
+	function _getJSObject($array = array())
+	{
+		// Initialize variables
+		$json = '{';
+
+		// Iterate over array to build objects
+		foreach ((array)$array as $k => $v)
+		{
+			if (is_null($v)) {
+				continue;
+			}
+
+			if (!is_array($v) && !is_object($v)) {
+				$json .= ' '.$k.': ';
+				$json .= (is_numeric($v) || strpos($v, '\\') === 0) ? (is_numeric($v)) ? $v : substr($v, 1) : "'".$v."'";
+				$json .= ',';
+			}
+			else {
+				$json .= ' '.$k.': '.JHTMLBehavior::_getJSObject($v).',';
+			}
+		}
+
+		if (substr($json, -1) == ',') {
+			$json = substr($json, 0, -1);
+		}
+
+		$json .= '}';
+
+		return $json;
+	}
+
+	/**
+	 * Method to get the internationalisation script/settings for the JavaScript Calendar behavior.
+	 *
+	 * @return  mixed  JavaScript calendar internationalisation settings script or null if already loaded.
+	 *
+	 * @access  protected
+	 * @since   1.5.19
+	 * @static
+	 */
+	function _calendartranslation()
+	{
+		// Check to see if it has already been loaded.
+		static $loaded;
+		if (!empty($loaded)) {
+			return;
+		}
+
+		// Build the day names array.
+		$dayNames = array(
+			'"'.JText::_('Sunday').'"',
+			'"'.JText::_('Monday').'"',
+			'"'.JText::_('Tuesday').'"',
+			'"'.JText::_('Wednesday').'"',
+			'"'.JText::_('Thursday').'"',
+			'"'.JText::_('Friday').'"',
+			'"'.JText::_('Saturday').'"',
+			'"'.JText::_('Sunday').'"'
+		);
+
+		// Build the short day names array.
+		$shortDayNames = array(
+			'"'.JText::_('Sun').'"',
+			'"'.JText::_('Mon').'"',
+			'"'.JText::_('Tue').'"',
+			'"'.JText::_('Wed').'"',
+			'"'.JText::_('Thu').'"',
+			'"'.JText::_('Fri').'"',
+			'"'.JText::_('Sat').'"',
+			'"'.JText::_('Sun').'"'
+		);
+
+		// Build the month names array.
+		$monthNames = array(
+			'"'.JText::_('January').'"',
+			'"'.JText::_('February').'"',
+			'"'.JText::_('March').'"',
+			'"'.JText::_('April').'"',
+			'"'.JText::_('May').'"',
+			'"'.JText::_('June').'"',
+			'"'.JText::_('July').'"',
+			'"'.JText::_('August').'"',
+			'"'.JText::_('September').'"',
+			'"'.JText::_('October').'"',
+			'"'.JText::_('November').'"',
+			'"'.JText::_('December').'"'
+		);
+
+		// Build the short month names array.
+		$shortMonthNames = array(
+			'"'.JText::_('January_short').'"',
+			'"'.JText::_('February_short').'"',
+			'"'.JText::_('March_short').'"',
+			'"'.JText::_('April_short').'"',
+			'"'.JText::_('May_short').'"',
+			'"'.JText::_('June_short').'"',
+			'"'.JText::_('July_short').'"',
+			'"'.JText::_('August_short').'"',
+			'"'.JText::_('September_short').'"',
+			'"'.JText::_('October_short').'"',
+			'"'.JText::_('November_short').'"',
+			'"'.JText::_('December_short').'"'
+		);
+
+		// Build the script.
+		$i18n = array(
+			'// Calendar i18n Setup.',
+			'Calendar._FD = 0;',
+			'Calendar._DN = new Array ('.implode(', ', $dayNames).');',
+			'Calendar._SDN = new Array ('.implode(', ', $shortDayNames).');',
+			'Calendar._MN = new Array ('.implode(', ', $monthNames).');',
+			'Calendar._SMN = new Array ('.implode(', ', $shortMonthNames).');',
+			'',
+			'Calendar._TT = {};',
+			'Calendar._TT["INFO"] = "'.JText::_('About the calendar').'";',
+			'Calendar._TT["PREV_YEAR"] = "'.JText::_('Prev. year (hold for menu)').'";',
+			'Calendar._TT["PREV_MONTH"] = "'.JText::_('Prev. month (hold for menu)').'";',
+			'Calendar._TT["GO_TODAY"] = "'.JText::_('Go Today').'";',
+			'Calendar._TT["NEXT_MONTH"] = "'.JText::_('Next month (hold for menu)').'";',
+			'Calendar._TT["NEXT_YEAR"] = "'.JText::_('Next year (hold for menu)').'";',
+			'Calendar._TT["SEL_DATE"] = "'.JText::_('Select date').'";',
+			'Calendar._TT["DRAG_TO_MOVE"] = "'.JText::_('Drag to move').'";',
+			'Calendar._TT["PART_TODAY"] = "'.JText::_('(Today)').'";',
+			'Calendar._TT["DAY_FIRST"] = "'.JText::_('Display %s first').'";',
+			'Calendar._TT["WEEKEND"] = "0,6";',
+			'Calendar._TT["CLOSE"] = "'.JText::_('Close').'";',
+			'Calendar._TT["TODAY"] = "'.JText::_('Today').'";',
+			'Calendar._TT["TIME_PART"] = "'.JText::_('(Shift-)Click or drag to change value').'";',
+			'Calendar._TT["DEF_DATE_FORMAT"] = "'.JText::_('%Y-%m-%d').'";',
+			'Calendar._TT["TT_DATE_FORMAT"] = "'.JText::_('%a, %b %e').'";',
+			'Calendar._TT["WK"] = "'.JText::_('wk').'";',
+			'Calendar._TT["TIME"] = "'.JText::_('Time:').'";',
+			'',
+			'Calendar._TT["ABOUT"] =',
+			'"DHTML Date/Time Selector\n" +',
+			'"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" +',
+			'"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +',
+			'"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +',
+			'"\n\n" +',
+			'"Date selection:\n" +',
+			'"- Use the \xab, \xbb buttons to select year\n" +',
+			'"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +',
+			'"- Hold mouse button on any of the above buttons for faster selection.";',
+			'',
+			'Calendar._TT["ABOUT_TIME"] = "\n\n" +',
+			'"Time selection:\n" +',
+			'"- Click on any of the time parts to increase it\n" +',
+			'"- or Shift-click to decrease it\n" +',
+			'"- or click and drag for faster selection.";',
+			''
+		);
+
+		// Ensure the i18n data isn't loaded more than once.
+		$loaded = true;
+
+		return implode("\n", $i18n);
+	}
+}
+
diff -aruN --binary 18/plugins/system/mtupgrade/index.html 20/plugins/system/mtupgrade/index.html
--- 18/plugins/system/mtupgrade/index.html	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade/index.html	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1 @@
+<html><body bgcolor="#FFFFFF"></body></html>
\ No hay ningún carácter de nueva línea al final del fichero
diff -aruN --binary 18/plugins/system/mtupgrade/mootools.js 20/plugins/system/mtupgrade/mootools.js
--- 18/plugins/system/mtupgrade/mootools.js	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade/mootools.js	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1 @@
+var MooTools={version:"1.2.4",build:"0d9113241a90b9cd5643b926795852a2026710d4"};var Native=function(k){k=k||{};var a=k.name;var i=k.legacy;var b=k.protect;var c=k.implement;var h=k.generics;var f=k.initialize;var g=k.afterImplement||function(){};var d=f||i;h=h!==false;d.constructor=Native;d.$family={name:"native"};if(i&&f){d.prototype=i.prototype}d.prototype.constructor=d;if(a){var e=a.toLowerCase();d.prototype.$family={name:e};Native.typize(d,e)}var j=function(n,l,o,m){if(!b||m||!n.prototype[l]){n.prototype[l]=o}if(h){Native.genericize(n,l,b)}g.call(n,l,o);return n};d.alias=function(n,l,p){if(typeof n=="string"){var o=this.prototype[n];if((n=o)){return j(this,l,n,p)}}for(var m in n){this.alias(m,n[m],l)}return this};d.implement=function(m,l,o){if(typeof m=="string"){return j(this,m,l,o)}for(var n in m){j(this,n,m[n],l)}return this};if(c){d.implement(c)}return d};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments);return b.prototype[c].apply(d.shift(),d)}}};Native.implement=function(d,c){for(var b=0,a=d.length;b<a;b++){d[b].implement(c)}};Native.typize=function(a,b){if(!a.type){a.type=function(c){return($type(c)===b)}}};(function(){var a={Array:Array,Date:Date,Function:Function,Number:Number,RegExp:RegExp,String:String};for(var h in a){new Native({name:h,initialize:a[h],protect:true})}var d={"boolean":Boolean,"native":Native,object:Object};for(var c in d){Native.typize(d[c],c)}var f={Array:["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],String:["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};for(var e in f){for(var b=f[e].length;b--;){Native.genericize(a[e],f[e][b],true)}}})();var Hash=new Native({name:"Hash",initialize:function(a){if($type(a)=="hash"){a=$unlink(a.getClean())}for(var b in a){this[b]=a[b]}return this}});Hash.implement({forEach:function(b,c){for(var a in this){if(this.hasOwnProperty(a)){b.call(c,this[a],a,this)}}},getClean:function(){var b={};for(var a in this){if(this.hasOwnProperty(a)){b[a]=this[a]}}return b},getLength:function(){var b=0;for(var a in this){if(this.hasOwnProperty(a)){b++}}return b}});Hash.alias("forEach","each");Array.implement({forEach:function(c,d){for(var b=0,a=this.length;b<a;b++){c.call(d,this[b],b,this)}}});Array.alias("forEach","each");function $A(b){if(b.item){var a=b.length,c=new Array(a);while(a--){c[a]=b[a]}return c}return Array.prototype.slice.call(b)}function $arguments(a){return function(){return arguments[a]}}function $chk(a){return !!(a||a===0)}function $clear(a){clearTimeout(a);clearInterval(a);return null}function $defined(a){return(a!=undefined)}function $each(c,b,d){var a=$type(c);((a=="arguments"||a=="collection"||a=="array")?Array:Hash).each(c,b,d)}function $empty(){}function $extend(c,a){for(var b in (a||{})){c[b]=a[b]}return c}function $H(a){return new Hash(a)}function $lambda(a){return($type(a)=="function")?a:function(){return a}}function $merge(){var a=Array.slice(arguments);a.unshift({});return $mixin.apply(null,a)}function $mixin(e){for(var d=1,a=arguments.length;d<a;d++){var b=arguments[d];if($type(b)!="object"){continue}for(var c in b){var g=b[c],f=e[c];e[c]=(f&&$type(g)=="object"&&$type(f)=="object")?$mixin(f,g):$unlink(g)}}return e}function $pick(){for(var b=0,a=arguments.length;b<a;b++){if(arguments[b]!=undefined){return arguments[b]}}return null}function $random(b,a){return Math.floor(Math.random()*(a-b+1)+b)}function $splat(b){var a=$type(b);return(a)?((a!="array"&&a!="arguments")?[b]:b):[]}var $time=Date.now||function(){return +new Date};function $try(){for(var b=0,a=arguments.length;b<a;b++){try{return arguments[b]()}catch(c){}}return null}function $type(a){if(a==undefined){return false}if(a.$family){return(a.$family.name=="number"&&!isFinite(a))?false:a.$family.name}if(a.nodeName){switch(a.nodeType){case 1:return"element";case 3:return(/\S/).test(a.nodeValue)?"textnode":"whitespace"}}else{if(typeof a.length=="number"){if(a.callee){return"arguments"}else{if(a.item){return"collection"}}}}return typeof a}function $unlink(c){var b;switch($type(c)){case"object":b={};for(var e in c){b[e]=$unlink(c[e])}break;case"hash":b=new Hash(c);break;case"array":b=[];for(var d=0,a=c.length;d<a;d++){b[d]=$unlink(c[d])}break;default:return c}return b}var Browser=$merge({Engine:{name:"unknown",version:0},Platform:{name:(window.orientation!=undefined)?"ipod":(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},Plugins:{},Engines:{presto:function(){return(!window.opera)?false:((arguments.callee.caller)?960:((document.getElementsByClassName)?950:925))},trident:function(){return(!window.ActiveXObject)?false:((window.XMLHttpRequest)?((document.querySelectorAll)?6:5):4)},webkit:function(){return(navigator.taintEnabled)?false:((Browser.Features.xpath)?((Browser.Features.query)?525:420):419)},gecko:function(){return(!document.getBoxObjectFor&&window.mozInnerScreenX==null)?false:((document.getElementsByClassName)?19:18)}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;Browser.detect=function(){for(var b in this.Engines){var a=this.Engines[b]();if(a){this.Engine={name:b,version:a};this.Engine[b]=this.Engine[b+a]=true;break}}return{name:b,version:a}};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest()},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")})};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var a=($try(function(){return navigator.plugins["Shockwave Flash"].description},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")})||"0 r0").match(/\d+/g);return{version:parseInt(a[0]||0+"."+a[1],10)||0,build:parseInt(a[2],10)||0}})();function $exec(b){if(!b){return b}if(window.execScript){window.execScript(b)}else{var a=document.createElement("script");a.setAttribute("type","text/javascript");a[(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerText":"text"]=b;document.head.appendChild(a);document.head.removeChild(a)}return b}Native.UID=1;var $uid=(Browser.Engine.trident)?function(a){return(a.uid||(a.uid=[Native.UID++]))[0]}:function(a){return a.uid||(a.uid=Native.UID++)};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(a){$uid(a);if(!a.Element){a.Element=$empty;if(Browser.Engine.webkit){a.document.createElement("iframe")}a.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{}}a.document.window=a;return $extend(a,Window.Prototype)},afterImplement:function(b,a){window[b]=Window.Prototype[b]=a}});Window.Prototype={$family:{name:"window"}};new Window(window);var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(a){$uid(a);a.head=a.getElementsByTagName("head")[0];a.html=a.getElementsByTagName("html")[0];if(Browser.Engine.trident&&Browser.Engine.version<=4){$try(function(){a.execCommand("BackgroundImageCache",false,true)})}if(Browser.Engine.trident){a.window.attachEvent("onunload",function(){a.window.detachEvent("onunload",arguments.callee);a.head=a.html=a.window=null})}return $extend(a,Document.Prototype)},afterImplement:function(b,a){document[b]=Document.Prototype[b]=a}});Document.Prototype={$family:{name:"document"}};new Document(document);Array.implement({every:function(c,d){for(var b=0,a=this.length;b<a;b++){if(!c.call(d,this[b],b,this)){return false}}return true},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if(d.call(e,this[b],b,this)){c.push(this[b])}}return c},clean:function(){return this.filter($defined)},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b}}return -1},map:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){c[b]=d.call(e,this[b],b,this)}return c},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if(c.call(d,this[b],b,this)){return true}}return false},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a]}return d},link:function(c){var a={};for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break}}}return a},contains:function(a,b){return this.indexOf(a,b)!=-1},extend:function(c){for(var b=0,a=c.length;b<a;b++){this.push(c[b])}return this},getLast:function(){return(this.length)?this[this.length-1]:null},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null},include:function(a){if(!this.contains(a)){this.push(a)}return this},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b])}return this},erase:function(b){for(var a=this.length;a--;a){if(this[a]===b){this.splice(a,1)}}return this},empty:function(){this.length=0;return this},flatten:function(){var d=[];for(var b=0,a=this.length;b<a;b++){var c=$type(this[b]);if(!c){continue}d=d.concat((c=="array"||c=="collection"||c=="arguments")?Array.flatten(this[b]):this[b])}return d},hexToRgb:function(b){if(this.length!=3){return null}var a=this.map(function(c){if(c.length==1){c+=c}return c.toInt(16)});return(b)?a:"rgb("+a+")"},rgbToHex:function(d){if(this.length<3){return null}if(this.length==4&&this[3]==0&&!d){return"transparent"}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);b.push((c.length==1)?"0"+c:c)}return(d)?b:"#"+b.join("")}});Function.implement({extend:function(a){for(var b in a){this[b]=a[b]}return this},create:function(b){var a=this;b=b||{};return function(d){var c=b.arguments;c=(c!=undefined)?$splat(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c)}var e=function(){return a.apply(b.bind||null,c)};if(b.delay){return setTimeout(e,b.delay)}if(b.periodical){return setInterval(e,b.periodical)}if(b.attempt){return $try(e)}return e()}},run:function(a,b){return this.apply(b,$splat(a))},pass:function(a,b){return this.create({bind:b,arguments:a})},bind:function(b,a){return this.create({bind:b,arguments:a})},bindWithEvent:function(b,a){return this.create({bind:b,arguments:a,event:true})},attempt:function(a,b){return this.create({bind:b,arguments:a,attempt:true})()},delay:function(b,c,a){return this.create({bind:c,arguments:a,delay:b})()},periodical:function(c,b,a){return this.create({bind:b,arguments:a,periodical:c})()}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this))},round:function(a){a=Math.pow(10,a||0);return Math.round(this*a)/a},times:function(b,c){for(var a=0;a<this;a++){b.call(c,a,this)}},toFloat:function(){return parseFloat(this)},toInt:function(a){return parseInt(this,a||10)}});Number.alias("times","each");(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat($A(arguments)))}}});Number.implement(a)})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(a,b){return((typeof a=="string")?new RegExp(a,b):a).test(this)},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1},trim:function(){return this.replace(/^\s+|\s+$/g,"")},clean:function(){return this.replace(/\s+/g," ").trim()},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase()})},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase())})},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase()})},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},toInt:function(a){return parseInt(this,a||10)},toFloat:function(){return parseFloat(this)},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null},stripScripts:function(b){var a="";var c=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return""});if(b===true){$exec(a)}else{if($type(b)=="function"){b(a,c)}}return c},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1)}return(a[c]!=undefined)?a[c]:""})}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a}}return null},hasValue:function(a){return(Hash.keyOf(this,a)!==null)},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c)},this);return this},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c)},this);return this},erase:function(a){if(this.hasOwnProperty(a)){delete this[a]}return this},get:function(a){return(this.hasOwnProperty(a))?this[a]:null},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b}return this},empty:function(){Hash.each(this,function(b,a){delete this[a]},this);return this},include:function(a,b){if(this[a]==undefined){this[a]=b}return this},map:function(b,c){var a=new Hash;Hash.each(this,function(e,d){a.set(d,b.call(c,e,d,this))},this);return a},filter:function(b,c){var a=new Hash;Hash.each(this,function(e,d){if(b.call(c,e,d,this)){a.set(d,e)}},this);return a},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false}}return true},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true}}return false},getKeys:function(){var a=[];Hash.each(this,function(c,b){a.push(b)});return a},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b)});return a},toQueryString:function(a){var b=[];Hash.each(this,function(f,e){if(a){e=a+"["+e+"]"}var d;switch($type(f)){case"object":d=Hash.toQueryString(f,e);break;case"array":var c={};f.each(function(h,g){c[g]=h});d=Hash.toQueryString(c,e);break;default:d=e+"="+encodeURIComponent(f)}if(f!=undefined){b.push(d)}});return b.join("&")}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});var Event=new Native({name:"Event",initialize:function(a,f){f=f||window;var k=f.document;a=a||f.event;if(a.$extended){return a}this.$extended=true;var j=a.type;var g=a.target||a.srcElement;while(g&&g.nodeType==3){g=g.parentNode}if(j.test(/key/)){var b=a.which||a.keyCode;var m=Event.Keys.keyOf(b);if(j=="keydown"){var d=b-111;if(d>0&&d<13){m="f"+d}}m=m||String.fromCharCode(b).toLowerCase()}else{if(j.match(/(click|mouse|menu)/i)){k=(!k.compatMode||k.compatMode=="CSS1Compat")?k.html:k.body;var i={x:a.pageX||a.clientX+k.scrollLeft,y:a.pageY||a.clientY+k.scrollTop};var c={x:(a.pageX)?a.pageX-f.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-f.pageYOffset:a.clientY};if(j.match(/DOMMouseScroll|mousewheel/)){var h=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3}var e=(a.which==3)||(a.button==2);var l=null;if(j.match(/over|out/)){switch(j){case"mouseover":l=a.relatedTarget||a.fromElement;break;case"mouseout":l=a.relatedTarget||a.toElement}if(!(function(){while(l&&l.nodeType==3){l=l.parentNode}return true}).create({attempt:Browser.Engine.gecko})()){l=false}}}}return $extend(this,{event:a,type:j,page:i,client:c,rightClick:e,wheel:h,relatedTarget:l,target:g,code:b,key:m,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey})}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault()},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation()}else{this.event.cancelBubble=true}return this},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault()}else{this.event.returnValue=false}return this}});function Class(b){if(b instanceof Function){b={initialize:b}}var a=function(){Object.reset(this);if(a._prototyping){return this}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c}.extend(this);a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a}Function.prototype.protect=function(){this._protected=true;return this};Object.reset=function(a,c){if(c==null){for(var e in a){Object.reset(a,e)}return a}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]);break}return a};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a},wrap:function(a,b,c){if(c._origin){c=c._origin}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.')}var e=this.caller,f=this._current;this.caller=f;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=f;this.caller=e;return d}.extend({_owner:a,_origin:c,_name:b})}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var e in a){this.implement(e,a[e])}return this}var f=Class.Mutators[a];if(f){d=f.call(this,d);if(d==null){return this}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a];if($type(b)=="object"){$mixin(b,d)}else{c[a]=$unlink(d)}break;case"array":c[a]=$unlink(d);break;default:c[a]=d}return this}});Class.Mutators={Extends:function(a){this.parent=a;this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.')}return c.apply(this,arguments)}.protect())},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b)}this.implement(b)},this)}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false},clearChain:function(){this.$chain.empty();return this}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[];this.$events[c].include(b);if(a){b.internal=true}}return this},addEvents:function(a){for(var b in a){this.addEvent(b,a[b])}return this},fireEvent:function(c,b,a){c=Events.removeOn(c);if(!this.$events||!this.$events[c]){return this}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})()},this);return this},removeEvent:function(b,a){b=Events.removeOn(b);if(!this.$events[b]){return this}if(!a.internal){this.$events[b].erase(a)}return this},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d])}return this}if(c){c=Events.removeOn(c)}for(d in this.$events){if(c&&c!=d){continue}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a])}}return this}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase()})};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent){return this}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue}this.addEvent(a,this.options[a]);delete this.options[a]}return this}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a);if(c){return c(b)}if(typeof a=="string"){return document.newElement(a,b)}return document.id(a).set(b)},afterImplement:function(a,b){Element.Prototype[a]=b;if(Array[a]){return}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e<d;e++){var f=this[e][a].apply(this[e],arguments);c.push(f);if(g){g=($type(f)=="element")}}return(g)?new Elements(c):c})}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var f=Array.link(arguments,{properties:Object.type,iframe:$defined});var d=f.properties||{};var c=document.id(f.iframe);var e=d.onload||$empty;delete d.onload;d.id=d.name=$pick(d.id,d.name,c?(c.id||c.name):"IFrame_"+$time());c=new Element(c||"iframe",d);var b=function(){var g=$try(function(){return c.contentWindow.location.host});if(!g||g==window.location.host){var h=new Window(c.contentWindow);new Document(c.contentWindow.document);$extend(h.Element.prototype,Element.Prototype)}e.call(c.contentWindow,c.contentWindow.document)};var a=$try(function(){return c.contentWindow});((a&&a.document.body)||window.frames[d.id])?b():c.addListener("load",b);return c}});var Elements=new Native({initialize:function(f,b){b=$extend({ddup:true,cash:true},b);f=f||[];if(b.ddup||b.cash){var g={},e=[];for(var c=0,a=f.length;c<a;c++){var d=document.id(f[c],!b.cash);if(b.ddup){if(g[d.uid]){continue}g[d.uid]=true}if(d){e.push(d)}}f=e}return(b.cash)?$extend(f,this):f}});Elements.implement({filter:function(a,b){if(!a){return this}return new Elements(Array.filter(this,(typeof a=="string")?function(c){return c.match(a)}:a,b))}});Document.implement({newElement:function(a,b){if(Browser.Engine.trident&&b){["name","type","checked"].each(function(c){if(!b[c]){return}a+=" "+c+'="'+b[c]+'"';if(c!="checked"){delete b[c]}});a="<"+a+">"}return document.id(this.createElement(a)).set(b)},newTextNode:function(a){return this.createTextNode(a)},getDocument:function(){return this},getWindow:function(){return this.window},id:(function(){var a={string:function(d,c,b){d=b.getElementById(d);return(d)?a.element(d,c):null},element:function(b,e){$uid(b);if(!e&&!b.$family&&!(/^object|embed$/i).test(b.tagName)){var c=Element.Prototype;for(var d in c){b[d]=c[d]}}return b},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d)}return null}};a.textnode=a.whitespace=a.window=a.document=$arguments(0);return function(c,e,d){if(c&&c.$family&&c.uid){return c}var b=$type(c);return(a[b])?a[b](c,e,d||document):null}})()});if(window.$==null){Window.implement({$:function(a,b){return document.id(a,b,this.document)}})}Window.implement({$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a)}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d<b;d++){var e=c[d];switch($type(e)){case"element":f.push(e);break;case"string":f.extend(this.document.getElements(e,true))}}return new Elements(f)},getDocument:function(){return this.document},getWindow:function(){return this}});Native.implement([Element,Document],{getElement:function(a,b){return document.id(this.getElements(a,true)[0]||null,b)},getElements:function(a,d){a=a.split(",");var c=[];var b=(a.length>1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f},this);return new Elements(c,{ddup:b,cash:!d})}});(function(){var h={},f={};var i={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"};var c=function(l){return(f[l]||(f[l]={}))};var g=function(n,l){if(!n){return}var m=n.uid;if(Browser.Engine.trident){if(n.clearAttributes){var q=l&&n.cloneNode(false);n.clearAttributes();if(q){n.mergeAttributes(q)}}else{if(n.removeEvents){n.removeEvents()}}if((/object/i).test(n.tagName)){for(var o in n){if(typeof n[o]=="function"){n[o]=$empty}}Element.dispose(n)}}if(!m){return}h[m]=f[m]=null};var d=function(){Hash.each(h,g);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(g)}if(window.CollectGarbage){CollectGarbage()}h=f=null};var j=function(n,l,s,m,p,r){var o=n[s||l];var q=[];while(o){if(o.nodeType==1&&(!m||Element.match(o,m))){if(!p){return document.id(o,r)}q.push(o)}o=o[l]}return(p)?new Elements(q,{ddup:false,cash:!r}):null};var e={html:"innerHTML","class":"className","for":"htmlFor",defaultValue:"defaultValue",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"};var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var k=["value","type","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];b=b.associate(b);Hash.extend(e,b);Hash.extend(e,k.associate(k.map(String.toLowerCase)));var a={before:function(m,l){if(l.parentNode){l.parentNode.insertBefore(m,l)}},after:function(m,l){if(!l.parentNode){return}var n=l.nextSibling;(n)?l.parentNode.insertBefore(m,n):l.parentNode.appendChild(m)},bottom:function(m,l){l.appendChild(m)},top:function(m,l){var n=l.firstChild;(n)?l.insertBefore(m,n):l.appendChild(m)}};a.inside=a.bottom;Hash.each(a,function(l,m){m=m.capitalize();Element.implement("inject"+m,function(n){l(this,document.id(n,true));return this});Element.implement("grab"+m,function(n){l(document.id(n,true),this);return this})});Element.implement({set:function(o,m){switch($type(o)){case"object":for(var n in o){this.set(n,o[n])}break;case"string":var l=Element.Properties.get(o);(l&&l.set)?l.set.apply(this,Array.slice(arguments,1)):this.setProperty(o,m)}return this},get:function(m){var l=Element.Properties.get(m);return(l&&l.get)?l.get.apply(this,Array.slice(arguments,1)):this.getProperty(m)},erase:function(m){var l=Element.Properties.get(m);(l&&l.erase)?l.erase.apply(this):this.removeProperty(m);return this},setProperty:function(m,n){var l=e[m];if(n==undefined){return this.removeProperty(m)}if(l&&b[m]){n=!!n}(l)?this[l]=n:this.setAttribute(m,""+n);return this},setProperties:function(l){for(var m in l){this.setProperty(m,l[m])}return this},getProperty:function(m){var l=e[m];var n=(l)?this[l]:this.getAttribute(m,2);return(b[m])?!!n:(l)?n:n||null},getProperties:function(){var l=$A(arguments);return l.map(this.getProperty,this).associate(l)},removeProperty:function(m){var l=e[m];(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this},hasClass:function(l){return this.className.contains(l," ")},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean()}return this},removeClass:function(l){this.className=this.className.replace(new RegExp("(^|\\s)"+l+"(?:\\s|$)"),"$1");return this},toggleClass:function(l){return this.hasClass(l)?this.removeClass(l):this.addClass(l)},adopt:function(){Array.flatten(arguments).each(function(l){l=document.id(l,true);if(l){this.appendChild(l)}},this);return this},appendText:function(m,l){return this.grab(this.getDocument().newTextNode(m),l)},grab:function(m,l){a[l||"bottom"](document.id(m,true),this);return this},inject:function(m,l){a[l||"bottom"](this,document.id(m,true));return this},replaces:function(l){l=document.id(l,true);l.parentNode.replaceChild(this,l);return this},wraps:function(m,l){m=document.id(m,true);return this.replaces(m).grab(m,l)},getPrevious:function(l,m){return j(this,"previousSibling",null,l,false,m)},getAllPrevious:function(l,m){return j(this,"previousSibling",null,l,true,m)},getNext:function(l,m){return j(this,"nextSibling",null,l,false,m)},getAllNext:function(l,m){return j(this,"nextSibling",null,l,true,m)},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m)},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m)},getParent:function(l,m){return j(this,"parentNode",null,l,false,m)},getParents:function(l,m){return j(this,"parentNode",null,l,true,m)},getSiblings:function(l,m){return this.getParent().getChildren(l,m).erase(this)},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m)},getWindow:function(){return this.ownerDocument.window},getDocument:function(){return this.ownerDocument},getElementById:function(o,n){var m=this.ownerDocument.getElementById(o);if(!m){return null}for(var l=m.parentNode;l!=this;l=l.parentNode){if(!l){return null}}return document.id(m,n)},getSelected:function(){return new Elements($A(this.options).filter(function(l){return l.selected}))},getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()]}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null},toQueryString:function(){var l=[];this.getElements("input, select, textarea",true).each(function(m){if(!m.name||m.disabled||m.type=="submit"||m.type=="reset"||m.type=="file"){return}var n=(m.tagName.toLowerCase()=="select")?Element.getSelected(m).map(function(o){return o.value}):((m.type=="radio"||m.type=="checkbox")&&!m.checked)?null:m.value;$splat(n).each(function(o){if(typeof o!="undefined"){l.push(m.name+"="+encodeURIComponent(o))}})});return l.join("&")},clone:function(o,l){o=o!==false;var r=this.cloneNode(o);var n=function(v,u){if(!l){v.removeAttribute("id")}if(Browser.Engine.trident){v.clearAttributes();v.mergeAttributes(u);v.removeAttribute("uid");if(v.options){var w=v.options,s=u.options;for(var t=w.length;t--;){w[t].selected=s[t].selected}}}var x=i[u.tagName.toLowerCase()];if(x&&u[x]){v[x]=u[x]}};if(o){var p=r.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(var m=p.length;m--;){n(p[m],q[m])}}n(r,this);return document.id(r)},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l)});return this},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this},hasChild:function(l){l=document.id(l,true);if(!l){return false}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(l.tagName)).contains(l)}return(this.contains)?(this!=l&&this.contains(l)):!!(this.compareDocumentPosition(l)&16)},match:function(l){return(!l||(l==this)||(Element.get(this,"tag")==l))}});Native.implement([Element,Window,Document],{addListener:function(o,n){if(o=="unload"){var l=n,m=this;n=function(){m.removeListener("unload",n);l()}}else{h[this.uid]=this}if(this.addEventListener){this.addEventListener(o,n,false)}else{this.attachEvent("on"+o,n)}return this},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false)}else{this.detachEvent("on"+m,l)}return this},retrieve:function(m,l){var o=c(this.uid),n=o[m];if(l!=undefined&&n==undefined){n=o[m]=l}return $pick(n)},store:function(m,l){var n=c(this.uid);n[m]=l;return this},eliminate:function(l){var m=c(this.uid);delete m[l];return this}});window.addListener("unload",d)})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a},get:function(){return this.style.cssText},erase:function(){this.style.cssText=""}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase()}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};a.thead=a.tfoot=a.tbody;var b={set:function(){var e=Array.flatten(arguments).join("");var f=Browser.Engine.trident&&a[this.get("tag")];if(f){var g=c;g.innerHTML=f[1]+e+f[2];for(var d=f[0];d--;){g=g.firstChild}this.empty().adopt(g.childNodes)}else{this.innerHTML=e}}};b.erase=b.set;return b})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b}}}Element.Properties.events={set:function(a){this.addEvents(a)}};Native.implement([Element,Window,Document],{addEvent:function(e,g){var h=this.retrieve("events",{});h[e]=h[e]||{keys:[],values:[]};if(h[e].keys.contains(g)){return this}h[e].keys.push(g);var f=e,a=Element.Events.get(e),c=g,i=this;if(a){if(a.onAdd){a.onAdd.call(this,g)}if(a.condition){c=function(j){if(a.condition.call(this,j)){return g.call(this,j)}return true}}f=a.base||f}var d=function(){return g.call(i)};var b=Element.NativeEvents[f];if(b){if(b==2){d=function(j){j=new Event(j,i.getWindow());if(c.call(i,j)===false){j.stop()}}}this.addListener(f,d)}h[e].values.push(d);return this},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this}var f=a[c].keys.indexOf(b);if(f==-1){return this}a[c].keys.splice(f,1);var e=a[c].values.splice(f,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b)}c=d.base||c}return(Element.NativeEvents[c])?this.removeListener(c,e):this},addEvents:function(a){for(var b in a){this.addEvent(b,a[b])}return this},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c])}return this}var b=this.retrieve("events");if(!b){return this}if(!a){for(c in b){this.removeEvents(c)}this.eliminate("events")}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0])}b[a]=null}}return this},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this}c[d].keys.each(function(e){e.create({bind:this,delay:a,"arguments":b})()},this);return this},cloneEvents:function(d,a){d=document.id(d);var c=d.retrieve("events");if(!c){return this}if(!a){for(var b in c){this.cloneEvents(d,b)}}else{if(c[a]){c[a].keys.each(function(e){this.addEvent(a,e)},this)}}return this}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true}if(c===false){return false}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c))};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}})})();Element.Properties.styles={set:function(a){this.setStyles(a)}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden"}}else{if(this.style.visibility!="visible"){this.style.visibility="visible"}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")"}this.style.opacity=a;this.store("opacity",a)},get:function(){return this.retrieve("opacity",1)}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true)},getOpacity:function(){return this.get("opacity")},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat"}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(e,d){if(!c[d]){return""}return($type(e)=="number")?c[d].replace("@",Math.round(e)):e}).join(" ")}else{if(a==String(Number(a))){a=Math.round(a)}}this.style[b]=a;return this},getStyle:function(g){switch(g){case"opacity":return this.get("opacity");case"float":g=(Browser.Engine.trident)?"styleFloat":"cssFloat"}g=g.camelCase();var a=this.style[g];if(!$chk(a)){a=[];for(var f in Element.ShortStyles){if(g!=f){continue}for(var e in Element.ShortStyles[f]){a.push(this.getStyle(e))}return a.join(" ")}a=this.getComputedStyle(g)}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/);if(c){a=a.replace(c[0],c[0].rgbToHex())}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(g.test(/^(height|width)$/)){var b=(g=="width")?["left","right"]:["top","bottom"],d=0;b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt()},this);return this["offset"+g.capitalize()]-d+"px"}if((Browser.Engine.presto)&&String(a).test("px")){return a}if(g.test(/(border(.+)Width|margin|padding)/)){return"0px"}}return a},setStyles:function(b){for(var a in b){this.setStyle(a,b[a])}return this},getStyles:function(){var a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b)},this);return a}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles;var b=Element.Styles;["margin","padding"].each(function(h){var i=h+g;f[h][i]=b[i]="@px"});var e="border"+g;f.border[e]=b[e]="@px @ rgb(@, @, @)";var d=e+"Width",a=e+"Style",c=e+"Color";f[e]={};f.borderWidth[d]=f[e][d]=b[d]="@px";f.borderStyle[a]=f[e][a]=b[a]="@";f.borderColor[c]=f[e][c]=b[c]="rgb(@, @, @)"});(function(){Element.implement({scrollTo:function(h,i){if(b(this)){this.getWindow().scrollTo(h,i)}else{this.scrollLeft=h;this.scrollTop=i}return this},getSize:function(){if(b(this)){return this.getWindow().getSize()}return{x:this.offsetWidth,y:this.offsetHeight}},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize()}return{x:this.scrollWidth,y:this.scrollHeight}},getScroll:function(){if(b(this)){return this.getWindow().getScroll()}return{x:this.scrollLeft,y:this.scrollTop}},getScrolls:function(){var i=this,h={x:0,y:0};while(i&&!b(i)){h.x+=i.scrollLeft;h.y+=i.scrollTop;i=i.parentNode}return h},getOffsetParent:function(){var h=this;if(b(h)){return null}if(!Browser.Engine.trident){return h.offsetParent}while((h=h.parentNode)&&!b(h)){if(d(h,"position")!="static"){return h}}return null},getOffsets:function(){if(this.getBoundingClientRect){var j=this.getBoundingClientRect(),m=document.id(this.getDocument().documentElement),p=m.getScroll(),k=this.getScrolls(),i=this.getScroll(),h=(d(this,"position")=="fixed");return{x:j.left.toInt()+k.x-i.x+((h)?0:p.x)-m.clientLeft,y:j.top.toInt()+k.y-i.y+((h)?0:p.y)-m.clientTop}}var l=this,n={x:0,y:0};if(b(this)){return n}while(l&&!b(l)){n.x+=l.offsetLeft;n.y+=l.offsetTop;if(Browser.Engine.gecko){if(!f(l)){n.x+=c(l);n.y+=g(l)}var o=l.parentNode;if(o&&d(o,"overflow")!="visible"){n.x+=c(o);n.y+=g(o)}}else{if(l!=this&&Browser.Engine.webkit){n.x+=c(l);n.y+=g(l)}}l=l.offsetParent}if(Browser.Engine.gecko&&!f(this)){n.x-=c(this);n.y-=g(this)}return n},getPosition:function(k){if(b(this)){return{x:0,y:0}}var l=this.getOffsets(),i=this.getScrolls();var h={x:l.x-i.x,y:l.y-i.y};var j=(k&&(k=document.id(k)))?k.getPosition():{x:0,y:0};return{x:h.x-j.x,y:h.y-j.y}},getCoordinates:function(j){if(b(this)){return this.getWindow().getCoordinates()}var h=this.getPosition(j),i=this.getSize();var k={left:h.x,top:h.y,width:i.x,height:i.y};k.right=k.left+k.width;k.bottom=k.top+k.height;return k},computePosition:function(h){return{left:h.x-e(this,"margin-left"),top:h.y-e(this,"margin-top")}},setPosition:function(h){return this.setStyles(this.computePosition(h))}});Native.implement([Document,Window],{getSize:function(){if(Browser.Engine.presto||Browser.Engine.webkit){var i=this.getWindow();return{x:i.innerWidth,y:i.innerHeight}}var h=a(this);return{x:h.clientWidth,y:h.clientHeight}},getScroll:function(){var i=this.getWindow(),h=a(this);return{x:i.pageXOffset||h.scrollLeft,y:i.pageYOffset||h.scrollTop}},getScrollSize:function(){var i=a(this),h=this.getSize();return{x:Math.max(i.scrollWidth,h.x),y:Math.max(i.scrollHeight,h.y)}},getPosition:function(){return{x:0,y:0}},getCoordinates:function(){var h=this.getSize();return{top:0,left:0,bottom:h.y,right:h.x,height:h.y,width:h.x}}});var d=Element.getComputedStyle;function e(h,i){return d(h,i).toInt()||0}function f(h){return d(h,"-moz-box-sizing")=="border-box"}function g(h){return e(h,"border-top-width")}function c(h){return e(h,"border-left-width")}function b(h){return(/^(?:body|html)$/i).test(h.tagName)}function a(h){var i=h.getDocument();return(!i.compatMode||i.compatMode=="CSS1Compat")?i.html:i.body}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y},getWidth:function(){return this.getSize().x},getScrollTop:function(){return this.getScroll().y},getScrollLeft:function(){return this.getScroll().x},getScrollHeight:function(){return this.getScrollSize().y},getScrollWidth:function(){return this.getScrollSize().x},getTop:function(){return this.getPosition().y},getLeft:function(){return this.getPosition().x}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d<b;d++){var a=h[d],f=Selectors.Utils.search(this,a,e);if(d!=0&&f.item){f=$A(f)}c=(d==0)?f:(c.item)?$A(c).concat(f):c.concat(f)}return new Elements(c,{ddup:(h.length>1),cash:!g})}});Element.implement({match:function(b){if(!b||(b==this)){return true}var d=Selectors.Utils.parseTagAndID(b);var a=d[0],e=d[1];if(!Selectors.Filters.byID(this,e)||!Selectors.Filters.byTag(this,a)){return false}var c=Selectors.Utils.parseSelector(b);return(c)?Selectors.Utils.filter(this,c,{}):true}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};Selectors.Utils={chk:function(b,c){if(!c){return true}var a=$uid(b);if(!c[a]){return c[a]=true}return false},parseNthArgument:function(h){if(Selectors.Cache.nth[h]){return Selectors.Cache.nth[h]}var e=h.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!e){return false}var g=parseInt(e[1],10);var d=(g||g===0)?g:1;var f=e[2]||false;var c=parseInt(e[3],10)||0;if(d!=0){c--;while(c<1){c+=d}while(c>=d){c-=d}}else{d=c;f="index"}switch(f){case"n":e={a:d,b:c,special:"n"};break;case"odd":e={a:2,b:0,special:"n"};break;case"even":e={a:2,b:1,special:"n"};break;case"first":e={a:0,special:"index"};break;case"last":e={special:"last-child"};break;case"only":e={special:"only-child"};break;default:e={a:(d-1),special:"index"}}return Selectors.Cache.nth[h]=e},parseSelector:function(e){if(Selectors.Cache.parsed[e]){return Selectors.Cache.parsed[e]}var d,h={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(e))){var i=d[1],g=d[2],f=d[3],b=d[5],c=d[6],j=d[7];if(i){h.classes.push(i)}else{if(c){var a=Selectors.Pseudo.get(c);if(a){h.pseudos.push({parser:a,argument:j})}else{h.attributes.push({name:c,operator:"=",value:j})}}else{if(g){h.attributes.push({name:g,operator:f,value:b})}}}}if(!h.classes.length){delete h.classes}if(!h.attributes.length){delete h.attributes}if(!h.pseudos.length){delete h.pseudos}if(!h.classes&&!h.attributes&&!h.pseudos){h=null}return Selectors.Cache.parsed[e]=h},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false]},filter:function(f,c,e){var d;if(c.classes){for(d=c.classes.length;d--;d){var g=c.classes[d];if(!Selectors.Filters.byClass(f,g)){return false}}}if(c.attributes){for(d=c.attributes.length;d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(f,b.name,b.operator,b.value)){return false}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d];if(!Selectors.Filters.byPseudo(f,a.parser,a.argument,e)){return false}}}return true},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true);return(c&&Selectors.Filters.byTag(c,a))?[c]:[]}else{return b.getElementsByTagName(a)}},search:function(o,h,t){var b=[];var c=h.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j);return":)"+i}).split(":)");var p,e,A;for(var z=0,v=c.length;z<v;z++){var y=c[z];if(z==0&&Selectors.RegExps.quick.test(y)){p=o.getElementsByTagName(y);continue}var a=b[z-1];var q=Selectors.Utils.parseTagAndID(y);var B=q[0],r=q[1];if(z==0){p=Selectors.Utils.getByTagAndID(o,B,r)}else{var d={},g=[];for(var x=0,w=p.length;x<w;x++){g=Selectors.Getters[a](g,p[x],B,r,d)}p=g}var f=Selectors.Utils.parseSelector(y);if(f){e=[];for(var u=0,s=p.length;u<s;u++){A=p[u];if(Selectors.Utils.filter(A,f,t)){e.push(A)}}p=e}}return p}};Selectors.Getters={" ":function(h,g,j,a,e){var d=Selectors.Utils.getByTagAndID(g,j,a);for(var c=0,b=d.length;c<b;c++){var f=d[c];if(Selectors.Utils.chk(f,e)){h.push(f)}}return h},">":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;e<d;e++){var b=c[e];if(b.parentNode==g&&Selectors.Utils.chk(b,f)){h.push(b)}}return h},"+":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(Selectors.Utils.chk(b,d)&&Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b)}break}}return c},"~":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(!Selectors.Utils.chk(b,d)){break}if(Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b)}}}return c}};Selectors.Filters={byTag:function(b,a){return(a=="*"||(b.tagName&&b.tagName.toLowerCase()==a))},byID:function(a,b){return(!b||(a.id&&a.id==b))},byClass:function(b,a){return(b.className&&b.className.contains&&b.className.contains(a," "))},byPseudo:function(a,d,c,b){return d.call(a,c,b)},byAttribute:function(c,d,b,e){var a=Element.prototype.getProperty.call(c,d);if(!a){return(b=="!=")}if(!b||e==undefined){return true}switch(b){case"=":return(a==e);case"*=":return(a.contains(e));case"^=":return(a.substr(0,e.length)==e);case"$=":return(a.substr(a.length-e.length)==e);case"!=":return(a!=e);case"~=":return a.contains(e," ");case"|=":return a.contains(e,"-")}return false}};Selectors.Pseudo=new Hash({checked:function(){return this.checked},empty:function(){return !(this.innerText||this.textContent||"").length},not:function(a){return !Element.match(this,a)},contains:function(a){return(this.innerText||this.textContent||"").contains(a)},"first-child":function(){return Selectors.Pseudo.index.call(this,0)},"last-child":function(){var a=this;while((a=a.nextSibling)){if(a.nodeType==1){return false}}return true},"only-child":function(){var b=this;while((b=b.previousSibling)){if(b.nodeType==1){return false}}var a=this;while((a=a.nextSibling)){if(a.nodeType==1){return false}}return true},"nth-child":function(g,e){g=(g==undefined)?"n":g;var c=Selectors.Utils.parseNthArgument(g);if(c.special!="n"){return Selectors.Pseudo[c.special].call(this,c.a,e)}var f=0;e.positions=e.positions||{};var d=$uid(this);if(!e.positions[d]){var b=this;while((b=b.previousSibling)){if(b.nodeType!=1){continue}f++;var a=e.positions[$uid(b)];if(a!=undefined){f=a+f;break}}e.positions[d]=f}return(e.positions[d]%c.a==c.b)},index:function(a){var b=this,c=0;while((b=b.previousSibling)){if(b.nodeType==1&&++c>a){return false}}return(c==a)},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a)},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a)},selected:function(){return this.selected},enabled:function(){return(this.disabled===false)}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this)}}};(function(){var b=function(){if(Browser.loaded){return}Browser.loaded=true;window.fireEvent("domready");document.fireEvent("domready")};window.addEvent("load",b);if(Browser.Engine.trident){var a=document.createElement("div");(function(){($try(function(){a.doScroll();return document.id(a).inject(document.body).set("html","temp").dispose()}))?b():arguments.callee.delay(50)})()}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50)})()}else{document.addEvent("DOMContentLoaded",b)}}})();var JSON=new Hash(this.JSON&&{stringify:JSON.stringify,parse:JSON.parse}).extend({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16)},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]";case"object":case"hash":var a=[];Hash.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c)}});return"{"+a+"}";case"number":case"boolean":return String(b);case false:return"null"}return null},decode:function(string,secure){if($type(string)!="string"||!string.length){return null}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null}return eval("("+string+")")}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this)}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b;this.setOptions(a)},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain}if(this.options.path){b+="; path="+this.options.path}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString()}if(this.options.secure){b+="; secure"}this.options.document.cookie=this.key+"="+b;return this},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");return(a)?decodeURIComponent(a[1]):null},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c)};Cookie.read=function(a){return new Cookie(a).read()};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose()};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object},initialize:function(l,m){this.instance="Swiff_"+$time();this.setOptions(m);m=this.options;var b=this.id=m.id||this.instance;var a=document.id(m.container);Swiff.CallBacks[this.instance]={};var e=m.params,g=m.vars,f=m.callBacks;var h=$extend({height:m.height,width:m.width},m.properties);var k=this;for(var d in f){Swiff.CallBacks[this.instance][d]=(function(n){return function(){return n.apply(k.object,arguments)}})(f[d]);g[d]="Swiff.CallBacks."+this.instance+"."+d}e.flashVars=Hash.toQueryString(g);if(Browser.Engine.trident){h.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";e.movie=l}else{h.type="application/x-shockwave-flash";h.data=l}var j='<object id="'+b+'"';for(var i in h){j+=" "+i+'="'+h[i]+'"'}j+=">";for(var c in e){if(e[c]){j+='<param name="'+c+'" value="'+e[c]+'" />'}}j+="</object>";this.object=((a)?a.empty():new Element("div")).set("html",j).firstChild},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a);return this},inject:function(a){document.id(a,true).appendChild(this.toElement());return this},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments))}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");return eval(rs)};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this;this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel"}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2}},step:function(){var a=$time();if(a<this.time+this.options.duration){var b=this.transition((a-this.time)/this.options.duration);this.set(this.compute(this.from,this.to,b))}else{this.set(this.compute(this.from,this.to,1));this.complete()}},set:function(a){return a},compute:function(c,b,a){return Fx.compute(c,b,a)},check:function(){if(!this.timer){return true}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false}return false},start:function(b,a){if(!this.check(b,a)){return this}this.from=b;this.to=a;this.time=0;this.transition=this.getTransition();this.startTimer();this.onStart();return this},complete:function(){if(this.stopTimer()){this.onComplete()}return this},cancel:function(){if(this.stopTimer()){this.onCancel()}return this},onStart:function(){this.fireEvent("start",this.subject)},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject)}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain()},pause:function(){this.stopTimer();return this},resume:function(){this.startTimer();return this},stopTimer:function(){if(!this.timer){return false}this.time=$time()-this.time;this.timer=$clear(this.timer);return true},startTimer:function(){if(this.timer){return false}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true}});Fx.compute=function(c,b,a){return(b-c)*a+c};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(d,e,b){b=$splat(b);var c=b[1];if(!$chk(c)){b[1]=b[0];b[0]=d.getStyle(e)}var a=b.map(this.parse);return{from:a[0],to:a[1]}},parse:function(a){a=$lambda(a)();a=(typeof a=="string")?a.split(" "):$splat(a);return a.map(function(c){c=String(c);var b=false;Fx.CSS.Parsers.each(function(f,e){if(b){return}var d=f.parse(c);if($chk(d)){b={value:d,parser:f}}});b=b||{value:c,parser:Fx.CSS.Parsers.String};return b})},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser})});a.$family={name:"fx:css:value"};return a},serve:function(c,b){if($type(c)!="fx:css:value"){c=this.parse(c)}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b))});return a},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b))},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a]}var b={};Array.each(document.styleSheets,function(e,d){var c=e.href;if(c&&c.contains("://")&&!c.contains(document.domain)){return}var f=e.rules||e.cssRules;Array.each(f,function(j,g){if(!j.style){return}var h=(j.selectorText)?j.selectorText.replace(/^\w+/,function(i){return i.toLowerCase()}):null;if(!h||!h.test("^"+a+"$")){return}Element.Styles.each(function(k,i){if(!j.style[i]||Element.ShortStyles[i]){return}k=String(j.style[i]);b[i]=(k.test(/^rgb/))?k.rgbToHex():k})})});return Fx.CSS.Cache[a]=b}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true)}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a))})},serve:function(a){return a.map(Number)}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a)},set:function(b,a){if(arguments.length==1){a=b;b=this.property||this.options.property}this.render(this.element,b,a,this.options.unit);return this},start:function(c,e,d){if(!this.check(c,e,d)){return this}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to)}});Element.Properties.tween={set:function(a){var b=this.retrieve("tween");if(b){b.cancel()}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},a))},get:function(a){if(a||!this.retrieve("tween")){if(a||!this.retrieve("tween:options")){this.set("tween",a)}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")))}return this.retrieve("tween")}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);return this},fade:function(c){var e=this.get("tween"),d="opacity",a;c=$pick(c,"toggle");switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);e.start(d,(b)?0:1);this.store("fade:flag",!b);a=true;break;default:e.start(d,arguments)}if(!a){this.eliminate("fade:flag")}return this},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));a=(a=="transparent")?"#fff":a}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));b.callChain()}.bind(this));return this}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a)},set:function(a){if(typeof a=="string"){a=this.search(a)}for(var b in a){this.render(this.element,b,a[b],this.options.unit)}return this},compute:function(e,d,c){var a={};for(var b in e){a[b]=this.parent(e[b],d[b],c)}return a},start:function(b){if(!this.check(b)){return this}if(typeof b=="string"){b=this.search(b)}var e={},d={};for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to}return this.parent(e,d)}});Element.Properties.morph={set:function(a){var b=this.retrieve("morph");if(b){b.cancel()}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},a))},get:function(a){if(a||!this.retrieve("morph")){if(a||!this.retrieve("morph:options")){this.set("morph",a)}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")))}return this.retrieve("morph")}};Element.implement({morph:function(a){this.get("morph").start(a);return this}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":");a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")]}}return a}});Fx.Transition=function(b,a){a=$splat(a);return $extend(b,{easeIn:function(c){return b(c,a)},easeOut:function(c){return 1-b(1-c,a)},easeInOut:function(c){return(c<=0.5)?b(2*c,a)/2:(2-b(2*(1-c),a))/2}})};Fx.Transitions=new Hash({linear:$arguments(0)});Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b])}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a[0]||6)},Expo:function(a){return Math.pow(2,8*(a-1))},Circ:function(a){return 1-Math.sin(Math.acos(a))},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2)},Back:function(b,a){a=a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a)},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break}}return e},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3)}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2])})});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request();this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers)},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status}.bind(this));this.xhr.onreadystatechange=$empty;if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};this.success(this.response.text,this.response.xml)}else{this.response={text:null,xml:null};this.failure()}},isSuccess:function(){return((this.status>=200)&&(this.status<300))},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a)}return a.stripScripts(this.options.evalScripts)},success:function(b,a){this.onSuccess(this.processScripts(b),a)},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain()},failure:function(){this.onFailure()},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr)},setHeader:function(a,b){this.headers.set(a,b);return this},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a)}.bind(this))},check:function(){if(!this.running){return true}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false}return false},send:function(k){if(!this.check(k)){return this}this.running=true;var i=$type(k);if(i=="string"||i=="element"){k={data:k}}var d=this.options;k=$extend({data:d.data,url:d.url,method:d.method},k);var g=k.data,b=String(k.url),a=k.method.toLowerCase();switch($type(g)){case"element":g=document.id(g).toQueryString();break;case"object":case"hash":g=Hash.toQueryString(g)}if(this.options.format){var j="format="+this.options.format;g=(g)?j+"&"+g:j}if(this.options.emulation&&!["get","post"].contains(a)){var h="_method="+a;g=(g)?h+"&"+g:h;a="post"}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+c)}if(this.options.noCache){var f="noCache="+new Date().getTime();g=(g)?f+"&"+g:f}var e=b.lastIndexOf("/");if(e>-1&&(e=b.indexOf("#"))>-1){b=b.substr(0,e)}if(g&&a=="get"){b=b+(b.contains("?")?"&":"?")+g;g=null}this.xhr.open(a.toUpperCase(),b,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(m,l){try{this.xhr.setRequestHeader(l,m)}catch(n){this.fireEvent("exception",[l,m])}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange()}return this},cancel:function(){if(!this.running){return this}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this}});(function(){var a={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined});return this.send($extend(c,{method:b}))}});Request.implement(a)})();Element.Properties.send={set:function(a){var b=this.retrieve("send");if(b){b.cancel()}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},a))},get:function(a){if(a||!this.retrieve("send")){if(a||!this.retrieve("send:options")){this.set("send",a)}this.store("send",new Request(this.retrieve("send:options")))}return this.retrieve("send")}};Element.implement({send:function(a){var b=this.get("send");b.send({data:this,url:a||b.options.url});return this}});Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false},processHTML:function(c){var b=c.match(/<body[^>]*>([\s\S]*?)<\/body>/i);c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d="<root>"+c+"</root>",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM");g.async=false;g.loadXML(d)}else{g=new DOMParser().parseFromString(d,"text/xml")}d=g.getElementsByTagName("root")[0];if(!d){return null}for(var f=0,e=d.childNodes.length;f<e;f++){var h=Element.clone(d.childNodes[f],true,true);if(h){a.grab(h)}}return a})||a.set("html",c)},success:function(d){var c=this.options,b=this.response;b.html=d.stripScripts(function(e){b.javascript=e});var a=this.processHTML(b.html);b.tree=a.childNodes;b.elements=a.getElements("*");if(c.filter){b.tree=b.elements.filter(c.filter)}if(c.update){document.id(c.update).empty().set("html",b.html)}else{if(c.append){document.id(c.append).adopt(a.getChildren())}}if(c.evalScripts){$exec(b.javascript)}this.onSuccess(b.tree,b.elements,b.html,b.javascript)}});Element.Properties.load={set:function(a){var b=this.retrieve("load");if(b){b.cancel()}return this.eliminate("load").store("load:options",$extend({data:this,link:"cancel",update:this,method:"get"},a))},get:function(a){if(a||!this.retrieve("load")){if(a||!this.retrieve("load:options")){this.set("load",a)}this.store("load",new Request.HTML(this.retrieve("load:options")))}return this.retrieve("load")}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Object.type,url:String.type}));return this}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);this.headers.extend({Accept:"application/json","X-Request":"JSON"})},success:function(a){this.response.json=JSON.decode(a,this.options.secure);this.onSuccess(this.response.json,a)}});MooTools.More={version:"1.2.4.2",build:"bd5a93c0913cce25917c48cbdacde568e15e02ef"};Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(b,a){this.elements=this.subject=$$(b);this.parent(a)},compute:function(g,h,j){var c={};for(var d in g){var a=g[d],e=h[d],f=c[d]={};for(var b in a){f[b]=this.parent(a[b],e[b],j)}}return c},set:function(b){for(var c in b){var a=b[c];for(var d in a){this.render(this.elements[c],d,a[d],this.options.unit)}}return this},start:function(c){if(!this.check(c)){return this}var h={},j={};for(var d in c){var f=c[d],a=h[d]={},g=j[d]={};for(var b in f){var e=this.prepare(this.elements[d],b,f[b]);a[b]=e.from;g[b]=e.to}}return this.parent(h,j)}});var Accordion=Fx.Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,alwaysHide:false,trigger:"click",initialDisplayFx:true,returnHeightToAuto:true},initialize:function(){var c=Array.link(arguments,{container:Element.type,options:Object.type,togglers:$defined,elements:$defined});this.parent(c.elements,c.options);this.togglers=$$(c.togglers);this.container=document.id(c.container);this.previous=-1;this.internalChain=new Chain();if(this.options.alwaysHide){this.options.wait=true}if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show}if(this.options.start){this.options.display=false;this.options.show=false}this.effects={};if(this.options.opacity){this.effects.opacity="fullOpacity"}if(this.options.width){this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth"}if(this.options.height){this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight"}for(var b=0,a=this.togglers.length;b<a;b++){this.addSection(this.togglers[b],this.elements[b])}this.elements.each(function(e,d){if(this.options.show===d){this.fireEvent("active",[this.togglers[d],e])}else{for(var f in this.effects){e.setStyle(f,0)}}},this);if($chk(this.options.display)){this.display(this.options.display,this.options.initialDisplayFx)}this.addEvent("complete",this.internalChain.callChain.bind(this.internalChain))},addSection:function(e,c){e=document.id(e);c=document.id(c);var f=this.togglers.contains(e);this.togglers.include(e);this.elements.include(c);var a=this.togglers.indexOf(e);var b=this.display.bind(this,a);e.store("accordion:display",b);e.addEvent(this.options.trigger,b);if(this.options.height){c.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"})}if(this.options.width){c.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"})}c.fullOpacity=1;if(this.options.fixedWidth){c.fullWidth=this.options.fixedWidth}if(this.options.fixedHeight){c.fullHeight=this.options.fixedHeight}c.setStyle("overflow","hidden");if(!f){for(var d in this.effects){c.setStyle(d,0)}}return this},detach:function(){this.togglers.each(function(a){a.removeEvent(this.options.trigger,a.retrieve("accordion:display"))},this)},display:function(a,b){if(!this.check(a,b)){return this}b=$pick(b,true);if(this.options.returnHeightToAuto){var d=this.elements[this.previous];if(d&&!this.selfHidden){for(var c in this.effects){d.setStyle(c,d[this.effects[c]])}}}a=($type(a)=="element")?this.elements.indexOf(a):a;if((this.timer&&this.options.wait)||(a===this.previous&&!this.options.alwaysHide)){return this}this.previous=a;var e={};this.elements.each(function(h,g){e[g]={};var f;if(g!=a){f=true}else{if(this.options.alwaysHide&&((h.offsetHeight>0&&this.options.height)||h.offsetWidth>0&&this.options.width)){f=true;this.selfHidden=true}}this.fireEvent(f?"background":"active",[this.togglers[g],h]);for(var j in this.effects){e[g][j]=f?0:h[this.effects[j]]}},this);this.internalChain.chain(function(){if(this.options.returnHeightToAuto&&!this.selfHidden){var f=this.elements[a];if(f){f.setStyle("height","auto")}}}.bind(this));return b?this.start(e):this.set(e)}});Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);var d=this.cancel.bind(this,false);if($type(this.element)!="element"){this.element=document.id(this.element.getDocument().body)}var c=this.element;if(this.options.wheelStops){this.addEvent("start",function(){c.addEvent("mousewheel",d)},true);this.addEvent("complete",function(){c.removeEvent("mousewheel",d)},true)}},set:function(){var a=Array.flatten(arguments);if(Browser.Engine.gecko){a=[Math.round(a[0]),Math.round(a[1])]}this.element.scrollTo(a[0],a[1])},compute:function(c,b,a){return[0,1].map(function(d){return Fx.compute(c[d],b[d],a)})},start:function(c,g){if(!this.check(c,g)){return this}var e=this.element.getScrollSize(),b=this.element.getScroll(),d={x:c,y:g};for(var f in d){var a=e[f];if($chk(d[f])){d[f]=($type(d[f])=="number")?d[f]:a}else{d[f]=b[f]}d[f]+=this.options.offset[f]}return this.parent([b.x,b.y],[d.x,d.y])},toTop:function(){return this.start(false,0)},toLeft:function(){return this.start(0,false)},toRight:function(){return this.start("right",false)},toBottom:function(){return this.start(false,"bottom")},toElement:function(b){var a=document.id(b).getPosition(this.element);return this.start(a.x,a.y)},scrollIntoView:function(c,e,d){e=e?$splat(e):["x","y"];var h={};c=document.id(c);var f=c.getPosition(this.element);var i=c.getSize();var g=this.element.getScroll();var a=this.element.getSize();var b={x:f.x+i.x,y:f.y+i.y};["x","y"].each(function(j){if(e.contains(j)){if(b[j]>g[j]+a[j]){h[j]=b[j]-a[j]}if(f[j]<g[j]){h[j]=f[j]}}if(h[j]==null){h[j]=g[j]}if(d&&d[j]){h[j]=h[j]+d[j]}},this);if(h.x!=g.x||h.y!=g.y){this.start(h.x,h.y)}return this},scrollToCenter:function(c,e,d){e=e?$splat(e):["x","y"];c=$(c);var h={},f=c.getPosition(this.element),i=c.getSize(),g=this.element.getScroll(),a=this.element.getSize(),b={x:f.x+i.x,y:f.y+i.y};["x","y"].each(function(j){if(e.contains(j)){h[j]=f[j]-(a[j]-i[j])/2}if(h[j]==null){h[j]=g[j]}if(d&&d[j]){h[j]=h[j]+d[j]}},this);if(h.x!=g.x||h.y!=g.y){this.start(h.x,h.y)}return this}});Fx.Slide=new Class({Extends:Fx,options:{mode:"vertical",hideOverflow:true},initialize:function(b,a){this.addEvent("complete",function(){this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0);if(this.open&&Browser.Engine.webkit419){this.element.dispose().inject(this.wrapper)}},true);this.element=this.subject=document.id(b);this.parent(a);var d=this.element.retrieve("wrapper");var c=this.element.getStyles("margin","position","overflow");if(this.options.hideOverflow){c=$extend(c,{overflow:"hidden"})}this.wrapper=d||new Element("div",{styles:c}).wraps(this.element);this.element.store("wrapper",this.wrapper).setStyle("margin",0);this.now=[];this.open=true},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight},horizontal:function(){this.margin="margin-left";this.layout="width";this.offset=this.element.offsetWidth},set:function(a){this.element.setStyle(this.margin,a[0]);this.wrapper.setStyle(this.layout,a[1]);return this},compute:function(c,b,a){return[0,1].map(function(d){return Fx.compute(c[d],b[d],a)})},start:function(b,e){if(!this.check(b,e)){return this}this[e||this.options.mode]();var d=this.element.getStyle(this.margin).toInt();var c=this.wrapper.getStyle(this.layout).toInt();var a=[[d,c],[0,this.offset]];var g=[[d,c],[-this.offset,0]];var f;switch(b){case"in":f=a;break;case"out":f=g;break;case"toggle":f=(c==0)?a:g}return this.parent(f[0],f[1])},slideIn:function(a){return this.start("in",a)},slideOut:function(a){return this.start("out",a)},hide:function(a){this[a||this.options.mode]();this.open=false;return this.set([-this.offset,0])},show:function(a){this[a||this.options.mode]();this.open=true;return this.set([0,this.offset])},toggle:function(a){return this.start("toggle",a)}});Element.Properties.slide={set:function(b){var a=this.retrieve("slide");if(a){a.cancel()}return this.eliminate("slide").store("slide:options",$extend({link:"cancel"},b))},get:function(a){if(a||!this.retrieve("slide")){if(a||!this.retrieve("slide:options")){this.set("slide",a)}this.store("slide",new Fx.Slide(this,this.retrieve("slide:options")))}return this.retrieve("slide")}};Element.implement({slide:function(d,e){d=d||"toggle";var b=this.get("slide"),a;switch(d){case"hide":b.hide(e);break;case"show":b.show(e);break;case"toggle":var c=this.retrieve("slide:flag",b.open);b[c?"slideOut":"slideIn"](e);this.store("slide:flag",!c);a=true;break;default:b.start(d,e)}if(!a){this.eliminate("slide:flag")}return this}});var SmoothScroll=Fx.SmoothScroll=new Class({Extends:Fx.Scroll,initialize:function(b,c){c=c||document;this.doc=c.getDocument();var d=c.getWindow();this.parent(this.doc,b);this.links=$$(this.options.links||this.doc.links);var a=d.location.href.match(/^[^#]*/)[0]+"#";this.links.each(function(f){if(f.href.indexOf(a)!=0){return}var e=f.href.substr(a.length);if(e){this.useLink(f,e)}},this);if(!Browser.Engine.webkit419){this.addEvent("complete",function(){d.location.hash=this.anchor},true)}},useLink:function(c,a){var b;c.addEvent("click",function(d){if(b!==false&&!b){b=document.id(a)||this.doc.getElement("a[name="+a+"]")}if(b){d.preventDefault();this.anchor=a;this.toElement(b).chain(function(){this.fireEvent("scrolledTo",[c,b])}.bind(this));c.blur()}}.bind(this))}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Object.type,element:$defined});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=$type(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element;this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};this.attach()},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);return this},start:function(c){if(c.rightClick){return}if(this.options.preventDefault){c.preventDefault()}if(this.options.stopPropagation){c.stopPropagation()}this.mouse.start=c.page;this.fireEvent("beforeStart",this.element);var a=this.options.limit;this.limit={x:[],y:[]};for(var d in this.options.modifiers){if(!this.options.modifiers[d]){continue}if(this.options.style){this.value.now[d]=this.element.getStyle(this.options.modifiers[d]).toInt()}else{this.value.now[d]=this.element[this.options.modifiers[d]]}if(this.options.invert){this.value.now[d]*=-1}this.mouse.pos[d]=c.page[d]-this.value.now[d];if(a&&a[d]){for(var b=2;b--;b){if($chk(a[d][b])){this.limit[d][b]=$lambda(a[d][b])()}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});this.document.addEvent(this.selection,this.bound.eventStop)},check:function(a){if(this.options.preventDefault){a.preventDefault()}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element)}},drag:function(a){if(this.options.preventDefault){a.preventDefault()}this.mouse.now=a.page;for(var b in this.options.modifiers){if(!this.options.modifiers[b]){continue}this.value.now[b]=this.mouse.now[b]-this.mouse.pos[b];if(this.options.invert){this.value.now[b]*=-1}if(this.options.limit&&this.limit[b]){if($chk(this.limit[b][1])&&(this.value.now[b]>this.limit[b][1])){this.value.now[b]=this.limit[b][1]}else{if($chk(this.limit[b][0])&&(this.value.now[b]<this.limit[b][0])){this.value.now[b]=this.limit[b][0]}}}if(this.options.grid[b]){this.value.now[b]-=((this.value.now[b]-(this.limit[b][0]||0))%this.options.grid[b])}if(this.options.style){this.element.setStyle(this.options.modifiers[b],this.value.now[b]+this.options.unit)}else{this.element[this.options.modifiers[b]]=this.value.now[b]}}this.fireEvent("drag",[this.element,a])},cancel:function(a){this.document.removeEvent("mousemove",this.bound.check);this.document.removeEvent("mouseup",this.bound.cancel);if(a){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element)}},stop:function(a){this.document.removeEvent(this.selection,this.bound.eventStop);this.document.removeEvent("mousemove",this.bound.drag);this.document.removeEvent("mouseup",this.bound.stop);if(a){this.fireEvent("complete",[this.element,a])}}});Element.implement({makeResizable:function(a){var b=new Drag(this,$merge({modifiers:{x:"width",y:"height"}},a));this.store("resizer",b);return b.addEvent("drag",function(){this.fireEvent("resize",b)}.bind(this))}});Drag.Move=new Class({Extends:Drag,options:{droppables:[],container:false,precalculate:false,includeMargins:true,checkDroppables:true},initialize:function(b,a){this.parent(b,a);b=this.element;this.droppables=$$(this.options.droppables);this.container=document.id(this.options.container);if(this.container&&$type(this.container)!="element"){this.container=document.id(this.container.getDocument().body)}var c=b.getStyles("left","right","position");if(c.left=="auto"||c.top=="auto"){b.setPosition(b.getPosition(b.getOffsetParent()))}if(c.position=="static"){b.setStyle("position","absolute")}this.addEvent("start",this.checkDroppables,true);this.overed=null},start:function(a){if(this.container){this.options.limit=this.calculateLimit()}if(this.options.precalculate){this.positions=this.droppables.map(function(b){return b.getCoordinates()})}this.parent(a)},calculateLimit:function(){var d=this.element.getOffsetParent(),g=this.container.getCoordinates(d),f={},c={},b={},i={},k={};["top","right","bottom","left"].each(function(o){f[o]=this.container.getStyle("border-"+o).toInt();b[o]=this.element.getStyle("border-"+o).toInt();c[o]=this.element.getStyle("margin-"+o).toInt();i[o]=this.container.getStyle("margin-"+o).toInt();k[o]=d.getStyle("padding-"+o).toInt()},this);var e=this.element.offsetWidth+c.left+c.right,n=this.element.offsetHeight+c.top+c.bottom,h=0,j=0,m=g.right-f.right-e,a=g.bottom-f.bottom-n;if(this.options.includeMargins){h+=c.left;j+=c.top}else{m+=c.right;a+=c.bottom}if(this.element.getStyle("position")=="relative"){var l=this.element.getCoordinates(d);l.left-=this.element.getStyle("left").toInt();l.top-=this.element.getStyle("top").toInt();h+=f.left-l.left;j+=f.top-l.top;m+=c.left-l.left;a+=c.top-l.top;if(this.container!=d){h+=i.left+k.left;j+=(Browser.Engine.trident4?0:i.top)+k.top}}else{h-=c.left;j-=c.top;if(this.container==d){m-=f.left;a-=f.top}else{h+=g.left+f.left;j+=g.top+f.top}}return{x:[h,m],y:[j,a]}},checkAgainst:function(c,b){c=(this.positions)?this.positions[b]:c.getCoordinates();var a=this.mouse.now;return(a.x>c.left&&a.x<c.right&&a.y<c.bottom&&a.y>c.top)},checkDroppables:function(){var a=this.droppables.filter(this.checkAgainst,this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed])}if(a){this.fireEvent("enter",[this.element,a])}this.overed=a}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables()}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a)}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a);this.store("dragger",b);return b}});Class.Mutators.Binds=function(a){return a};Class.Mutators.initialize=function(a){return function(){$splat(this.Binds).each(function(b){var c=this[b];if(c){this[b]=c.bind(this)}},this);return a.apply(this,arguments)}};Element.implement({measure:function(e){var g=function(h){return !!(!h||h.offsetHeight||h.offsetWidth)};if(g(this)){return e.apply(this)}var d=this.getParent(),f=[],b=[];while(!g(d)&&d!=document.body){b.push(d.expose());d=d.getParent()}var c=this.expose();var a=e.apply(this);c();b.each(function(h){h()});return a},expose:function(){if(this.getStyle("display")!="none"){return $empty}var a=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a}.bind(this)},getDimensions:function(a){a=$merge({computeSize:false},a);var f={};var d=function(g,e){return(e.computeSize)?g.getComputedSize(e):g.getSize()};var b=this.getParent("body");if(b&&this.getStyle("display")=="none"){f=this.measure(function(){return d(this,a)})}else{if(b){try{f=d(this,a)}catch(c){}}else{f={x:0,y:0}}}return $chk(f.x)?$extend(f,{width:f.x,height:f.y}):$extend(f,{x:f.width,y:f.height})},getComputedSize:function(a){a=$merge({styles:["padding","border"],plains:{height:["top","bottom"],width:["left","right"]},mode:"both"},a);var c={width:0,height:0};switch(a.mode){case"vertical":delete c.width;delete a.plains.width;break;case"horizontal":delete c.height;delete a.plains.height;break}var b=[];$each(a.plains,function(g,f){g.each(function(h){a.styles.each(function(i){b.push((i=="border")?i+"-"+h+"-width":i+"-"+h)})})});var e={};b.each(function(f){e[f]=this.getComputedStyle(f)},this);var d=[];$each(a.plains,function(g,f){var h=f.capitalize();c["total"+h]=c["computed"+h]=0;g.each(function(i){c["computed"+i.capitalize()]=0;b.each(function(k,j){if(k.test(i)){e[k]=e[k].toInt()||0;c["total"+h]=c["total"+h]+e[k];c["computed"+i.capitalize()]=c["computed"+i.capitalize()]+e[k]}if(k.test(i)&&f!=k&&(k.test("border")||k.test("padding"))&&!d.contains(k)){d.push(k);c["computed"+h]=c["computed"+h]-e[k]}})})});["Width","Height"].each(function(g){var f=g.toLowerCase();if(!$chk(c[f])){return}c[f]=c[f]+this["offset"+g]+c["computed"+g];c["total"+g]=c[f]+c["total"+g];delete c["computed"+g]},this);return $extend(e,c)}});var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){if(this.options.snap){a=this.toPosition(this.step)}this.knob.setStyle(this.property,a)},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);this.element=document.id(f);this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var g,b={},d={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";g="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";g="offsetWidth"}this.full=this.element.measure(function(){this.half=this.knob[g]/2;return this.element[g]-this.knob[g]+(this.options.offset*2)}.bind(this));this.min=$chk(this.options.range[0])?this.options.range[0]:0;this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,this.options.initialStep?this.toPosition(this.options.initialStep):-this.options.offset);d[this.axis]=this.property;b[this.axis]=[-this.options.offset,this.full-this.options.offset];var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true}).bind(this),onCancel:function(){this.isDragging=false}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end()}.bind(this)};if(this.options.snap){c.grid=Math.ceil(this.stepWidth);c.limit[this.axis][1]=this.full}this.drag=new Drag(this.knob,c);this.attach()},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement)}this.drag.attach();return this},detach:function(){this.element.removeEvent("mousedown",this.clickedElement);this.element.removeEvent("mousewheel",this.scrolledElement);this.drag.detach();return this},set:function(a){if(!((this.range>0)^(a<this.min))){a=this.min}if(!((this.range>0)^(a>this.max))){a=this.max}this.step=Math.round(a);this.checkStep();this.fireEvent("tick",this.toPosition(this.step));this.end();return this},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return}var b=this.range<0?-1:1;var a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();this.fireEvent("tick",a);this.end()},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0);this.set(b?this.step-this.stepSize:this.step+this.stepSize);a.stop()},draggedKnob:function(){var b=this.range<0?-1:1;var a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep()},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;this.fireEvent("change",this.step)}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"")}},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset}});var Sortables=new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(a,b){this.setOptions(b);this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false}if(this.options.revert){this.effect=new Fx.Morph(null,$merge({duration:250,link:"cancel"},this.options.revert))}},attach:function(){this.addLists(this.lists);return this},detach:function(){this.lists=this.removeLists(this.lists);return this},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a);var b=a.retrieve("sortables:start",this.start.bindWithEvent(this,a));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b)},this);return this},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.push(a);this.addItems(a.getChildren())},this);return this},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b);return a},this))},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a},this))},getClone:function(b,a){if(!this.options.clone){return new Element("div").inject(document.body)}if($type(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list)}return a.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:a.getStyle("width")}).inject(this.list).setPosition(a.getPosition(a.getOffsetParent()))},getDroppables:function(){var a=this.list.getChildren();if(!this.options.constrain){a=this.lists.concat(a).erase(this.list)}return a.erase(this.clone).erase(this.element)},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b;this.drag.droppables=this.getDroppables()}else{a=this.element.getAllPrevious().contains(b)?"before":"after"}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone])},start:function(b,a){if(!this.idle){return}this.idle=false;this.element=a;this.opacity=a.get("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,{snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables(),onSnap:function(){b.stop();this.clone.setStyle("visibility","visible");this.element.set("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone])}.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b)},end:function(){this.drag.detach();this.element.set("opacity",this.opacity);if(this.effect){var a=this.element.getStyles("width","height");var b=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));this.effect.element=this.clone;this.effect.start({top:b.top,left:b.left,width:a.width,height:a.height,opacity:0.25}).chain(this.reset.bind(this))}else{this.reset()}},reset:function(){this.idle=true;this.clone.destroy();this.fireEvent("complete",this.element)},serialize:function(){var c=Array.link(arguments,{modifier:Function.type,index:$defined});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id")},this)},this);var a=c.index;if(this.lists.length==1){a=0}return $chk(a)&&a>=0&&a<this.lists.length?b[a]:b}});var Color=new Native({initialize:function(b,c){if(arguments.length>=3){c="rgb";b=Array.slice(arguments,0,3)}else{if(typeof b=="string"){if(b.match(/rgb/)){b=b.rgbToHex().hexToRgb(true)}else{if(b.match(/hsb/)){b=b.hsbToRgb()}else{b=b.hexToRgb(true)}}}}c=c||"rgb";switch(c){case"hsb":var a=b;b=b.hsbToRgb();b.hsb=a;break;case"hex":b=b.hexToRgb(true);break}b.rgb=b.slice(0,3);b.hsb=b.hsb||b.rgbToHsb();b.hex=b.rgbToHex();return $extend(b,this)}});Color.implement({mix:function(){var a=Array.slice(arguments);var c=($type(a.getLast())=="number")?a.pop():50;var b=this.slice();a.each(function(d){d=new Color(d);for(var e=0;e<3;e++){b[e]=Math.round((b[e]/100*(100-c))+(d[e]/100*c))}});return new Color(b,"rgb")},invert:function(){return new Color(this.map(function(a){return 255-a}))},setHue:function(a){return new Color([a,this.hsb[1],this.hsb[2]],"hsb")},setSaturation:function(a){return new Color([this.hsb[0],a,this.hsb[2]],"hsb")},setBrightness:function(a){return new Color([this.hsb[0],this.hsb[1],a],"hsb")}});var $RGB=function(d,c,a){return new Color([d,c,a],"rgb")};var $HSB=function(d,c,a){return new Color([d,c,a],"hsb")};var $HEX=function(a){return new Color(a,"hex")};Array.implement({rgbToHsb:function(){var b=this[0],c=this[1],j=this[2],g=0;var i=Math.max(b,c,j),e=Math.min(b,c,j);var k=i-e;var h=i/255,f=(i!=0)?k/i:0;if(f!=0){var d=(i-b)/k;var a=(i-c)/k;var l=(i-j)/k;if(b==i){g=l-a}else{if(c==i){g=2+d-l}else{g=4+a-d}}g/=6;if(g<0){g++}}return[Math.round(g*360),Math.round(f*100),Math.round(h*100)]},hsbToRgb:function(){var c=Math.round(this[2]/100*255);if(this[1]==0){return[c,c,c]}else{var a=this[0]%360;var e=a%60;var g=Math.round((this[2]*(100-this[1]))/10000*255);var d=Math.round((this[2]*(6000-this[1]*e))/600000*255);var b=Math.round((this[2]*(6000-this[1]*(60-e)))/600000*255);switch(Math.floor(a/60)){case 0:return[c,b,g];case 1:return[d,c,g];case 2:return[g,c,b];case 3:return[g,d,c];case 4:return[b,g,c];case 5:return[c,g,d]}}return false}});String.implement({rgbToHsb:function(){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHsb():null},hsbToRgb:function(){var a=this.match(/\d{1,3}/g);return(a)?a.hsbToRgb():null}});var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={}},addEvent:function(b,a){this.checker[b]=this.checker[b]||{};this.events[b]=this.events[b]||[];if(this.events[b].contains(a)){return false}else{this.events[b].push(a)}this.instances.each(function(c,d){c.addEvent(b,this.check.bind(this,[b,c,d]))},this);return this},check:function(c,a,b){this.checker[c][b]=true;var d=this.instances.every(function(f,e){return this.checker[c][e]||false},this);if(!d){return}this.checker[c]={};this.events[c].each(function(e){e.call(this,this.instances,a)},this)}});Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(b,a){this.parent(b,a);this.load()},save:function(){var a=JSON.encode(this.hash);if(!a||a.length>4096){return false}if(a=="{}"){this.dispose()}else{this.write(a)}return true},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this}});Hash.each(Hash.prototype,function(b,a){if(typeof b=="function"){Hash.Cookie.implement(a,function(){var c=b.apply(this.hash,arguments);if(this.options.autoSave){this.save()}return c})}});var Scroller=new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(a,b){this.element.scrollTo(a,b)},fps:50},initialize:function(b,a){this.setOptions(a);this.element=document.id(b);this.listener=($type(this.element)!="element")?document.id(this.element.getDocument().body):this.element;this.timer=null;this.bound={attach:this.attach.bind(this),detach:this.detach.bind(this),getCoords:this.getCoords.bind(this)}},start:function(){this.listener.addEvents({mouseover:this.bound.attach,mouseout:this.bound.detach})},stop:function(){this.listener.removeEvents({mouseover:this.bound.attach,mouseout:this.bound.detach});this.detach();this.timer=$clear(this.timer)},attach:function(){this.listener.addEvent("mousemove",this.bound.getCoords)},detach:function(){this.listener.removeEvent("mousemove",this.bound.getCoords);this.timer=$clear(this.timer)},getCoords:function(a){this.page=(this.listener.get("tag")=="body")?a.client:a.page;if(!this.timer){this.timer=this.scroll.periodical(Math.round(1000/this.options.fps),this)}},scroll:function(){var b=this.element.getSize(),a=this.element.getScroll(),f=this.element.getOffsets(),c=this.element.getScrollSize(),e={x:0,y:0};for(var d in this.page){if(this.page[d]<(this.options.area+f[d])&&a[d]!=0){e[d]=(this.page[d]-this.options.area-f[d])*this.options.velocity}else{if(this.page[d]+this.options.area>(b[d]+f[d])&&a[d]+b[d]!=c[d]){e[d]=(this.page[d]-b[d]+this.options.area-f[d])*this.options.velocity}}}if(e.y||e.x){this.fireEvent("change",[a.x+e.x,a.y+e.y])}}});(function(){var a=function(c,b){return(c)?($type(c)=="function"?c(b):b.get(c)):""};this.Tips=new Class({Implements:[Events,Options],options:{onShow:function(){this.tip.setStyle("display","block")},onHide:function(){this.tip.setStyle("display","none")},title:"title",text:function(b){return b.get("rel")||b.get("href")},showDelay:100,hideDelay:100,className:"tip-wrap",offset:{x:16,y:16},windowPadding:{x:0,y:0},fixed:false},initialize:function(){var b=Array.link(arguments,{options:Object.type,elements:$defined});this.setOptions(b.options);if(b.elements){this.attach(b.elements)}this.container=new Element("div",{"class":"tip"})},toElement:function(){if(this.tip){return this.tip}this.container=new Element("div",{"class":"tip"});return this.tip=new Element("div",{"class":this.options.className,styles:{position:"absolute",top:0,left:0}}).adopt(new Element("div",{"class":"tip-top"}),this.container,new Element("div",{"class":"tip-bottom"})).inject(document.body)},attach:function(b){$$(b).each(function(d){var f=a(this.options.title,d),e=a(this.options.text,d);d.erase("title").store("tip:native",f).retrieve("tip:title",f);d.retrieve("tip:text",e);this.fireEvent("attach",[d]);var c=["enter","leave"];if(!this.options.fixed){c.push("move")}c.each(function(h){var g=d.retrieve("tip:"+h);if(!g){g=this["element"+h.capitalize()].bindWithEvent(this,d)}d.store("tip:"+h,g).addEvent("mouse"+h,g)},this)},this);return this},detach:function(b){$$(b).each(function(d){["enter","leave","move"].each(function(e){d.removeEvent("mouse"+e,d.retrieve("tip:"+e)).eliminate("tip:"+e)});this.fireEvent("detach",[d]);if(this.options.title=="title"){var c=d.retrieve("tip:native");if(c){d.set("title",c)}}},this);return this},elementEnter:function(c,b){this.container.empty();["title","text"].each(function(e){var d=b.retrieve("tip:"+e);if(d){this.fill(new Element("div",{"class":"tip-"+e}).inject(this.container),d)}},this);$clear(this.timer);this.timer=(function(){this.show(b);this.position((this.options.fixed)?{page:b.getPosition()}:c)}).delay(this.options.showDelay,this)},elementLeave:function(c,b){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this,b);this.fireForParent(c,b)},fireForParent:function(c,b){b=b.getParent();if(!b||b==document.body){return}if(b.retrieve("tip:enter")){b.fireEvent("mouseenter",c)}else{this.fireForParent(c,b)}},elementMove:function(c,b){this.position(c)},position:function(e){if(!this.tip){document.id(this)}var c=window.getSize(),b=window.getScroll(),f={x:this.tip.offsetWidth,y:this.tip.offsetHeight},d={x:"left",y:"top"},g={};for(var h in d){g[d[h]]=e.page[h]+this.options.offset[h];if((g[d[h]]+f[h]-b[h])>c[h]-this.options.windowPadding[h]){g[d[h]]=e.page[h]-this.options.offset[h]-f[h]}}this.tip.setStyles(g)},fill:function(b,c){if(typeof c=="string"){b.set("html",c)}else{b.adopt(c)}},show:function(b){if(!this.tip){document.id(this)}this.fireEvent("show",[this.tip,b])},hide:function(b){if(!this.tip){document.id(this)}this.fireEvent("hide",[this.tip,b])}})})();var Asset={javascript:function(f,d){d=$extend({onload:$empty,document:document,check:$lambda(true)},d);var b=new Element("script",{src:f,type:"text/javascript"});var e=d.onload.bind(b),a=d.check,g=d.document;delete d.onload;delete d.check;delete d.document;b.addEvents({load:e,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){e()}}}).set(d);if(Browser.Engine.webkit419){var c=(function(){if(!$try(a)){return}$clear(c);e()}).periodical(50)}return b.inject(g.head)},css:function(b,a){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:b},a)).inject(document.head)},image:function(c,b){b=$merge({onload:$empty,onabort:$empty,onerror:$empty},b);var d=new Image();var a=document.id(d)||new Element("img");["load","abort","error"].each(function(e){var f="on"+e;var g=b[f];delete b[f];d[f]=function(){if(!d){return}if(!a.parentNode){a.width=d.width;a.height=d.height}d=d.onload=d.onabort=d.onerror=null;g.delay(1,a,a);a.fireEvent(e,a,1)}});d.src=a.src=c;if(d&&d.complete){d.onload.delay(1)}return a.set(b)},images:function(d,c){c=$merge({onComplete:$empty,onProgress:$empty,onError:$empty,properties:{}},c);d=$splat(d);var a=[];var b=0;return new Elements(d.map(function(e){return Asset.image(e,$extend(c.properties,{onload:function(){c.onProgress.call(this,b,d.indexOf(e));b++;if(b==d.length){c.onComplete()}},onerror:function(){c.onError.call(this,b,d.indexOf(e));b++;if(b==d.length){c.onComplete()}}}))}))}};if(!window.console){var console={}}if(!console.log){console.log=function(){}}if(!console.warn){console.warn=console.log}if(!console.error){console.error=console.warn}MooTools.upgradeLog=function(){if(console[this.upgradeLogLevel]){console[this.upgradeLogLevel].apply(console,arguments)}};(function(){oldA=$A;window.$A=function(k,m,j){if(m!=undefined&&j!=undefined){MooTools.upgradeLog("1.1 > 1.2: $A no longer takes start and length arguments.");if(Browser.Engine.trident&&$type(k)=="collection"){m=m||0;if(m<0){m=k.length+m}j=j||(k.length-m);var l=[];for(var h=0;h<j;h++){l[h]=k[m++]}return l}m=(m||0)+((m<0)?k.length:0);var g=((!$chk(j))?k.length:j)+m;return Array.prototype.slice.call(k,m,g)}return oldA(k)};var e=["Array","Function","String","RegExp","Number","Window","Document","Element","Elements"];for(var c=0,b=e.length;c<b;c++){var d=e[c];var a=window[d];if(a){var f=a.extend;a.extend=function(g){MooTools.upgradeLog("1.1 > 1.2: native types no longer use .extend to add methods to prototypes but instead use .implement. NOTE: YOUR METHODS WERE NOT IMPLEMENTED ON THE NATIVE "+d.toUpperCase()+" PROTOTYPE.");return f.apply(this,arguments)}}}})();window.onDomReady=Window.onDomReady=function(a){MooTools.upgradeLog('1.1 > 1.2: window.onDomReady is no longer supported. Use window.addEvent("domready") instead');return window.addEvent("domready",a)};if(Browser.__defineGetter__){Browser.__defineGetter__("hasGetter",function(){return true})}if(Browser.hasGetter){window.__defineGetter__("ie",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie is deprecated. Use Browser.Engine.trident");return(Browser.Engine.name=="trident")?true:false});window.__defineGetter__("ie6",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie6 is deprecated. Use Browser.Engine.trident and Browser.Engine.version");return(Browser.Engine.name=="trident"&&Browser.Engine.version==4)?true:false});window.__defineGetter__("ie7",function(){MooTools.upgradeLog("1.1 > 1.2: window.ie7 is deprecated. Use Browser.Engine.trident and Browser.Engine.version");return(Browser.Engine.name=="trident"&&Browser.Engine.version==5)?true:false});window.__defineGetter__("gecko",function(){MooTools.upgradeLog("1.1 > 1.2: window.gecko is deprecated. Use Browser.Engine.gecko");return(Browser.Engine.name=="gecko")?true:false});window.__defineGetter__("webkit",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit");return(Browser.Engine.name=="webkit")?true:false});window.__defineGetter__("webkit419",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version");return(Browser.Engine.name=="webkit"&&Browser.Engine.version==419)?true:false});window.__defineGetter__("webkit420",function(){MooTools.upgradeLog("1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version");return(Browser.Engine.name=="webkit"&&Browser.Engine.version==420)?true:false});window.__defineGetter__("opera",function(){MooTools.upgradeLog("1.1 > 1.2: window.opera is deprecated. Use Browser.Engine.presto");return(Browser.Engine.name=="presto")?true:false})}else{window[Browser.Engine.name]=window[Browser.Engine.name+Browser.Engine.version]=true;window.ie=window.trident;window.ie6=window.trident4;window.ie7=window.trident5}Array.implement({copy:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Array.copy is deprecated. Use Array.splice");return $A(this,b,a)},remove:function(a){MooTools.upgradeLog("1.1 > 1.2: Array.remove is deprecated. Use Array.erase");return this.erase(a)},merge:function(a){MooTools.upgradeLog("1.1 > 1.2: Array.merge is deprecated. Use Array.combine");return this.combine(a)}});Function.implement({bindAsEventListener:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Function.bindAsEventListener is deprecated. Use bindWithEvent.");return this.bindWithEvent.call(this,b,a)}});Function.empty=function(){MooTools.upgradeLog("1.1 > 1.2: Function.empty is now just $empty.")};Hash.implement({keys:function(){MooTools.upgradeLog("1.1 > 1.2: Hash.keys is deprecated. Use Hash.getKeys");return this.getKeys()},values:function(){MooTools.upgradeLog("1.1 > 1.2: Hash.values is deprecated. Use Hash.getValues");return this.getValues()},hasKey:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.hasKey is deprecated. Use Hash.has");return this.has(a)},merge:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.merge is deprecated. Use Hash.combine");return this.extend(a)},remove:function(a){MooTools.upgradeLog("1.1 > 1.2: Hash.remove is deprecated. use Hash.erase");return this.erase(a)}});Object.toQueryString=function(a){MooTools.upgradeLog("1.1 > 1.2: Object.toQueryString() is deprecated. use Hash.toQueryString() instead");$H(a).each(function(c,b){if($type(c)=="object"||$type(c)=="array"){a[b]=c.toString()}});return Hash.toQueryString(a)};var Abstract=function(a){MooTools.upgradeLog("1.1 > 1.2: Abstract is deprecated. Use Hash");return new Hash(a)};Class.empty=function(){MooTools.upgradeLog("1.1 > 1.2: replace Class.empty with $empty");return $empty};(function(){var a=function(d){var c=function(){return this};c.prototype=d;return c};Class.prototype.extend=function(d){MooTools.upgradeLog("1.1 > 1.2: Class.extend is deprecated. See the class Extend mutator.");var c=a(d);var e=new c();e.Extends=this;return new Class(e)};var b=Class.prototype.implement;Class.prototype.implement=function(){if(arguments.length>1&&Array.every(arguments,Object.type)){MooTools.upgradeLog("1.1 > 1.2: Class.implement no longer takes more than one thing at a time, either MyClass.implement(key, value) or MyClass.implement(object) but NOT MyClass.implement(new Foo, new Bar, new Baz). See also: the class Implements mutator.");Array.each(arguments,function(c){b.call(this,c)},this);return this}return b.apply(this,arguments)}})();(function(){var c=Element.prototype.getPosition;var a=Element.prototype.getCoordinates;function b(e){return(/^(?:body|html)$/i).test(e.tagName)}var d=Element.prototype.getSize;Element.implement({getSize:function(){MooTools.upgradeLog("1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.");var e=d.apply(this,arguments);return $merge(e,{size:e,scroll:this.getScroll(),scrollSize:this.getScrollSize()})},getPosition:function(e){if(e&&$type(e)=="array"){MooTools.upgradeLog("1.1 > 1.2: Element.getPosition no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.");e=null}return c.apply(this,[e])},getCoordinates:function(e){if(e&&$type(e)=="array"){MooTools.upgradeLog("1.1 > 1.2: Element.getCoordinates no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.");e=null}return a.apply(this,[e])}});Native.implement([Document,Window],{getSize:function(){MooTools.upgradeLog("1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.");var e;var g=this.getWindow();var f=this.getDocument();f=(!f.compatMode||f.compatMode=="CSS1Compat")?f.html:f.body;if(Browser.Engine.presto||Browser.Engine.webkit){e={x:g.innerWidth,y:g.innerHeight}}else{e={x:f.clientWidth,y:f.clientHeight}}return $extend(e,{size:e,scroll:{x:g.pageXOffset||f.scrollLeft,y:g.pageYOffset||f.scrollTop},scrollSize:{x:Math.max(f.scrollWidth,e.x),y:Math.max(f.scrollHeight,e.y)}})}})})();Event.keys=Event.Keys;(function(){var a=Element.prototype.toQueryString;Element.implement({getFormElements:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getFormElements is deprecated, use Element.getElements("input, textarea, select");');return this.getElements("input, textarea, select")},replaceWith:function(b){MooTools.upgradeLog("1.1 > 1.2: Element.replaceWith is deprecated, use Element.replaces instead.");b=$(b);this.parentNode.replaceChild(b,this);return b},remove:function(){MooTools.upgradeLog("1.1 > 1.2: Element.remove is deprecated - use Element.dispose.");return this.dispose.apply(this,arguments)},getText:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getText is deprecated - use Element.get("text").');return this.get("text")},setText:function(b){MooTools.upgradeLog('1.1 > 1.2: Element.setText is deprecated - use Element.set("text", text).');return this.set("text",b)},setHTML:function(){MooTools.upgradeLog('1.1 > 1.2: Element.setHTML is deprecated - use Element.set("html", HTML).');return this.set("html",arguments)},getHTML:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getHTML is deprecated - use Element.get("html").');return this.get("html")},getTag:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getTag is deprecated - use Element.get("tag").');return this.get("tag")},getValue:function(){MooTools.upgradeLog('1.1 > 1.2: Element.getValue is deprecated - use Element.get("value").');switch(this.getTag()){case"select":var b=[];$each(this.options,function(c){if(c.selected){b.push($pick(c.value,c.text))}});return(this.multiple)?b:b[0];case"input":if(!(this.checked&&["checkbox","radio"].contains(this.type))&&!["hidden","text","password"].contains(this.type)){break}case"textarea":return this.value}return false},toQueryString:function(){MooTools.upgradeLog("1.1 > 1.2: warning Element.toQueryString is slightly different; inputs without names are excluded, inputs with type == submit, reset, and file are excluded, and inputs with undefined values are excluded.");return a.apply(this,arguments)}})})();Element.Properties.properties={set:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.set({properties: {}}) is deprecated; instead of properties, just name the values at the root of the object (Element.set({src: url})).");$H(a).each(function(c,b){this.set(b,c)},this)}};Element.implement({setOpacity:function(a){MooTools.upgradeLog('1.1 > 1.2: Element.setOpacity is deprecated; use Element.setStyle("opacity", value).');return this.setStyle("opacity",a)}});Element.Properties.styles={set:function(a){MooTools.upgradeLog('1.1 > 1.2: Element.set("styles") no longer accepts a string as an argument. Pass an object instead.');if($type(a)=="string"){a.split(";").each(function(b){this.setStyle(b.split(":")[0],b.split(":")[1])},this)}else{this.setStyles(a)}}};Fx.implement({custom:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Fx.custom is deprecated. use Fx.start.");return this.start(b,a)},clearTimer:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.clearTimer is deprecated. use Fx.cancel.");return this.cancel()},stop:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.stop is deprecated. use Fx.cancel.");return this.cancel()}});Fx.Base=new Class({Extends:Fx,initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Base is deprecated. use Fx.");this.parent.apply(this,arguments)}});Fx.Style=new Class({Extends:Fx.Tween,initialize:function(b,c,a){MooTools.upgradeLog("1.1 > 1.2: Fx.Style is deprecated. use Fx.Tween.");this.property=c;this.parent(b,a)},start:function(b,a){return this.parent(this.property,b,a)},set:function(a){return this.parent(this.property,a)},hide:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Style .hide() is deprecated; use Fx.Tween .set(0) instead");return this.set(0)}});Element.implement({effect:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Element.effect is deprecated; use Fx.Tween or Element.tween.");return new Fx.Style(this,b,a)}});Fx.Styles=new Class({Extends:Fx.Morph,initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Fx.Styles is deprecated. use Fx.Morph.");this.parent.apply(this,arguments)}});Element.implement({effects:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.effects is deprecated; use Fx.Morph or Element.morph.");return new Fx.Morph(this,a)}});Fx.Scroll.implement({scrollTo:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Fx.Scroll's .scrollTo is deprecated; use .start.");return this.start(b,a)}});Request.implement({onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status}.bind(this));this.xhr.onreadystatechange=$empty;this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml)}else{this.failure(this.response.text,this.response.xml)}},failure:function(){this.onFailure.apply(this,arguments)},onFailure:function(){MooTools.upgradeLog("1.1 > 1.2: Note that onComplete does not receive arguments in 1.2. Also note that onComplete is invoked on BOTH success and failure (while in 1.1 it was only invoked on success). Use the onSuccess event instead if you wish to limit this invocation to success.");this.fireEvent("complete",arguments).fireEvent("failure",this.xhr)}});var XHR=new Class({Extends:Request,options:{update:false},initialize:function(a){MooTools.upgradeLog("1.1 > 1.2: XHR is deprecated. Use Request.");this.parent(a);this.transport=this.xhr},request:function(a){MooTools.upgradeLog("1.1 > 1.2: XHR.request() is deprecated. Use Request.send() instead.");return this.send(this.url,a||this.options.data)},send:function(a,b){if(!this.check(arguments.callee,a,b)){return this}return this.parent({url:a,data:b})},success:function(b,a){b=this.processScripts(b);if(this.options.update){$(this.options.update).empty().set("html",b)}this.onSuccess(b,a)},failure:function(){this.fireEvent("failure",this.xhr)}});var Ajax=new Class({Extends:XHR,initialize:function(b,a){MooTools.upgradeLog("1.1 > 1.2: Ajax is deprecated. Use Request.");this.url=b;this.parent(a)},success:function(b,a){this.processScripts(b);response=this.response;response.html=b.stripScripts(function(c){response.javascript=c});if(this.options.update){$(this.options.update).empty().set("html",response.html)}if(this.options.evalScripts){$exec(response.javascript)}this.onSuccess(b,a)}});(function(){var a=Element.prototype.send;Element.implement({send:function(b){if($type(b)=="string"){return a.apply(this,arguments)}if($type(b)=="object"){MooTools.upgradeLog("1.1 > 1.2: Element.send no longer takes an options argument as its object but rather a url. See docs.");this.set("send",b);a.call(this)}return this}})})();JSON.Remote=new Class({options:{key:"json"},Extends:Request.JSON,initialize:function(b,a){MooTools.upgradeLog("JSON.Remote is deprecated. Use Request.JSON");this.parent(a);this.onComplete=$empty;this.url=b},send:function(a){if(!this.check(arguments.callee,a)){return this}return this.parent({url:this.url,data:{json:Json.encode(a)}})},failure:function(){this.fireEvent("failure",this.xhr)}});Cookie.set=function(b,c,a){MooTools.upgradeLog("1.1 > 1.2: Cookie.set is deprecated. Use Cookie.write");return new Cookie(b,a).write(c)};Cookie.get=function(a){MooTools.upgradeLog("1.1 > 1.2: Cookie.get is deprecated. Use Cookie.read");return new Cookie(a).read()};Cookie.remove=function(b,a){MooTools.upgradeLog("1.1 > 1.2: Cookie.remove is deprecated. Use Cookie.dispose");return new Cookie(b,a).dispose()};JSON.toString=function(a){MooTools.upgradeLog("1.1 > 1.2: JSON.toString is deprecated. Use JSON.encode");return JSON.encode(a)};JSON.evaluate=function(a){MooTools.upgradeLog("1.1 > 1.2: JSON.evaluate is deprecated. Use JSON.decode");return JSON.decode(a)};var Json=JSON;Native.implement([Element,Document],{getElementsByClassName:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.filterByTag is deprecated.");return this.getElements("."+a)},getElementsBySelector:function(a){MooTools.upgradeLog("1.1 > 1.2: Element.getElementsBySelector is deprecated. Use getElements()");return this.getElements(a)}});Elements.implement({filterByTag:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByTag is deprecated. Use Elements.filter.");return this.filter(a)},filterByClass:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByClass is deprecated. Use Elements.filter.");return this.filter("."+a)},filterById:function(a){MooTools.upgradeLog("1.1 > 1.2: Elements.filterById is deprecated. Use Elements.filter.");return this.filter("#"+a)},filterByAttribute:function(c,a,d){MooTools.upgradeLog("1.1 > 1.2: Elements.filterByAttribute is deprecated. Use Elements.filter.");var b=this.filter("["+c+(a||"")+(d||"")+"]");if(d){b=b.filter("["+c+"]")}return b}});var $E=function(a,b){MooTools.upgradeLog("1.1 > 1.2: $E is deprecated, use document.getElement.");return($(b)||document).getElement(a)};var $ES=function(a,b){MooTools.upgradeLog("1.1 > 1.2: $ES is deprecated. Use $$.");return($(b)||document).getElements(a)};(function(){if(!window.Tips){return}Tips.implement({initialize:function(){MooTools.upgradeLog("1.1 > 1.2: Tips DOM element layout has changed and your CSS classes may need to change.");var a=Array.link(arguments,{options:Object.type,elements:$defined});this.setOptions(a.options);if(this.options.offsets){MooTools.upgradeLog('1.1 > 1.2: Tips no longer have an "offsets" option; use "offset".');this.options.offset=this.options.offsets}document.id(this);this.addEvent("show",function(){this.tip.addClass("tool-tip");this.tip.getElement(".tip-title").addClass("tool-title");this.tip.getElement(".tip-text").addClass("tool-text")});this.parseTitle(a.elements);if(a.elements){this.attach(a.elements)}},parseTitle:function(a){a.each(function(b){var c=b.get("title");if(c.test("::")){MooTools.upgradeLog('1.1 > 1.2: Tips no longer parse the title attribute for "::" for title/caption; use title and rel attributes instead.');b.store("tip:title",c.split("::")[0]);b.store("tip:text",c.split("::")[1]);b.set("title","")}})}})})();
\ No hay ningún carácter de nueva línea al final del fichero
diff -aruN --binary 18/plugins/system/mtupgrade/mootools-uncompressed.js 20/plugins/system/mtupgrade/mootools-uncompressed.js
--- 18/plugins/system/mtupgrade/mootools-uncompressed.js	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade/mootools-uncompressed.js	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1,7137 @@
+//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
+//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.
+
+//Contents: Core, Browser, Array, Function, Number, String, Hash, Event, Class, Class.Extras, Element, Element.Event, Element.Style, Element.Dimensions, Selectors, DomReady, JSON, Cookie, Swiff, Fx, Fx.CSS, Fx.Tween, Fx.Morph, Fx.Transitions, Request, Request.HTML, Request.JSON, More, Fx.Elements, Fx.Accordion, Fx.Scroll, Fx.Slide, Fx.SmoothScroll, Drag, Drag.Move, Class.Binds, Element.Measure, Slider, Sortables, Color, Group, Hash.Cookie, Scroller, Tips
+
+/*
+---
+
+script: Core.js
+
+description: The core of MooTools, contains all the base functions and the Native and Hash implementations. Required by all the other scripts.
+
+license: MIT-style license.
+
+copyright: Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/).
+
+authors: The MooTools production team (http://mootools.net/developers/)
+
+inspiration:
+- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
+- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
+
+provides: [Mootools, Native, Hash.base, Array.each, $util]
+
+...
+*/
+
+var MooTools = {
+	'version': '1.2.4',
+	'build': '0d9113241a90b9cd5643b926795852a2026710d4'
+};
+
+var Native = function(options){
+	options = options || {};
+	var name = options.name;
+	var legacy = options.legacy;
+	var protect = options.protect;
+	var methods = options.implement;
+	var generics = options.generics;
+	var initialize = options.initialize;
+	var afterImplement = options.afterImplement || function(){};
+	var object = initialize || legacy;
+	generics = generics !== false;
+
+	object.constructor = Native;
+	object.$family = {name: 'native'};
+	if (legacy && initialize) object.prototype = legacy.prototype;
+	object.prototype.constructor = object;
+
+	if (name){
+		var family = name.toLowerCase();
+		object.prototype.$family = {name: family};
+		Native.typize(object, family);
+	}
+
+	var add = function(obj, name, method, force){
+		if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
+		if (generics) Native.genericize(obj, name, protect);
+		afterImplement.call(obj, name, method);
+		return obj;
+	};
+
+	object.alias = function(a1, a2, a3){
+		if (typeof a1 == 'string'){
+			var pa1 = this.prototype[a1];
+			if ((a1 = pa1)) return add(this, a2, a1, a3);
+		}
+		for (var a in a1) this.alias(a, a1[a], a2);
+		return this;
+	};
+
+	object.implement = function(a1, a2, a3){
+		if (typeof a1 == 'string') return add(this, a1, a2, a3);
+		for (var p in a1) add(this, p, a1[p], a2);
+		return this;
+	};
+
+	if (methods) object.implement(methods);
+
+	return object;
+};
+
+Native.genericize = function(object, property, check){
+	if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
+		var args = Array.prototype.slice.call(arguments);
+		return object.prototype[property].apply(args.shift(), args);
+	};
+};
+
+Native.implement = function(objects, properties){
+	for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties);
+};
+
+Native.typize = function(object, family){
+	if (!object.type) object.type = function(item){
+		return ($type(item) === family);
+	};
+};
+
+(function(){
+	var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String};
+	for (var n in natives) new Native({name: n, initialize: natives[n], protect: true});
+
+	var types = {'boolean': Boolean, 'native': Native, 'object': Object};
+	for (var t in types) Native.typize(types[t], t);
+
+	var generics = {
+		'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
+		'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
+	};
+	for (var g in generics){
+		for (var i = generics[g].length; i--;) Native.genericize(natives[g], generics[g][i], true);
+	}
+})();
+
+var Hash = new Native({
+
+	name: 'Hash',
+
+	initialize: function(object){
+		if ($type(object) == 'hash') object = $unlink(object.getClean());
+		for (var key in object) this[key] = object[key];
+		return this;
+	}
+
+});
+
+Hash.implement({
+
+	forEach: function(fn, bind){
+		for (var key in this){
+			if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
+		}
+	},
+
+	getClean: function(){
+		var clean = {};
+		for (var key in this){
+			if (this.hasOwnProperty(key)) clean[key] = this[key];
+		}
+		return clean;
+	},
+
+	getLength: function(){
+		var length = 0;
+		for (var key in this){
+			if (this.hasOwnProperty(key)) length++;
+		}
+		return length;
+	}
+
+});
+
+Hash.alias('forEach', 'each');
+
+Array.implement({
+
+	forEach: function(fn, bind){
+		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
+	}
+
+});
+
+Array.alias('forEach', 'each');
+
+function $A(iterable){
+	if (iterable.item){
+		var l = iterable.length, array = new Array(l);
+		while (l--) array[l] = iterable[l];
+		return array;
+	}
+	return Array.prototype.slice.call(iterable);
+};
+
+function $arguments(i){
+	return function(){
+		return arguments[i];
+	};
+};
+
+function $chk(obj){
+	return !!(obj || obj === 0);
+};
+
+function $clear(timer){
+	clearTimeout(timer);
+	clearInterval(timer);
+	return null;
+};
+
+function $defined(obj){
+	return (obj != undefined);
+};
+
+function $each(iterable, fn, bind){
+	var type = $type(iterable);
+	((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind);
+};
+
+function $empty(){};
+
+function $extend(original, extended){
+	for (var key in (extended || {})) original[key] = extended[key];
+	return original;
+};
+
+function $H(object){
+	return new Hash(object);
+};
+
+function $lambda(value){
+	return ($type(value) == 'function') ? value : function(){
+		return value;
+	};
+};
+
+function $merge(){
+	var args = Array.slice(arguments);
+	args.unshift({});
+	return $mixin.apply(null, args);
+};
+
+function $mixin(mix){
+	for (var i = 1, l = arguments.length; i < l; i++){
+		var object = arguments[i];
+		if ($type(object) != 'object') continue;
+		for (var key in object){
+			var op = object[key], mp = mix[key];
+			mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op);
+		}
+	}
+	return mix;
+};
+
+function $pick(){
+	for (var i = 0, l = arguments.length; i < l; i++){
+		if (arguments[i] != undefined) return arguments[i];
+	}
+	return null;
+};
+
+function $random(min, max){
+	return Math.floor(Math.random() * (max - min + 1) + min);
+};
+
+function $splat(obj){
+	var type = $type(obj);
+	return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
+};
+
+var $time = Date.now || function(){
+	return +new Date;
+};
+
+function $try(){
+	for (var i = 0, l = arguments.length; i < l; i++){
+		try {
+			return arguments[i]();
+		} catch(e){}
+	}
+	return null;
+};
+
+function $type(obj){
+	if (obj == undefined) return false;
+	if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
+	if (obj.nodeName){
+		switch (obj.nodeType){
+			case 1: return 'element';
+			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
+		}
+	} else if (typeof obj.length == 'number'){
+		if (obj.callee) return 'arguments';
+		else if (obj.item) return 'collection';
+	}
+	return typeof obj;
+};
+
+function $unlink(object){
+	var unlinked;
+	switch ($type(object)){
+		case 'object':
+			unlinked = {};
+			for (var p in object) unlinked[p] = $unlink(object[p]);
+		break;
+		case 'hash':
+			unlinked = new Hash(object);
+		break;
+		case 'array':
+			unlinked = [];
+			for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
+		break;
+		default: return object;
+	}
+	return unlinked;
+};
+/*
+---
+
+script: Browser.js
+
+description: The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash.
+
+license: MIT-style license.
+
+requires: 
+- /Native
+- /$util
+
+provides: [Browser, Window, Document, $exec]
+
+...
+*/
+
+var Browser = $merge({
+
+	Engine: {name: 'unknown', version: 0},
+
+	Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
+
+	Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},
+
+	Plugins: {},
+
+	Engines: {
+
+		presto: function(){
+			return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
+		},
+
+		trident: function(){
+			return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
+		},
+
+		webkit: function(){
+			return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
+		},
+
+		gecko: function(){
+			return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18);
+		}
+
+	}
+
+}, Browser || {});
+
+Browser.Platform[Browser.Platform.name] = true;
+
+Browser.detect = function(){
+
+	for (var engine in this.Engines){
+		var version = this.Engines[engine]();
+		if (version){
+			this.Engine = {name: engine, version: version};
+			this.Engine[engine] = this.Engine[engine + version] = true;
+			break;
+		}
+	}
+
+	return {name: engine, version: version};
+
+};
+
+Browser.detect();
+
+Browser.Request = function(){
+	return $try(function(){
+		return new XMLHttpRequest();
+	}, function(){
+		return new ActiveXObject('MSXML2.XMLHTTP');
+	}, function(){
+		return new ActiveXObject('Microsoft.XMLHTTP');
+	});
+};
+
+Browser.Features.xhr = !!(Browser.Request());
+
+Browser.Plugins.Flash = (function(){
+	var version = ($try(function(){
+		return navigator.plugins['Shockwave Flash'].description;
+	}, function(){
+		return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
+	}) || '0 r0').match(/\d+/g);
+	return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
+})();
+
+function $exec(text){
+	if (!text) return text;
+	if (window.execScript){
+		window.execScript(text);
+	} else {
+		var script = document.createElement('script');
+		script.setAttribute('type', 'text/javascript');
+		script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
+		document.head.appendChild(script);
+		document.head.removeChild(script);
+	}
+	return text;
+};
+
+Native.UID = 1;
+
+var $uid = (Browser.Engine.trident) ? function(item){
+	return (item.uid || (item.uid = [Native.UID++]))[0];
+} : function(item){
+	return item.uid || (item.uid = Native.UID++);
+};
+
+var Window = new Native({
+
+	name: 'Window',
+
+	legacy: (Browser.Engine.trident) ? null: window.Window,
+
+	initialize: function(win){
+		$uid(win);
+		if (!win.Element){
+			win.Element = $empty;
+			if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2
+			win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {};
+		}
+		win.document.window = win;
+		return $extend(win, Window.Prototype);
+	},
+
+	afterImplement: function(property, value){
+		window[property] = Window.Prototype[property] = value;
+	}
+
+});
+
+Window.Prototype = {$family: {name: 'window'}};
+
+new Window(window);
+
+var Document = new Native({
+
+	name: 'Document',
+
+	legacy: (Browser.Engine.trident) ? null: window.Document,
+
+	initialize: function(doc){
+		$uid(doc);
+		doc.head = doc.getElementsByTagName('head')[0];
+		doc.html = doc.getElementsByTagName('html')[0];
+		if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){
+			doc.execCommand("BackgroundImageCache", false, true);
+		});
+		if (Browser.Engine.trident) doc.window.attachEvent('onunload', function(){
+			doc.window.detachEvent('onunload', arguments.callee);
+			doc.head = doc.html = doc.window = null;
+		});
+		return $extend(doc, Document.Prototype);
+	},
+
+	afterImplement: function(property, value){
+		document[property] = Document.Prototype[property] = value;
+	}
+
+});
+
+Document.Prototype = {$family: {name: 'document'}};
+
+new Document(document);
+/*
+---
+
+script: Array.js
+
+description: Contains Array Prototypes like each, contains, and erase.
+
+license: MIT-style license.
+
+requires:
+- /$util
+- /Array.each
+
+provides: [Array]
+
+...
+*/
+
+Array.implement({
+
+	every: function(fn, bind){
+		for (var i = 0, l = this.length; i < l; i++){
+			if (!fn.call(bind, this[i], i, this)) return false;
+		}
+		return true;
+	},
+
+	filter: function(fn, bind){
+		var results = [];
+		for (var i = 0, l = this.length; i < l; i++){
+			if (fn.call(bind, this[i], i, this)) results.push(this[i]);
+		}
+		return results;
+	},
+
+	clean: function(){
+		return this.filter($defined);
+	},
+
+	indexOf: function(item, from){
+		var len = this.length;
+		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
+			if (this[i] === item) return i;
+		}
+		return -1;
+	},
+
+	map: function(fn, bind){
+		var results = [];
+		for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this);
+		return results;
+	},
+
+	some: function(fn, bind){
+		for (var i = 0, l = this.length; i < l; i++){
+			if (fn.call(bind, this[i], i, this)) return true;
+		}
+		return false;
+	},
+
+	associate: function(keys){
+		var obj = {}, length = Math.min(this.length, keys.length);
+		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
+		return obj;
+	},
+
+	link: function(object){
+		var result = {};
+		for (var i = 0, l = this.length; i < l; i++){
+			for (var key in object){
+				if (object[key](this[i])){
+					result[key] = this[i];
+					delete object[key];
+					break;
+				}
+			}
+		}
+		return result;
+	},
+
+	contains: function(item, from){
+		return this.indexOf(item, from) != -1;
+	},
+
+	extend: function(array){
+		for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
+		return this;
+	},
+	
+	getLast: function(){
+		return (this.length) ? this[this.length - 1] : null;
+	},
+
+	getRandom: function(){
+		return (this.length) ? this[$random(0, this.length - 1)] : null;
+	},
+
+	include: function(item){
+		if (!this.contains(item)) this.push(item);
+		return this;
+	},
+
+	combine: function(array){
+		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
+		return this;
+	},
+
+	erase: function(item){
+		for (var i = this.length; i--; i){
+			if (this[i] === item) this.splice(i, 1);
+		}
+		return this;
+	},
+
+	empty: function(){
+		this.length = 0;
+		return this;
+	},
+
+	flatten: function(){
+		var array = [];
+		for (var i = 0, l = this.length; i < l; i++){
+			var type = $type(this[i]);
+			if (!type) continue;
+			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]);
+		}
+		return array;
+	},
+
+	hexToRgb: function(array){
+		if (this.length != 3) return null;
+		var rgb = this.map(function(value){
+			if (value.length == 1) value += value;
+			return value.toInt(16);
+		});
+		return (array) ? rgb : 'rgb(' + rgb + ')';
+	},
+
+	rgbToHex: function(array){
+		if (this.length < 3) return null;
+		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
+		var hex = [];
+		for (var i = 0; i < 3; i++){
+			var bit = (this[i] - 0).toString(16);
+			hex.push((bit.length == 1) ? '0' + bit : bit);
+		}
+		return (array) ? hex : '#' + hex.join('');
+	}
+
+});
+/*
+---
+
+script: Function.js
+
+description: Contains Function Prototypes like create, bind, pass, and delay.
+
+license: MIT-style license.
+
+requires:
+- /Native
+- /$util
+
+provides: [Function]
+
+...
+*/
+
+Function.implement({
+
+	extend: function(properties){
+		for (var property in properties) this[property] = properties[property];
+		return this;
+	},
+
+	create: function(options){
+		var self = this;
+		options = options || {};
+		return function(event){
+			var args = options.arguments;
+			args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
+			if (options.event) args = [event || window.event].extend(args);
+			var returns = function(){
+				return self.apply(options.bind || null, args);
+			};
+			if (options.delay) return setTimeout(returns, options.delay);
+			if (options.periodical) return setInterval(returns, options.periodical);
+			if (options.attempt) return $try(returns);
+			return returns();
+		};
+	},
+
+	run: function(args, bind){
+		return this.apply(bind, $splat(args));
+	},
+
+	pass: function(args, bind){
+		return this.create({bind: bind, arguments: args});
+	},
+
+	bind: function(bind, args){
+		return this.create({bind: bind, arguments: args});
+	},
+
+	bindWithEvent: function(bind, args){
+		return this.create({bind: bind, arguments: args, event: true});
+	},
+
+	attempt: function(args, bind){
+		return this.create({bind: bind, arguments: args, attempt: true})();
+	},
+
+	delay: function(delay, bind, args){
+		return this.create({bind: bind, arguments: args, delay: delay})();
+	},
+
+	periodical: function(periodical, bind, args){
+		return this.create({bind: bind, arguments: args, periodical: periodical})();
+	}
+
+});
+/*
+---
+
+script: Number.js
+
+description: Contains Number Prototypes like limit, round, times, and ceil.
+
+license: MIT-style license.
+
+requires:
+- /Native
+- /$util
+
+provides: [Number]
+
+...
+*/
+
+Number.implement({
+
+	limit: function(min, max){
+		return Math.min(max, Math.max(min, this));
+	},
+
+	round: function(precision){
+		precision = Math.pow(10, precision || 0);
+		return Math.round(this * precision) / precision;
+	},
+
+	times: function(fn, bind){
+		for (var i = 0; i < this; i++) fn.call(bind, i, this);
+	},
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	toInt: function(base){
+		return parseInt(this, base || 10);
+	}
+
+});
+
+Number.alias('times', 'each');
+
+(function(math){
+	var methods = {};
+	math.each(function(name){
+		if (!Number[name]) methods[name] = function(){
+			return Math[name].apply(null, [this].concat($A(arguments)));
+		};
+	});
+	Number.implement(methods);
+})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
+/*
+---
+
+script: String.js
+
+description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
+
+license: MIT-style license.
+
+requires:
+- /Native
+
+provides: [String]
+
+...
+*/
+
+String.implement({
+
+	test: function(regex, params){
+		return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this);
+	},
+
+	contains: function(string, separator){
+		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
+	},
+
+	trim: function(){
+		return this.replace(/^\s+|\s+$/g, '');
+	},
+
+	clean: function(){
+		return this.replace(/\s+/g, ' ').trim();
+	},
+
+	camelCase: function(){
+		return this.replace(/-\D/g, function(match){
+			return match.charAt(1).toUpperCase();
+		});
+	},
+
+	hyphenate: function(){
+		return this.replace(/[A-Z]/g, function(match){
+			return ('-' + match.charAt(0).toLowerCase());
+		});
+	},
+
+	capitalize: function(){
+		return this.replace(/\b[a-z]/g, function(match){
+			return match.toUpperCase();
+		});
+	},
+
+	escapeRegExp: function(){
+		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
+	},
+
+	toInt: function(base){
+		return parseInt(this, base || 10);
+	},
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	hexToRgb: function(array){
+		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+		return (hex) ? hex.slice(1).hexToRgb(array) : null;
+	},
+
+	rgbToHex: function(array){
+		var rgb = this.match(/\d{1,3}/g);
+		return (rgb) ? rgb.rgbToHex(array) : null;
+	},
+
+	stripScripts: function(option){
+		var scripts = '';
+		var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
+			scripts += arguments[1] + '\n';
+			return '';
+		});
+		if (option === true) $exec(scripts);
+		else if ($type(option) == 'function') option(scripts, text);
+		return text;
+	},
+
+	substitute: function(object, regexp){
+		return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
+			if (match.charAt(0) == '\\') return match.slice(1);
+			return (object[name] != undefined) ? object[name] : '';
+		});
+	}
+
+});
+/*
+---
+
+script: Hash.js
+
+description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
+
+license: MIT-style license.
+
+requires:
+- /Hash.base
+
+provides: [Hash]
+
+...
+*/
+
+Hash.implement({
+
+	has: Object.prototype.hasOwnProperty,
+
+	keyOf: function(value){
+		for (var key in this){
+			if (this.hasOwnProperty(key) && this[key] === value) return key;
+		}
+		return null;
+	},
+
+	hasValue: function(value){
+		return (Hash.keyOf(this, value) !== null);
+	},
+
+	extend: function(properties){
+		Hash.each(properties || {}, function(value, key){
+			Hash.set(this, key, value);
+		}, this);
+		return this;
+	},
+
+	combine: function(properties){
+		Hash.each(properties || {}, function(value, key){
+			Hash.include(this, key, value);
+		}, this);
+		return this;
+	},
+
+	erase: function(key){
+		if (this.hasOwnProperty(key)) delete this[key];
+		return this;
+	},
+
+	get: function(key){
+		return (this.hasOwnProperty(key)) ? this[key] : null;
+	},
+
+	set: function(key, value){
+		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
+		return this;
+	},
+
+	empty: function(){
+		Hash.each(this, function(value, key){
+			delete this[key];
+		}, this);
+		return this;
+	},
+
+	include: function(key, value){
+		if (this[key] == undefined) this[key] = value;
+		return this;
+	},
+
+	map: function(fn, bind){
+		var results = new Hash;
+		Hash.each(this, function(value, key){
+			results.set(key, fn.call(bind, value, key, this));
+		}, this);
+		return results;
+	},
+
+	filter: function(fn, bind){
+		var results = new Hash;
+		Hash.each(this, function(value, key){
+			if (fn.call(bind, value, key, this)) results.set(key, value);
+		}, this);
+		return results;
+	},
+
+	every: function(fn, bind){
+		for (var key in this){
+			if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false;
+		}
+		return true;
+	},
+
+	some: function(fn, bind){
+		for (var key in this){
+			if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true;
+		}
+		return false;
+	},
+
+	getKeys: function(){
+		var keys = [];
+		Hash.each(this, function(value, key){
+			keys.push(key);
+		});
+		return keys;
+	},
+
+	getValues: function(){
+		var values = [];
+		Hash.each(this, function(value){
+			values.push(value);
+		});
+		return values;
+	},
+
+	toQueryString: function(base){
+		var queryString = [];
+		Hash.each(this, function(value, key){
+			if (base) key = base + '[' + key + ']';
+			var result;
+			switch ($type(value)){
+				case 'object': result = Hash.toQueryString(value, key); break;
+				case 'array':
+					var qs = {};
+					value.each(function(val, i){
+						qs[i] = val;
+					});
+					result = Hash.toQueryString(qs, key);
+				break;
+				default: result = key + '=' + encodeURIComponent(value);
+			}
+			if (value != undefined) queryString.push(result);
+		});
+
+		return queryString.join('&');
+	}
+
+});
+
+Hash.alias({keyOf: 'indexOf', hasValue: 'contains'});
+/*
+---
+
+script: Event.js
+
+description: Contains the Event Class, to make the event object cross-browser.
+
+license: MIT-style license.
+
+requires:
+- /Window
+- /Document
+- /Hash
+- /Array
+- /Function
+- /String
+
+provides: [Event]
+
+...
+*/
+
+var Event = new Native({
+
+	name: 'Event',
+
+	initialize: function(event, win){
+		win = win || window;
+		var doc = win.document;
+		event = event || win.event;
+		if (event.$extended) return event;
+		this.$extended = true;
+		var type = event.type;
+		var target = event.target || event.srcElement;
+		while (target && target.nodeType == 3) target = target.parentNode;
+
+		if (type.test(/key/)){
+			var code = event.which || event.keyCode;
+			var key = Event.Keys.keyOf(code);
+			if (type == 'keydown'){
+				var fKey = code - 111;
+				if (fKey > 0 && fKey < 13) key = 'f' + fKey;
+			}
+			key = key || String.fromCharCode(code).toLowerCase();
+		} else if (type.match(/(click|mouse|menu)/i)){
+			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
+			var page = {
+				x: event.pageX || event.clientX + doc.scrollLeft,
+				y: event.pageY || event.clientY + doc.scrollTop
+			};
+			var client = {
+				x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
+				y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
+			};
+			if (type.match(/DOMMouseScroll|mousewheel/)){
+				var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
+			}
+			var rightClick = (event.which == 3) || (event.button == 2);
+			var related = null;
+			if (type.match(/over|out/)){
+				switch (type){
+					case 'mouseover': related = event.relatedTarget || event.fromElement; break;
+					case 'mouseout': related = event.relatedTarget || event.toElement;
+				}
+				if (!(function(){
+					while (related && related.nodeType == 3) related = related.parentNode;
+					return true;
+				}).create({attempt: Browser.Engine.gecko})()) related = false;
+			}
+		}
+
+		return $extend(this, {
+			event: event,
+			type: type,
+
+			page: page,
+			client: client,
+			rightClick: rightClick,
+
+			wheel: wheel,
+
+			relatedTarget: related,
+			target: target,
+
+			code: code,
+			key: key,
+
+			shift: event.shiftKey,
+			control: event.ctrlKey,
+			alt: event.altKey,
+			meta: event.metaKey
+		});
+	}
+
+});
+
+Event.Keys = new Hash({
+	'enter': 13,
+	'up': 38,
+	'down': 40,
+	'left': 37,
+	'right': 39,
+	'esc': 27,
+	'space': 32,
+	'backspace': 8,
+	'tab': 9,
+	'delete': 46
+});
+
+Event.implement({
+
+	stop: function(){
+		return this.stopPropagation().preventDefault();
+	},
+
+	stopPropagation: function(){
+		if (this.event.stopPropagation) this.event.stopPropagation();
+		else this.event.cancelBubble = true;
+		return this;
+	},
+
+	preventDefault: function(){
+		if (this.event.preventDefault) this.event.preventDefault();
+		else this.event.returnValue = false;
+		return this;
+	}
+
+});
+/*
+---
+
+script: Class.js
+
+description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
+
+license: MIT-style license.
+
+requires:
+- /$util
+- /Native
+- /Array
+- /String
+- /Function
+- /Number
+- /Hash
+
+provides: [Class]
+
+...
+*/
+
+function Class(params){
+	
+	if (params instanceof Function) params = {initialize: params};
+	
+	var newClass = function(){
+		Object.reset(this);
+		if (newClass._prototyping) return this;
+		this._current = $empty;
+		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
+		delete this._current; delete this.caller;
+		return value;
+	}.extend(this);
+	
+	newClass.implement(params);
+	
+	newClass.constructor = Class;
+	newClass.prototype.constructor = newClass;
+
+	return newClass;
+
+};
+
+Function.prototype.protect = function(){
+	this._protected = true;
+	return this;
+};
+
+Object.reset = function(object, key){
+		
+	if (key == null){
+		for (var p in object) Object.reset(object, p);
+		return object;
+	}
+	
+	delete object[key];
+	
+	switch ($type(object[key])){
+		case 'object':
+			var F = function(){};
+			F.prototype = object[key];
+			var i = new F;
+			object[key] = Object.reset(i);
+		break;
+		case 'array': object[key] = $unlink(object[key]); break;
+	}
+	
+	return object;
+	
+};
+
+new Native({name: 'Class', initialize: Class}).extend({
+
+	instantiate: function(F){
+		F._prototyping = true;
+		var proto = new F;
+		delete F._prototyping;
+		return proto;
+	},
+	
+	wrap: function(self, key, method){
+		if (method._origin) method = method._origin;
+		
+		return function(){
+			if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.');
+			var caller = this.caller, current = this._current;
+			this.caller = current; this._current = arguments.callee;
+			var result = method.apply(this, arguments);
+			this._current = current; this.caller = caller;
+			return result;
+		}.extend({_owner: self, _origin: method, _name: key});
+
+	}
+	
+});
+
+Class.implement({
+	
+	implement: function(key, value){
+		
+		if ($type(key) == 'object'){
+			for (var p in key) this.implement(p, key[p]);
+			return this;
+		}
+		
+		var mutator = Class.Mutators[key];
+		
+		if (mutator){
+			value = mutator.call(this, value);
+			if (value == null) return this;
+		}
+		
+		var proto = this.prototype;
+
+		switch ($type(value)){
+			
+			case 'function':
+				if (value._hidden) return this;
+				proto[key] = Class.wrap(this, key, value);
+			break;
+			
+			case 'object':
+				var previous = proto[key];
+				if ($type(previous) == 'object') $mixin(previous, value);
+				else proto[key] = $unlink(value);
+			break;
+			
+			case 'array':
+				proto[key] = $unlink(value);
+			break;
+			
+			default: proto[key] = value;
+
+		}
+		
+		return this;
+
+	}
+	
+});
+
+Class.Mutators = {
+	
+	Extends: function(parent){
+
+		this.parent = parent;
+		this.prototype = Class.instantiate(parent);
+
+		this.implement('parent', function(){
+			var name = this.caller._name, previous = this.caller._owner.parent.prototype[name];
+			if (!previous) throw new Error('The method "' + name + '" has no parent.');
+			return previous.apply(this, arguments);
+		}.protect());
+
+	},
+
+	Implements: function(items){
+		$splat(items).each(function(item){
+			if (item instanceof Function) item = Class.instantiate(item);
+			this.implement(item);
+		}, this);
+
+	}
+	
+};
+/*
+---
+
+script: Class.Extras.js
+
+description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
+
+license: MIT-style license.
+
+requires:
+- /Class
+
+provides: [Chain, Events, Options]
+
+...
+*/
+
+var Chain = new Class({
+
+	$chain: [],
+
+	chain: function(){
+		this.$chain.extend(Array.flatten(arguments));
+		return this;
+	},
+
+	callChain: function(){
+		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
+	},
+
+	clearChain: function(){
+		this.$chain.empty();
+		return this;
+	}
+
+});
+
+var Events = new Class({
+
+	$events: {},
+
+	addEvent: function(type, fn, internal){
+		type = Events.removeOn(type);
+		if (fn != $empty){
+			this.$events[type] = this.$events[type] || [];
+			this.$events[type].include(fn);
+			if (internal) fn.internal = true;
+		}
+		return this;
+	},
+
+	addEvents: function(events){
+		for (var type in events) this.addEvent(type, events[type]);
+		return this;
+	},
+
+	fireEvent: function(type, args, delay){
+		type = Events.removeOn(type);
+		if (!this.$events || !this.$events[type]) return this;
+		this.$events[type].each(function(fn){
+			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
+		}, this);
+		return this;
+	},
+
+	removeEvent: function(type, fn){
+		type = Events.removeOn(type);
+		if (!this.$events[type]) return this;
+		if (!fn.internal) this.$events[type].erase(fn);
+		return this;
+	},
+
+	removeEvents: function(events){
+		var type;
+		if ($type(events) == 'object'){
+			for (type in events) this.removeEvent(type, events[type]);
+			return this;
+		}
+		if (events) events = Events.removeOn(events);
+		for (type in this.$events){
+			if (events && events != type) continue;
+			var fns = this.$events[type];
+			for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]);
+		}
+		return this;
+	}
+
+});
+
+Events.removeOn = function(string){
+	return string.replace(/^on([A-Z])/, function(full, first){
+		return first.toLowerCase();
+	});
+};
+
+var Options = new Class({
+
+	setOptions: function(){
+		this.options = $merge.run([this.options].extend(arguments));
+		if (!this.addEvent) return this;
+		for (var option in this.options){
+			if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
+			this.addEvent(option, this.options[option]);
+			delete this.options[option];
+		}
+		return this;
+	}
+
+});
+/*
+---
+
+script: Element.js
+
+description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
+
+license: MIT-style license.
+
+requires:
+- /Window
+- /Document
+- /Array
+- /String
+- /Function
+- /Number
+- /Hash
+
+provides: [Element, Elements, $, $$, Iframe]
+
+...
+*/
+
+var Element = new Native({
+
+	name: 'Element',
+
+	legacy: window.Element,
+
+	initialize: function(tag, props){
+		var konstructor = Element.Constructors.get(tag);
+		if (konstructor) return konstructor(props);
+		if (typeof tag == 'string') return document.newElement(tag, props);
+		return document.id(tag).set(props);
+	},
+
+	afterImplement: function(key, value){
+		Element.Prototype[key] = value;
+		if (Array[key]) return;
+		Elements.implement(key, function(){
+			var items = [], elements = true;
+			for (var i = 0, j = this.length; i < j; i++){
+				var returns = this[i][key].apply(this[i], arguments);
+				items.push(returns);
+				if (elements) elements = ($type(returns) == 'element');
+			}
+			return (elements) ? new Elements(items) : items;
+		});
+	}
+
+});
+
+Element.Prototype = {$family: {name: 'element'}};
+
+Element.Constructors = new Hash;
+
+var IFrame = new Native({
+
+	name: 'IFrame',
+
+	generics: false,
+
+	initialize: function(){
+		var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
+		var props = params.properties || {};
+		var iframe = document.id(params.iframe);
+		var onload = props.onload || $empty;
+		delete props.onload;
+		props.id = props.name = $pick(props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + $time());
+		iframe = new Element(iframe || 'iframe', props);
+		var onFrameLoad = function(){
+			var host = $try(function(){
+				return iframe.contentWindow.location.host;
+			});
+			if (!host || host == window.location.host){
+				var win = new Window(iframe.contentWindow);
+				new Document(iframe.contentWindow.document);
+				$extend(win.Element.prototype, Element.Prototype);
+			}
+			onload.call(iframe.contentWindow, iframe.contentWindow.document);
+		};
+		var contentWindow = $try(function(){
+			return iframe.contentWindow;
+		});
+		((contentWindow && contentWindow.document.body) || window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad);
+		return iframe;
+	}
+
+});
+
+var Elements = new Native({
+
+	initialize: function(elements, options){
+		options = $extend({ddup: true, cash: true}, options);
+		elements = elements || [];
+		if (options.ddup || options.cash){
+			var uniques = {}, returned = [];
+			for (var i = 0, l = elements.length; i < l; i++){
+				var el = document.id(elements[i], !options.cash);
+				if (options.ddup){
+					if (uniques[el.uid]) continue;
+					uniques[el.uid] = true;
+				}
+				if (el) returned.push(el);
+			}
+			elements = returned;
+		}
+		return (options.cash) ? $extend(elements, this) : elements;
+	}
+
+});
+
+Elements.implement({
+
+	filter: function(filter, bind){
+		if (!filter) return this;
+		return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
+			return item.match(filter);
+		} : filter, bind));
+	}
+
+});
+
+Document.implement({
+
+	newElement: function(tag, props){
+		if (Browser.Engine.trident && props){
+			['name', 'type', 'checked'].each(function(attribute){
+				if (!props[attribute]) return;
+				tag += ' ' + attribute + '="' + props[attribute] + '"';
+				if (attribute != 'checked') delete props[attribute];
+			});
+			tag = '<' + tag + '>';
+		}
+		return document.id(this.createElement(tag)).set(props);
+	},
+
+	newTextNode: function(text){
+		return this.createTextNode(text);
+	},
+
+	getDocument: function(){
+		return this;
+	},
+
+	getWindow: function(){
+		return this.window;
+	},
+	
+	id: (function(){
+		
+		var types = {
+
+			string: function(id, nocash, doc){
+				id = doc.getElementById(id);
+				return (id) ? types.element(id, nocash) : null;
+			},
+			
+			element: function(el, nocash){
+				$uid(el);
+				if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
+					var proto = Element.Prototype;
+					for (var p in proto) el[p] = proto[p];
+				};
+				return el;
+			},
+			
+			object: function(obj, nocash, doc){
+				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
+				return null;
+			}
+			
+		};
+
+		types.textnode = types.whitespace = types.window = types.document = $arguments(0);
+		
+		return function(el, nocash, doc){
+			if (el && el.$family && el.uid) return el;
+			var type = $type(el);
+			return (types[type]) ? types[type](el, nocash, doc || document) : null;
+		};
+
+	})()
+
+});
+
+if (window.$ == null) Window.implement({
+	$: function(el, nc){
+		return document.id(el, nc, this.document);
+	}
+});
+
+Window.implement({
+
+	$$: function(selector){
+		if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
+		var elements = [];
+		var args = Array.flatten(arguments);
+		for (var i = 0, l = args.length; i < l; i++){
+			var item = args[i];
+			switch ($type(item)){
+				case 'element': elements.push(item); break;
+				case 'string': elements.extend(this.document.getElements(item, true));
+			}
+		}
+		return new Elements(elements);
+	},
+
+	getDocument: function(){
+		return this.document;
+	},
+
+	getWindow: function(){
+		return this;
+	}
+
+});
+
+Native.implement([Element, Document], {
+
+	getElement: function(selector, nocash){
+		return document.id(this.getElements(selector, true)[0] || null, nocash);
+	},
+
+	getElements: function(tags, nocash){
+		tags = tags.split(',');
+		var elements = [];
+		var ddup = (tags.length > 1);
+		tags.each(function(tag){
+			var partial = this.getElementsByTagName(tag.trim());
+			(ddup) ? elements.extend(partial) : elements = partial;
+		}, this);
+		return new Elements(elements, {ddup: ddup, cash: !nocash});
+	}
+
+});
+
+(function(){
+
+var collected = {}, storage = {};
+var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'};
+
+var get = function(uid){
+	return (storage[uid] || (storage[uid] = {}));
+};
+
+var clean = function(item, retain){
+	if (!item) return;
+	var uid = item.uid;
+	if (Browser.Engine.trident){
+		if (item.clearAttributes){
+			var clone = retain && item.cloneNode(false);
+			item.clearAttributes();
+			if (clone) item.mergeAttributes(clone);
+		} else if (item.removeEvents){
+			item.removeEvents();
+		}
+		if ((/object/i).test(item.tagName)){
+			for (var p in item){
+				if (typeof item[p] == 'function') item[p] = $empty;
+			}
+			Element.dispose(item);
+		}
+	}	
+	if (!uid) return;
+	collected[uid] = storage[uid] = null;
+};
+
+var purge = function(){
+	Hash.each(collected, clean);
+	if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean);
+	if (window.CollectGarbage) CollectGarbage();
+	collected = storage = null;
+};
+
+var walk = function(element, walk, start, match, all, nocash){
+	var el = element[start || walk];
+	var elements = [];
+	while (el){
+		if (el.nodeType == 1 && (!match || Element.match(el, match))){
+			if (!all) return document.id(el, nocash);
+			elements.push(el);
+		}
+		el = el[walk];
+	}
+	return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null;
+};
+
+var attributes = {
+	'html': 'innerHTML',
+	'class': 'className',
+	'for': 'htmlFor',
+	'defaultValue': 'defaultValue',
+	'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent'
+};
+var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'];
+var camels = ['value', 'type', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap'];
+
+bools = bools.associate(bools);
+
+Hash.extend(attributes, bools);
+Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase)));
+
+var inserters = {
+
+	before: function(context, element){
+		if (element.parentNode) element.parentNode.insertBefore(context, element);
+	},
+
+	after: function(context, element){
+		if (!element.parentNode) return;
+		var next = element.nextSibling;
+		(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
+	},
+
+	bottom: function(context, element){
+		element.appendChild(context);
+	},
+
+	top: function(context, element){
+		var first = element.firstChild;
+		(first) ? element.insertBefore(context, first) : element.appendChild(context);
+	}
+
+};
+
+inserters.inside = inserters.bottom;
+
+Hash.each(inserters, function(inserter, where){
+
+	where = where.capitalize();
+
+	Element.implement('inject' + where, function(el){
+		inserter(this, document.id(el, true));
+		return this;
+	});
+
+	Element.implement('grab' + where, function(el){
+		inserter(document.id(el, true), this);
+		return this;
+	});
+
+});
+
+Element.implement({
+
+	set: function(prop, value){
+		switch ($type(prop)){
+			case 'object':
+				for (var p in prop) this.set(p, prop[p]);
+				break;
+			case 'string':
+				var property = Element.Properties.get(prop);
+				(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
+		}
+		return this;
+	},
+
+	get: function(prop){
+		var property = Element.Properties.get(prop);
+		return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
+	},
+
+	erase: function(prop){
+		var property = Element.Properties.get(prop);
+		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
+		return this;
+	},
+
+	setProperty: function(attribute, value){
+		var key = attributes[attribute];
+		if (value == undefined) return this.removeProperty(attribute);
+		if (key && bools[attribute]) value = !!value;
+		(key) ? this[key] = value : this.setAttribute(attribute, '' + value);
+		return this;
+	},
+
+	setProperties: function(attributes){
+		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
+		return this;
+	},
+
+	getProperty: function(attribute){
+		var key = attributes[attribute];
+		var value = (key) ? this[key] : this.getAttribute(attribute, 2);
+		return (bools[attribute]) ? !!value : (key) ? value : value || null;
+	},
+
+	getProperties: function(){
+		var args = $A(arguments);
+		return args.map(this.getProperty, this).associate(args);
+	},
+
+	removeProperty: function(attribute){
+		var key = attributes[attribute];
+		(key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute);
+		return this;
+	},
+
+	removeProperties: function(){
+		Array.each(arguments, this.removeProperty, this);
+		return this;
+	},
+
+	hasClass: function(className){
+		return this.className.contains(className, ' ');
+	},
+
+	addClass: function(className){
+		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
+		return this;
+	},
+
+	removeClass: function(className){
+		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
+		return this;
+	},
+
+	toggleClass: function(className){
+		return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
+	},
+
+	adopt: function(){
+		Array.flatten(arguments).each(function(element){
+			element = document.id(element, true);
+			if (element) this.appendChild(element);
+		}, this);
+		return this;
+	},
+
+	appendText: function(text, where){
+		return this.grab(this.getDocument().newTextNode(text), where);
+	},
+
+	grab: function(el, where){
+		inserters[where || 'bottom'](document.id(el, true), this);
+		return this;
+	},
+
+	inject: function(el, where){
+		inserters[where || 'bottom'](this, document.id(el, true));
+		return this;
+	},
+
+	replaces: function(el){
+		el = document.id(el, true);
+		el.parentNode.replaceChild(this, el);
+		return this;
+	},
+
+	wraps: function(el, where){
+		el = document.id(el, true);
+		return this.replaces(el).grab(el, where);
+	},
+
+	getPrevious: function(match, nocash){
+		return walk(this, 'previousSibling', null, match, false, nocash);
+	},
+
+	getAllPrevious: function(match, nocash){
+		return walk(this, 'previousSibling', null, match, true, nocash);
+	},
+
+	getNext: function(match, nocash){
+		return walk(this, 'nextSibling', null, match, false, nocash);
+	},
+
+	getAllNext: function(match, nocash){
+		return walk(this, 'nextSibling', null, match, true, nocash);
+	},
+
+	getFirst: function(match, nocash){
+		return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
+	},
+
+	getLast: function(match, nocash){
+		return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
+	},
+
+	getParent: function(match, nocash){
+		return walk(this, 'parentNode', null, match, false, nocash);
+	},
+
+	getParents: function(match, nocash){
+		return walk(this, 'parentNode', null, match, true, nocash);
+	},
+	
+	getSiblings: function(match, nocash){
+		return this.getParent().getChildren(match, nocash).erase(this);
+	},
+
+	getChildren: function(match, nocash){
+		return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
+	},
+
+	getWindow: function(){
+		return this.ownerDocument.window;
+	},
+
+	getDocument: function(){
+		return this.ownerDocument;
+	},
+
+	getElementById: function(id, nocash){
+		var el = this.ownerDocument.getElementById(id);
+		if (!el) return null;
+		for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
+			if (!parent) return null;
+		}
+		return document.id(el, nocash);
+	},
+
+	getSelected: function(){
+		return new Elements($A(this.options).filter(function(option){
+			return option.selected;
+		}));
+	},
+
+	getComputedStyle: function(property){
+		if (this.currentStyle) return this.currentStyle[property.camelCase()];
+		var computed = this.getDocument().defaultView.getComputedStyle(this, null);
+		return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
+	},
+
+	toQueryString: function(){
+		var queryString = [];
+		this.getElements('input, select, textarea', true).each(function(el){
+			if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return;
+			var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
+				return opt.value;
+			}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
+			$splat(value).each(function(val){
+				if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val));
+			});
+		});
+		return queryString.join('&');
+	},
+
+	clone: function(contents, keepid){
+		contents = contents !== false;
+		var clone = this.cloneNode(contents);
+		var clean = function(node, element){
+			if (!keepid) node.removeAttribute('id');
+			if (Browser.Engine.trident){
+				node.clearAttributes();
+				node.mergeAttributes(element);
+				node.removeAttribute('uid');
+				if (node.options){
+					var no = node.options, eo = element.options;
+					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
+				}
+			}
+			var prop = props[element.tagName.toLowerCase()];
+			if (prop && element[prop]) node[prop] = element[prop];
+		};
+
+		if (contents){
+			var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
+			for (var i = ce.length; i--;) clean(ce[i], te[i]);
+		}
+
+		clean(clone, this);
+		return document.id(clone);
+	},
+
+	destroy: function(){
+		Element.empty(this);
+		Element.dispose(this);
+		clean(this, true);
+		return null;
+	},
+
+	empty: function(){
+		$A(this.childNodes).each(function(node){
+			Element.destroy(node);
+		});
+		return this;
+	},
+
+	dispose: function(){
+		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
+	},
+
+	hasChild: function(el){
+		el = document.id(el, true);
+		if (!el) return false;
+		if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
+		return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
+	},
+
+	match: function(tag){
+		return (!tag || (tag == this) || (Element.get(this, 'tag') == tag));
+	}
+
+});
+
+Native.implement([Element, Window, Document], {
+
+	addListener: function(type, fn){
+		if (type == 'unload'){
+			var old = fn, self = this;
+			fn = function(){
+				self.removeListener('unload', fn);
+				old();
+			};
+		} else {
+			collected[this.uid] = this;
+		}
+		if (this.addEventListener) this.addEventListener(type, fn, false);
+		else this.attachEvent('on' + type, fn);
+		return this;
+	},
+
+	removeListener: function(type, fn){
+		if (this.removeEventListener) this.removeEventListener(type, fn, false);
+		else this.detachEvent('on' + type, fn);
+		return this;
+	},
+
+	retrieve: function(property, dflt){
+		var storage = get(this.uid), prop = storage[property];
+		if (dflt != undefined && prop == undefined) prop = storage[property] = dflt;
+		return $pick(prop);
+	},
+
+	store: function(property, value){
+		var storage = get(this.uid);
+		storage[property] = value;
+		return this;
+	},
+
+	eliminate: function(property){
+		var storage = get(this.uid);
+		delete storage[property];
+		return this;
+	}
+
+});
+
+window.addListener('unload', purge);
+
+})();
+
+Element.Properties = new Hash;
+
+Element.Properties.style = {
+
+	set: function(style){
+		this.style.cssText = style;
+	},
+
+	get: function(){
+		return this.style.cssText;
+	},
+
+	erase: function(){
+		this.style.cssText = '';
+	}
+
+};
+
+Element.Properties.tag = {
+
+	get: function(){
+		return this.tagName.toLowerCase();
+	}
+
+};
+
+Element.Properties.html = (function(){
+	var wrapper = document.createElement('div');
+
+	var translations = {
+		table: [1, '<table>', '</table>'],
+		select: [1, '<select>', '</select>'],
+		tbody: [2, '<table><tbody>', '</tbody></table>'],
+		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
+	};
+	translations.thead = translations.tfoot = translations.tbody;
+
+	var html = {
+		set: function(){
+			var html = Array.flatten(arguments).join('');
+			var wrap = Browser.Engine.trident && translations[this.get('tag')];
+			if (wrap){
+				var first = wrapper;
+				first.innerHTML = wrap[1] + html + wrap[2];
+				for (var i = wrap[0]; i--;) first = first.firstChild;
+				this.empty().adopt(first.childNodes);
+			} else {
+				this.innerHTML = html;
+			}
+		}
+	};
+
+	html.erase = html.set;
+
+	return html;
+})();
+
+if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = {
+	get: function(){
+		if (this.innerText) return this.innerText;
+		var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body);
+		var text = temp.innerText;
+		temp.destroy();
+		return text;
+	}
+};
+/*
+---
+
+script: Element.Event.js
+
+description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events.
+
+license: MIT-style license.
+
+requires: 
+- /Element
+- /Event
+
+provides: [Element.Event]
+
+...
+*/
+
+Element.Properties.events = {set: function(events){
+	this.addEvents(events);
+}};
+
+Native.implement([Element, Window, Document], {
+
+	addEvent: function(type, fn){
+		var events = this.retrieve('events', {});
+		events[type] = events[type] || {'keys': [], 'values': []};
+		if (events[type].keys.contains(fn)) return this;
+		events[type].keys.push(fn);
+		var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
+		if (custom){
+			if (custom.onAdd) custom.onAdd.call(this, fn);
+			if (custom.condition){
+				condition = function(event){
+					if (custom.condition.call(this, event)) return fn.call(this, event);
+					return true;
+				};
+			}
+			realType = custom.base || realType;
+		}
+		var defn = function(){
+			return fn.call(self);
+		};
+		var nativeEvent = Element.NativeEvents[realType];
+		if (nativeEvent){
+			if (nativeEvent == 2){
+				defn = function(event){
+					event = new Event(event, self.getWindow());
+					if (condition.call(self, event) === false) event.stop();
+				};
+			}
+			this.addListener(realType, defn);
+		}
+		events[type].values.push(defn);
+		return this;
+	},
+
+	removeEvent: function(type, fn){
+		var events = this.retrieve('events');
+		if (!events || !events[type]) return this;
+		var pos = events[type].keys.indexOf(fn);
+		if (pos == -1) return this;
+		events[type].keys.splice(pos, 1);
+		var value = events[type].values.splice(pos, 1)[0];
+		var custom = Element.Events.get(type);
+		if (custom){
+			if (custom.onRemove) custom.onRemove.call(this, fn);
+			type = custom.base || type;
+		}
+		return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
+	},
+
+	addEvents: function(events){
+		for (var event in events) this.addEvent(event, events[event]);
+		return this;
+	},
+
+	removeEvents: function(events){
+		var type;
+		if ($type(events) == 'object'){
+			for (type in events) this.removeEvent(type, events[type]);
+			return this;
+		}
+		var attached = this.retrieve('events');
+		if (!attached) return this;
+		if (!events){
+			for (type in attached) this.removeEvents(type);
+			this.eliminate('events');
+		} else if (attached[events]){
+			while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]);
+			attached[events] = null;
+		}
+		return this;
+	},
+
+	fireEvent: function(type, args, delay){
+		var events = this.retrieve('events');
+		if (!events || !events[type]) return this;
+		events[type].keys.each(function(fn){
+			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
+		}, this);
+		return this;
+	},
+
+	cloneEvents: function(from, type){
+		from = document.id(from);
+		var fevents = from.retrieve('events');
+		if (!fevents) return this;
+		if (!type){
+			for (var evType in fevents) this.cloneEvents(from, evType);
+		} else if (fevents[type]){
+			fevents[type].keys.each(function(fn){
+				this.addEvent(type, fn);
+			}, this);
+		}
+		return this;
+	}
+
+});
+
+Element.NativeEvents = {
+	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
+	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
+	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
+	keydown: 2, keypress: 2, keyup: 2, //keyboard
+	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
+	load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
+	error: 1, abort: 1, scroll: 1 //misc
+};
+
+(function(){
+
+var $check = function(event){
+	var related = event.relatedTarget;
+	if (related == undefined) return true;
+	if (related === false) return false;
+	return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
+};
+
+Element.Events = new Hash({
+
+	mouseenter: {
+		base: 'mouseover',
+		condition: $check
+	},
+
+	mouseleave: {
+		base: 'mouseout',
+		condition: $check
+	},
+
+	mousewheel: {
+		base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
+	}
+
+});
+
+})();
+/*
+---
+
+script: Element.Style.js
+
+description: Contains methods for interacting with the styles of Elements in a fashionable way.
+
+license: MIT-style license.
+
+requires:
+- /Element
+
+provides: [Element.Style]
+
+...
+*/
+
+Element.Properties.styles = {set: function(styles){
+	this.setStyles(styles);
+}};
+
+Element.Properties.opacity = {
+
+	set: function(opacity, novisibility){
+		if (!novisibility){
+			if (opacity == 0){
+				if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
+			} else {
+				if (this.style.visibility != 'visible') this.style.visibility = 'visible';
+			}
+		}
+		if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
+		if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
+		this.style.opacity = opacity;
+		this.store('opacity', opacity);
+	},
+
+	get: function(){
+		return this.retrieve('opacity', 1);
+	}
+
+};
+
+Element.implement({
+
+	setOpacity: function(value){
+		return this.set('opacity', value, true);
+	},
+
+	getOpacity: function(){
+		return this.get('opacity');
+	},
+
+	setStyle: function(property, value){
+		switch (property){
+			case 'opacity': return this.set('opacity', parseFloat(value));
+			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
+		}
+		property = property.camelCase();
+		if ($type(value) != 'string'){
+			var map = (Element.Styles.get(property) || '@').split(' ');
+			value = $splat(value).map(function(val, i){
+				if (!map[i]) return '';
+				return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
+			}).join(' ');
+		} else if (value == String(Number(value))){
+			value = Math.round(value);
+		}
+		this.style[property] = value;
+		return this;
+	},
+
+	getStyle: function(property){
+		switch (property){
+			case 'opacity': return this.get('opacity');
+			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
+		}
+		property = property.camelCase();
+		var result = this.style[property];
+		if (!$chk(result)){
+			result = [];
+			for (var style in Element.ShortStyles){
+				if (property != style) continue;
+				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
+				return result.join(' ');
+			}
+			result = this.getComputedStyle(property);
+		}
+		if (result){
+			result = String(result);
+			var color = result.match(/rgba?\([\d\s,]+\)/);
+			if (color) result = result.replace(color[0], color[0].rgbToHex());
+		}
+		if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){
+			if (property.test(/^(height|width)$/)){
+				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
+				values.each(function(value){
+					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
+				}, this);
+				return this['offset' + property.capitalize()] - size + 'px';
+			}
+			if ((Browser.Engine.presto) && String(result).test('px')) return result;
+			if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
+		}
+		return result;
+	},
+
+	setStyles: function(styles){
+		for (var style in styles) this.setStyle(style, styles[style]);
+		return this;
+	},
+
+	getStyles: function(){
+		var result = {};
+		Array.flatten(arguments).each(function(key){
+			result[key] = this.getStyle(key);
+		}, this);
+		return result;
+	}
+
+});
+
+Element.Styles = new Hash({
+	left: '@px', top: '@px', bottom: '@px', right: '@px',
+	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
+	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
+	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
+	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
+	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
+	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
+});
+
+Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
+
+['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
+	var Short = Element.ShortStyles;
+	var All = Element.Styles;
+	['margin', 'padding'].each(function(style){
+		var sd = style + direction;
+		Short[style][sd] = All[sd] = '@px';
+	});
+	var bd = 'border' + direction;
+	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
+	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
+	Short[bd] = {};
+	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
+	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
+	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
+});
+/*
+---
+
+script: Element.Dimensions.js
+
+description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
+
+license: MIT-style license.
+
+credits:
+- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
+- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
+
+requires:
+- /Element
+
+provides: [Element.Dimensions]
+
+...
+*/
+
+(function(){
+
+Element.implement({
+
+	scrollTo: function(x, y){
+		if (isBody(this)){
+			this.getWindow().scrollTo(x, y);
+		} else {
+			this.scrollLeft = x;
+			this.scrollTop = y;
+		}
+		return this;
+	},
+
+	getSize: function(){
+		if (isBody(this)) return this.getWindow().getSize();
+		return {x: this.offsetWidth, y: this.offsetHeight};
+	},
+
+	getScrollSize: function(){
+		if (isBody(this)) return this.getWindow().getScrollSize();
+		return {x: this.scrollWidth, y: this.scrollHeight};
+	},
+
+	getScroll: function(){
+		if (isBody(this)) return this.getWindow().getScroll();
+		return {x: this.scrollLeft, y: this.scrollTop};
+	},
+
+	getScrolls: function(){
+		var element = this, position = {x: 0, y: 0};
+		while (element && !isBody(element)){
+			position.x += element.scrollLeft;
+			position.y += element.scrollTop;
+			element = element.parentNode;
+		}
+		return position;
+	},
+
+	getOffsetParent: function(){
+		var element = this;
+		if (isBody(element)) return null;
+		if (!Browser.Engine.trident) return element.offsetParent;
+		while ((element = element.parentNode) && !isBody(element)){
+			if (styleString(element, 'position') != 'static') return element;
+		}
+		return null;
+	},
+
+	getOffsets: function(){
+		if (this.getBoundingClientRect){
+			var bound = this.getBoundingClientRect(),
+				html = document.id(this.getDocument().documentElement),
+				htmlScroll = html.getScroll(),
+				elemScrolls = this.getScrolls(),
+				elemScroll = this.getScroll(),
+				isFixed = (styleString(this, 'position') == 'fixed');
+
+			return {
+				x: bound.left.toInt() + elemScrolls.x - elemScroll.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
+				y: bound.top.toInt()  + elemScrolls.y - elemScroll.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
+			};
+		}
+
+		var element = this, position = {x: 0, y: 0};
+		if (isBody(this)) return position;
+
+		while (element && !isBody(element)){
+			position.x += element.offsetLeft;
+			position.y += element.offsetTop;
+
+			if (Browser.Engine.gecko){
+				if (!borderBox(element)){
+					position.x += leftBorder(element);
+					position.y += topBorder(element);
+				}
+				var parent = element.parentNode;
+				if (parent && styleString(parent, 'overflow') != 'visible'){
+					position.x += leftBorder(parent);
+					position.y += topBorder(parent);
+				}
+			} else if (element != this && Browser.Engine.webkit){
+				position.x += leftBorder(element);
+				position.y += topBorder(element);
+			}
+
+			element = element.offsetParent;
+		}
+		if (Browser.Engine.gecko && !borderBox(this)){
+			position.x -= leftBorder(this);
+			position.y -= topBorder(this);
+		}
+		return position;
+	},
+
+	getPosition: function(relative){
+		if (isBody(this)) return {x: 0, y: 0};
+		var offset = this.getOffsets(),
+				scroll = this.getScrolls();
+		var position = {
+			x: offset.x - scroll.x,
+			y: offset.y - scroll.y
+		};
+		var relativePosition = (relative && (relative = document.id(relative))) ? relative.getPosition() : {x: 0, y: 0};
+		return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
+	},
+
+	getCoordinates: function(element){
+		if (isBody(this)) return this.getWindow().getCoordinates();
+		var position = this.getPosition(element),
+				size = this.getSize();
+		var obj = {
+			left: position.x,
+			top: position.y,
+			width: size.x,
+			height: size.y
+		};
+		obj.right = obj.left + obj.width;
+		obj.bottom = obj.top + obj.height;
+		return obj;
+	},
+
+	computePosition: function(obj){
+		return {
+			left: obj.x - styleNumber(this, 'margin-left'),
+			top: obj.y - styleNumber(this, 'margin-top')
+		};
+	},
+
+	setPosition: function(obj){
+		return this.setStyles(this.computePosition(obj));
+	}
+
+});
+
+
+Native.implement([Document, Window], {
+
+	getSize: function(){
+		if (Browser.Engine.presto || Browser.Engine.webkit){
+			var win = this.getWindow();
+			return {x: win.innerWidth, y: win.innerHeight};
+		}
+		var doc = getCompatElement(this);
+		return {x: doc.clientWidth, y: doc.clientHeight};
+	},
+
+	getScroll: function(){
+		var win = this.getWindow(), doc = getCompatElement(this);
+		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
+	},
+
+	getScrollSize: function(){
+		var doc = getCompatElement(this), min = this.getSize();
+		return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
+	},
+
+	getPosition: function(){
+		return {x: 0, y: 0};
+	},
+
+	getCoordinates: function(){
+		var size = this.getSize();
+		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
+	}
+
+});
+
+// private methods
+
+var styleString = Element.getComputedStyle;
+
+function styleNumber(element, style){
+	return styleString(element, style).toInt() || 0;
+};
+
+function borderBox(element){
+	return styleString(element, '-moz-box-sizing') == 'border-box';
+};
+
+function topBorder(element){
+	return styleNumber(element, 'border-top-width');
+};
+
+function leftBorder(element){
+	return styleNumber(element, 'border-left-width');
+};
+
+function isBody(element){
+	return (/^(?:body|html)$/i).test(element.tagName);
+};
+
+function getCompatElement(element){
+	var doc = element.getDocument();
+	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
+};
+
+})();
+
+//aliases
+Element.alias('setPosition', 'position'); //compatability
+
+Native.implement([Window, Document, Element], {
+
+	getHeight: function(){
+		return this.getSize().y;
+	},
+
+	getWidth: function(){
+		return this.getSize().x;
+	},
+
+	getScrollTop: function(){
+		return this.getScroll().y;
+	},
+
+	getScrollLeft: function(){
+		return this.getScroll().x;
+	},
+
+	getScrollHeight: function(){
+		return this.getScrollSize().y;
+	},
+
+	getScrollWidth: function(){
+		return this.getScrollSize().x;
+	},
+
+	getTop: function(){
+		return this.getPosition().y;
+	},
+
+	getLeft: function(){
+		return this.getPosition().x;
+	}
+
+});
+/*
+---
+
+script: Selectors.js
+
+description: Adds advanced CSS-style querying capabilities for targeting HTML Elements. Includes pseudo selectors.
+
+license: MIT-style license.
+
+requires:
+- /Element
+
+provides: [Selectors]
+
+...
+*/
+
+Native.implement([Document, Element], {
+
+	getElements: function(expression, nocash){
+		expression = expression.split(',');
+		var items, local = {};
+		for (var i = 0, l = expression.length; i < l; i++){
+			var selector = expression[i], elements = Selectors.Utils.search(this, selector, local);
+			if (i != 0 && elements.item) elements = $A(elements);
+			items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements);
+		}
+		return new Elements(items, {ddup: (expression.length > 1), cash: !nocash});
+	}
+
+});
+
+Element.implement({
+
+	match: function(selector){
+		if (!selector || (selector == this)) return true;
+		var tagid = Selectors.Utils.parseTagAndID(selector);
+		var tag = tagid[0], id = tagid[1];
+		if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
+		var parsed = Selectors.Utils.parseSelector(selector);
+		return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true;
+	}
+
+});
+
+var Selectors = {Cache: {nth: {}, parsed: {}}};
+
+Selectors.RegExps = {
+	id: (/#([\w-]+)/),
+	tag: (/^(\w+|\*)/),
+	quick: (/^(\w+|\*)$/),
+	splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),
+	combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)
+};
+
+Selectors.Utils = {
+
+	chk: function(item, uniques){
+		if (!uniques) return true;
+		var uid = $uid(item);
+		if (!uniques[uid]) return uniques[uid] = true;
+		return false;
+	},
+
+	parseNthArgument: function(argument){
+		if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument];
+		var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);
+		if (!parsed) return false;
+		var inta = parseInt(parsed[1], 10);
+		var a = (inta || inta === 0) ? inta : 1;
+		var special = parsed[2] || false;
+		var b = parseInt(parsed[3], 10) || 0;
+		if (a != 0){
+			b--;
+			while (b < 1) b += a;
+			while (b >= a) b -= a;
+		} else {
+			a = b;
+			special = 'index';
+		}
+		switch (special){
+			case 'n': parsed = {a: a, b: b, special: 'n'}; break;
+			case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break;
+			case 'even': parsed = {a: 2, b: 1, special: 'n'}; break;
+			case 'first': parsed = {a: 0, special: 'index'}; break;
+			case 'last': parsed = {special: 'last-child'}; break;
+			case 'only': parsed = {special: 'only-child'}; break;
+			default: parsed = {a: (a - 1), special: 'index'};
+		}
+
+		return Selectors.Cache.nth[argument] = parsed;
+	},
+
+	parseSelector: function(selector){
+		if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector];
+		var m, parsed = {classes: [], pseudos: [], attributes: []};
+		while ((m = Selectors.RegExps.combined.exec(selector))){
+			var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7];
+			if (cn){
+				parsed.classes.push(cn);
+			} else if (pn){
+				var parser = Selectors.Pseudo.get(pn);
+				if (parser) parsed.pseudos.push({parser: parser, argument: pa});
+				else parsed.attributes.push({name: pn, operator: '=', value: pa});
+			} else if (an){
+				parsed.attributes.push({name: an, operator: ao, value: av});
+			}
+		}
+		if (!parsed.classes.length) delete parsed.classes;
+		if (!parsed.attributes.length) delete parsed.attributes;
+		if (!parsed.pseudos.length) delete parsed.pseudos;
+		if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null;
+		return Selectors.Cache.parsed[selector] = parsed;
+	},
+
+	parseTagAndID: function(selector){
+		var tag = selector.match(Selectors.RegExps.tag);
+		var id = selector.match(Selectors.RegExps.id);
+		return [(tag) ? tag[1] : '*', (id) ? id[1] : false];
+	},
+
+	filter: function(item, parsed, local){
+		var i;
+		if (parsed.classes){
+			for (i = parsed.classes.length; i--; i){
+				var cn = parsed.classes[i];
+				if (!Selectors.Filters.byClass(item, cn)) return false;
+			}
+		}
+		if (parsed.attributes){
+			for (i = parsed.attributes.length; i--; i){
+				var att = parsed.attributes[i];
+				if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false;
+			}
+		}
+		if (parsed.pseudos){
+			for (i = parsed.pseudos.length; i--; i){
+				var psd = parsed.pseudos[i];
+				if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false;
+			}
+		}
+		return true;
+	},
+
+	getByTagAndID: function(ctx, tag, id){
+		if (id){
+			var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true);
+			return (item && Selectors.Filters.byTag(item, tag)) ? [item] : [];
+		} else {
+			return ctx.getElementsByTagName(tag);
+		}
+	},
+
+	search: function(self, expression, local){
+		var splitters = [];
+
+		var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){
+			splitters.push(m1);
+			return ':)' + m2;
+		}).split(':)');
+
+		var items, filtered, item;
+
+		for (var i = 0, l = selectors.length; i < l; i++){
+
+			var selector = selectors[i];
+
+			if (i == 0 && Selectors.RegExps.quick.test(selector)){
+				items = self.getElementsByTagName(selector);
+				continue;
+			}
+
+			var splitter = splitters[i - 1];
+
+			var tagid = Selectors.Utils.parseTagAndID(selector);
+			var tag = tagid[0], id = tagid[1];
+
+			if (i == 0){
+				items = Selectors.Utils.getByTagAndID(self, tag, id);
+			} else {
+				var uniques = {}, found = [];
+				for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques);
+				items = found;
+			}
+
+			var parsed = Selectors.Utils.parseSelector(selector);
+
+			if (parsed){
+				filtered = [];
+				for (var m = 0, n = items.length; m < n; m++){
+					item = items[m];
+					if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item);
+				}
+				items = filtered;
+			}
+
+		}
+
+		return items;
+
+	}
+
+};
+
+Selectors.Getters = {
+
+	' ': function(found, self, tag, id, uniques){
+		var items = Selectors.Utils.getByTagAndID(self, tag, id);
+		for (var i = 0, l = items.length; i < l; i++){
+			var item = items[i];
+			if (Selectors.Utils.chk(item, uniques)) found.push(item);
+		}
+		return found;
+	},
+
+	'>': function(found, self, tag, id, uniques){
+		var children = Selectors.Utils.getByTagAndID(self, tag, id);
+		for (var i = 0, l = children.length; i < l; i++){
+			var child = children[i];
+			if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child);
+		}
+		return found;
+	},
+
+	'+': function(found, self, tag, id, uniques){
+		while ((self = self.nextSibling)){
+			if (self.nodeType == 1){
+				if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
+				break;
+			}
+		}
+		return found;
+	},
+
+	'~': function(found, self, tag, id, uniques){
+		while ((self = self.nextSibling)){
+			if (self.nodeType == 1){
+				if (!Selectors.Utils.chk(self, uniques)) break;
+				if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
+			}
+		}
+		return found;
+	}
+
+};
+
+Selectors.Filters = {
+
+	byTag: function(self, tag){
+		return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
+	},
+
+	byID: function(self, id){
+		return (!id || (self.id && self.id == id));
+	},
+
+	byClass: function(self, klass){
+		return (self.className && self.className.contains && self.className.contains(klass, ' '));
+	},
+
+	byPseudo: function(self, parser, argument, local){
+		return parser.call(self, argument, local);
+	},
+
+	byAttribute: function(self, name, operator, value){
+		var result = Element.prototype.getProperty.call(self, name);
+		if (!result) return (operator == '!=');
+		if (!operator || value == undefined) return true;
+		switch (operator){
+			case '=': return (result == value);
+			case '*=': return (result.contains(value));
+			case '^=': return (result.substr(0, value.length) == value);
+			case '$=': return (result.substr(result.length - value.length) == value);
+			case '!=': return (result != value);
+			case '~=': return result.contains(value, ' ');
+			case '|=': return result.contains(value, '-');
+		}
+		return false;
+	}
+
+};
+
+Selectors.Pseudo = new Hash({
+
+	// w3c pseudo selectors
+
+	checked: function(){
+		return this.checked;
+	},
+	
+	empty: function(){
+		return !(this.innerText || this.textContent || '').length;
+	},
+
+	not: function(selector){
+		return !Element.match(this, selector);
+	},
+
+	contains: function(text){
+		return (this.innerText || this.textContent || '').contains(text);
+	},
+
+	'first-child': function(){
+		return Selectors.Pseudo.index.call(this, 0);
+	},
+
+	'last-child': function(){
+		var element = this;
+		while ((element = element.nextSibling)){
+			if (element.nodeType == 1) return false;
+		}
+		return true;
+	},
+
+	'only-child': function(){
+		var prev = this;
+		while ((prev = prev.previousSibling)){
+			if (prev.nodeType == 1) return false;
+		}
+		var next = this;
+		while ((next = next.nextSibling)){
+			if (next.nodeType == 1) return false;
+		}
+		return true;
+	},
+
+	'nth-child': function(argument, local){
+		argument = (argument == undefined) ? 'n' : argument;
+		var parsed = Selectors.Utils.parseNthArgument(argument);
+		if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
+		var count = 0;
+		local.positions = local.positions || {};
+		var uid = $uid(this);
+		if (!local.positions[uid]){
+			var self = this;
+			while ((self = self.previousSibling)){
+				if (self.nodeType != 1) continue;
+				count ++;
+				var position = local.positions[$uid(self)];
+				if (position != undefined){
+					count = position + count;
+					break;
+				}
+			}
+			local.positions[uid] = count;
+		}
+		return (local.positions[uid] % parsed.a == parsed.b);
+	},
+
+	// custom pseudo selectors
+
+	index: function(index){
+		var element = this, count = 0;
+		while ((element = element.previousSibling)){
+			if (element.nodeType == 1 && ++count > index) return false;
+		}
+		return (count == index);
+	},
+
+	even: function(argument, local){
+		return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
+	},
+
+	odd: function(argument, local){
+		return Selectors.Pseudo['nth-child'].call(this, '2n', local);
+	},
+	
+	selected: function(){
+		return this.selected;
+	},
+	
+	enabled: function(){
+		return (this.disabled === false);
+	}
+
+});
+/*
+---
+
+script: DomReady.js
+
+description: Contains the custom event domready.
+
+license: MIT-style license.
+
+requires:
+- /Element.Event
+
+provides: [DomReady]
+
+...
+*/
+
+Element.Events.domready = {
+
+	onAdd: function(fn){
+		if (Browser.loaded) fn.call(this);
+	}
+
+};
+
+(function(){
+
+	var domready = function(){
+		if (Browser.loaded) return;
+		Browser.loaded = true;
+		window.fireEvent('domready');
+		document.fireEvent('domready');
+	};
+	
+	window.addEvent('load', domready);
+
+	if (Browser.Engine.trident){
+		var temp = document.createElement('div');
+		(function(){
+			($try(function(){
+				temp.doScroll(); // Technique by Diego Perini
+				return document.id(temp).inject(document.body).set('html', 'temp').dispose();
+			})) ? domready() : arguments.callee.delay(50);
+		})();
+	} else if (Browser.Engine.webkit && Browser.Engine.version < 525){
+		(function(){
+			(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
+		})();
+	} else {
+		document.addEvent('DOMContentLoaded', domready);
+	}
+
+})();
+/*
+---
+
+script: JSON.js
+
+description: JSON encoder and decoder.
+
+license: MIT-style license.
+
+See Also: <http://www.json.org/>
+
+requires:
+- /Array
+- /String
+- /Number
+- /Function
+- /Hash
+
+provides: [JSON]
+
+...
+*/
+
+var JSON = new Hash(this.JSON && {
+	stringify: JSON.stringify,
+	parse: JSON.parse
+}).extend({
+	
+	$specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
+
+	$replaceChars: function(chr){
+		return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
+	},
+
+	encode: function(obj){
+		switch ($type(obj)){
+			case 'string':
+				return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
+			case 'array':
+				return '[' + String(obj.map(JSON.encode).clean()) + ']';
+			case 'object': case 'hash':
+				var string = [];
+				Hash.each(obj, function(value, key){
+					var json = JSON.encode(value);
+					if (json) string.push(JSON.encode(key) + ':' + json);
+				});
+				return '{' + string + '}';
+			case 'number': case 'boolean': return String(obj);
+			case false: return 'null';
+		}
+		return null;
+	},
+
+	decode: function(string, secure){
+		if ($type(string) != 'string' || !string.length) return null;
+		if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
+		return eval('(' + string + ')');
+	}
+
+});
+
+Native.implement([Hash, Array, String, Number], {
+
+	toJSON: function(){
+		return JSON.encode(this);
+	}
+
+});
+/*
+---
+
+script: Cookie.js
+
+description: Class for creating, reading, and deleting browser Cookies.
+
+license: MIT-style license.
+
+credits:
+- Based on the functions by Peter-Paul Koch (http://quirksmode.org).
+
+requires:
+- /Options
+
+provides: [Cookie]
+
+...
+*/
+
+var Cookie = new Class({
+
+	Implements: Options,
+
+	options: {
+		path: false,
+		domain: false,
+		duration: false,
+		secure: false,
+		document: document
+	},
+
+	initialize: function(key, options){
+		this.key = key;
+		this.setOptions(options);
+	},
+
+	write: function(value){
+		value = encodeURIComponent(value);
+		if (this.options.domain) value += '; domain=' + this.options.domain;
+		if (this.options.path) value += '; path=' + this.options.path;
+		if (this.options.duration){
+			var date = new Date();
+			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
+			value += '; expires=' + date.toGMTString();
+		}
+		if (this.options.secure) value += '; secure';
+		this.options.document.cookie = this.key + '=' + value;
+		return this;
+	},
+
+	read: function(){
+		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
+		return (value) ? decodeURIComponent(value[1]) : null;
+	},
+
+	dispose: function(){
+		new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
+		return this;
+	}
+
+});
+
+Cookie.write = function(key, value, options){
+	return new Cookie(key, options).write(value);
+};
+
+Cookie.read = function(key){
+	return new Cookie(key).read();
+};
+
+Cookie.dispose = function(key, options){
+	return new Cookie(key, options).dispose();
+};
+/*
+---
+
+script: Swiff.js
+
+description: Wrapper for embedding SWF movies. Supports External Interface Communication.
+
+license: MIT-style license.
+
+credits: 
+- Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
+
+requires:
+- /Options
+- /$util
+
+provides: [Swiff]
+
+...
+*/
+
+var Swiff = new Class({
+
+	Implements: [Options],
+
+	options: {
+		id: null,
+		height: 1,
+		width: 1,
+		container: null,
+		properties: {},
+		params: {
+			quality: 'high',
+			allowScriptAccess: 'always',
+			wMode: 'transparent',
+			swLiveConnect: true
+		},
+		callBacks: {},
+		vars: {}
+	},
+
+	toElement: function(){
+		return this.object;
+	},
+
+	initialize: function(path, options){
+		this.instance = 'Swiff_' + $time();
+
+		this.setOptions(options);
+		options = this.options;
+		var id = this.id = options.id || this.instance;
+		var container = document.id(options.container);
+
+		Swiff.CallBacks[this.instance] = {};
+
+		var params = options.params, vars = options.vars, callBacks = options.callBacks;
+		var properties = $extend({height: options.height, width: options.width}, options.properties);
+
+		var self = this;
+
+		for (var callBack in callBacks){
+			Swiff.CallBacks[this.instance][callBack] = (function(option){
+				return function(){
+					return option.apply(self.object, arguments);
+				};
+			})(callBacks[callBack]);
+			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
+		}
+
+		params.flashVars = Hash.toQueryString(vars);
+		if (Browser.Engine.trident){
+			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
+			params.movie = path;
+		} else {
+			properties.type = 'application/x-shockwave-flash';
+			properties.data = path;
+		}
+		var build = '<object id="' + id + '"';
+		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
+		build += '>';
+		for (var param in params){
+			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
+		}
+		build += '</object>';
+		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
+	},
+
+	replaces: function(element){
+		element = document.id(element, true);
+		element.parentNode.replaceChild(this.toElement(), element);
+		return this;
+	},
+
+	inject: function(element){
+		document.id(element, true).appendChild(this.toElement());
+		return this;
+	},
+
+	remote: function(){
+		return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments));
+	}
+
+});
+
+Swiff.CallBacks = {};
+
+Swiff.remote = function(obj, fn){
+	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
+	return eval(rs);
+};
+/*
+---
+
+script: Fx.js
+
+description: Contains the basic animation logic to be extended by all other Fx Classes.
+
+license: MIT-style license.
+
+requires:
+- /Chain
+- /Events
+- /Options
+
+provides: [Fx]
+
+...
+*/
+
+var Fx = new Class({
+
+	Implements: [Chain, Events, Options],
+
+	options: {
+		/*
+		onStart: $empty,
+		onCancel: $empty,
+		onComplete: $empty,
+		*/
+		fps: 50,
+		unit: false,
+		duration: 500,
+		link: 'ignore'
+	},
+
+	initialize: function(options){
+		this.subject = this.subject || this;
+		this.setOptions(options);
+		this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt();
+		var wait = this.options.wait;
+		if (wait === false) this.options.link = 'cancel';
+	},
+
+	getTransition: function(){
+		return function(p){
+			return -(Math.cos(Math.PI * p) - 1) / 2;
+		};
+	},
+
+	step: function(){
+		var time = $time();
+		if (time < this.time + this.options.duration){
+			var delta = this.transition((time - this.time) / this.options.duration);
+			this.set(this.compute(this.from, this.to, delta));
+		} else {
+			this.set(this.compute(this.from, this.to, 1));
+			this.complete();
+		}
+	},
+
+	set: function(now){
+		return now;
+	},
+
+	compute: function(from, to, delta){
+		return Fx.compute(from, to, delta);
+	},
+
+	check: function(){
+		if (!this.timer) return true;
+		switch (this.options.link){
+			case 'cancel': this.cancel(); return true;
+			case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
+		}
+		return false;
+	},
+
+	start: function(from, to){
+		if (!this.check(from, to)) return this;
+		this.from = from;
+		this.to = to;
+		this.time = 0;
+		this.transition = this.getTransition();
+		this.startTimer();
+		this.onStart();
+		return this;
+	},
+
+	complete: function(){
+		if (this.stopTimer()) this.onComplete();
+		return this;
+	},
+
+	cancel: function(){
+		if (this.stopTimer()) this.onCancel();
+		return this;
+	},
+
+	onStart: function(){
+		this.fireEvent('start', this.subject);
+	},
+
+	onComplete: function(){
+		this.fireEvent('complete', this.subject);
+		if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
+	},
+
+	onCancel: function(){
+		this.fireEvent('cancel', this.subject).clearChain();
+	},
+
+	pause: function(){
+		this.stopTimer();
+		return this;
+	},
+
+	resume: function(){
+		this.startTimer();
+		return this;
+	},
+
+	stopTimer: function(){
+		if (!this.timer) return false;
+		this.time = $time() - this.time;
+		this.timer = $clear(this.timer);
+		return true;
+	},
+
+	startTimer: function(){
+		if (this.timer) return false;
+		this.time = $time() - this.time;
+		this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this);
+		return true;
+	}
+
+});
+
+Fx.compute = function(from, to, delta){
+	return (to - from) * delta + from;
+};
+
+Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
+/*
+---
+
+script: Fx.CSS.js
+
+description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
+
+license: MIT-style license.
+
+requires:
+- /Fx
+- /Element.Style
+
+provides: [Fx.CSS]
+
+...
+*/
+
+Fx.CSS = new Class({
+
+	Extends: Fx,
+
+	//prepares the base from/to object
+
+	prepare: function(element, property, values){
+		values = $splat(values);
+		var values1 = values[1];
+		if (!$chk(values1)){
+			values[1] = values[0];
+			values[0] = element.getStyle(property);
+		}
+		var parsed = values.map(this.parse);
+		return {from: parsed[0], to: parsed[1]};
+	},
+
+	//parses a value into an array
+
+	parse: function(value){
+		value = $lambda(value)();
+		value = (typeof value == 'string') ? value.split(' ') : $splat(value);
+		return value.map(function(val){
+			val = String(val);
+			var found = false;
+			Fx.CSS.Parsers.each(function(parser, key){
+				if (found) return;
+				var parsed = parser.parse(val);
+				if ($chk(parsed)) found = {value: parsed, parser: parser};
+			});
+			found = found || {value: val, parser: Fx.CSS.Parsers.String};
+			return found;
+		});
+	},
+
+	//computes by a from and to prepared objects, using their parsers.
+
+	compute: function(from, to, delta){
+		var computed = [];
+		(Math.min(from.length, to.length)).times(function(i){
+			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
+		});
+		computed.$family = {name: 'fx:css:value'};
+		return computed;
+	},
+
+	//serves the value as settable
+
+	serve: function(value, unit){
+		if ($type(value) != 'fx:css:value') value = this.parse(value);
+		var returned = [];
+		value.each(function(bit){
+			returned = returned.concat(bit.parser.serve(bit.value, unit));
+		});
+		return returned;
+	},
+
+	//renders the change to an element
+
+	render: function(element, property, value, unit){
+		element.setStyle(property, this.serve(value, unit));
+	},
+
+	//searches inside the page css to find the values for a selector
+
+	search: function(selector){
+		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
+		var to = {};
+		Array.each(document.styleSheets, function(sheet, j){
+			var href = sheet.href;
+			if (href && href.contains('://') && !href.contains(document.domain)) return;
+			var rules = sheet.rules || sheet.cssRules;
+			Array.each(rules, function(rule, i){
+				if (!rule.style) return;
+				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
+					return m.toLowerCase();
+				}) : null;
+				if (!selectorText || !selectorText.test('^' + selector + '$')) return;
+				Element.Styles.each(function(value, style){
+					if (!rule.style[style] || Element.ShortStyles[style]) return;
+					value = String(rule.style[style]);
+					to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
+				});
+			});
+		});
+		return Fx.CSS.Cache[selector] = to;
+	}
+
+});
+
+Fx.CSS.Cache = {};
+
+Fx.CSS.Parsers = new Hash({
+
+	Color: {
+		parse: function(value){
+			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
+			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
+		},
+		compute: function(from, to, delta){
+			return from.map(function(value, i){
+				return Math.round(Fx.compute(from[i], to[i], delta));
+			});
+		},
+		serve: function(value){
+			return value.map(Number);
+		}
+	},
+
+	Number: {
+		parse: parseFloat,
+		compute: Fx.compute,
+		serve: function(value, unit){
+			return (unit) ? value + unit : value;
+		}
+	},
+
+	String: {
+		parse: $lambda(false),
+		compute: $arguments(1),
+		serve: $arguments(0)
+	}
+
+});
+/*
+---
+
+script: Fx.Tween.js
+
+description: Formerly Fx.Style, effect to transition any CSS property for an element.
+
+license: MIT-style license.
+
+requires: 
+- /Fx.CSS
+
+provides: [Fx.Tween, Element.fade, Element.highlight]
+
+...
+*/
+
+Fx.Tween = new Class({
+
+	Extends: Fx.CSS,
+
+	initialize: function(element, options){
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+	},
+
+	set: function(property, now){
+		if (arguments.length == 1){
+			now = property;
+			property = this.property || this.options.property;
+		}
+		this.render(this.element, property, now, this.options.unit);
+		return this;
+	},
+
+	start: function(property, from, to){
+		if (!this.check(property, from, to)) return this;
+		var args = Array.flatten(arguments);
+		this.property = this.options.property || args.shift();
+		var parsed = this.prepare(this.element, this.property, args);
+		return this.parent(parsed.from, parsed.to);
+	}
+
+});
+
+Element.Properties.tween = {
+
+	set: function(options){
+		var tween = this.retrieve('tween');
+		if (tween) tween.cancel();
+		return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options));
+	},
+
+	get: function(options){
+		if (options || !this.retrieve('tween')){
+			if (options || !this.retrieve('tween:options')) this.set('tween', options);
+			this.store('tween', new Fx.Tween(this, this.retrieve('tween:options')));
+		}
+		return this.retrieve('tween');
+	}
+
+};
+
+Element.implement({
+
+	tween: function(property, from, to){
+		this.get('tween').start(arguments);
+		return this;
+	},
+
+	fade: function(how){
+		var fade = this.get('tween'), o = 'opacity', toggle;
+		how = $pick(how, 'toggle');
+		switch (how){
+			case 'in': fade.start(o, 1); break;
+			case 'out': fade.start(o, 0); break;
+			case 'show': fade.set(o, 1); break;
+			case 'hide': fade.set(o, 0); break;
+			case 'toggle':
+				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
+				fade.start(o, (flag) ? 0 : 1);
+				this.store('fade:flag', !flag);
+				toggle = true;
+			break;
+			default: fade.start(o, arguments);
+		}
+		if (!toggle) this.eliminate('fade:flag');
+		return this;
+	},
+
+	highlight: function(start, end){
+		if (!end){
+			end = this.retrieve('highlight:original', this.getStyle('background-color'));
+			end = (end == 'transparent') ? '#fff' : end;
+		}
+		var tween = this.get('tween');
+		tween.start('background-color', start || '#ffff88', end).chain(function(){
+			this.setStyle('background-color', this.retrieve('highlight:original'));
+			tween.callChain();
+		}.bind(this));
+		return this;
+	}
+
+});
+/*
+---
+
+script: Fx.Morph.js
+
+description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
+
+license: MIT-style license.
+
+requires:
+- /Fx.CSS
+
+provides: [Fx.Morph]
+
+...
+*/
+
+Fx.Morph = new Class({
+
+	Extends: Fx.CSS,
+
+	initialize: function(element, options){
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+	},
+
+	set: function(now){
+		if (typeof now == 'string') now = this.search(now);
+		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
+		return this;
+	},
+
+	compute: function(from, to, delta){
+		var now = {};
+		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
+		return now;
+	},
+
+	start: function(properties){
+		if (!this.check(properties)) return this;
+		if (typeof properties == 'string') properties = this.search(properties);
+		var from = {}, to = {};
+		for (var p in properties){
+			var parsed = this.prepare(this.element, p, properties[p]);
+			from[p] = parsed.from;
+			to[p] = parsed.to;
+		}
+		return this.parent(from, to);
+	}
+
+});
+
+Element.Properties.morph = {
+
+	set: function(options){
+		var morph = this.retrieve('morph');
+		if (morph) morph.cancel();
+		return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options));
+	},
+
+	get: function(options){
+		if (options || !this.retrieve('morph')){
+			if (options || !this.retrieve('morph:options')) this.set('morph', options);
+			this.store('morph', new Fx.Morph(this, this.retrieve('morph:options')));
+		}
+		return this.retrieve('morph');
+	}
+
+};
+
+Element.implement({
+
+	morph: function(props){
+		this.get('morph').start(props);
+		return this;
+	}
+
+});
+/*
+---
+
+script: Fx.Transitions.js
+
+description: Contains a set of advanced transitions to be used with any of the Fx Classes.
+
+license: MIT-style license.
+
+credits:
+- Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
+
+requires:
+- /Fx
+
+provides: [Fx.Transitions]
+
+...
+*/
+
+Fx.implement({
+
+	getTransition: function(){
+		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
+		if (typeof trans == 'string'){
+			var data = trans.split(':');
+			trans = Fx.Transitions;
+			trans = trans[data[0]] || trans[data[0].capitalize()];
+			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
+		}
+		return trans;
+	}
+
+});
+
+Fx.Transition = function(transition, params){
+	params = $splat(params);
+	return $extend(transition, {
+		easeIn: function(pos){
+			return transition(pos, params);
+		},
+		easeOut: function(pos){
+			return 1 - transition(1 - pos, params);
+		},
+		easeInOut: function(pos){
+			return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2;
+		}
+	});
+};
+
+Fx.Transitions = new Hash({
+
+	linear: $arguments(0)
+
+});
+
+Fx.Transitions.extend = function(transitions){
+	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
+};
+
+Fx.Transitions.extend({
+
+	Pow: function(p, x){
+		return Math.pow(p, x[0] || 6);
+	},
+
+	Expo: function(p){
+		return Math.pow(2, 8 * (p - 1));
+	},
+
+	Circ: function(p){
+		return 1 - Math.sin(Math.acos(p));
+	},
+
+	Sine: function(p){
+		return 1 - Math.sin((1 - p) * Math.PI / 2);
+	},
+
+	Back: function(p, x){
+		x = x[0] || 1.618;
+		return Math.pow(p, 2) * ((x + 1) * p - x);
+	},
+
+	Bounce: function(p){
+		var value;
+		for (var a = 0, b = 1; 1; a += b, b /= 2){
+			if (p >= (7 - 4 * a) / 11){
+				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
+				break;
+			}
+		}
+		return value;
+	},
+
+	Elastic: function(p, x){
+		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
+	}
+
+});
+
+['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
+	Fx.Transitions[transition] = new Fx.Transition(function(p){
+		return Math.pow(p, [i + 2]);
+	});
+});
+/*
+---
+
+script: Request.js
+
+description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
+
+license: MIT-style license.
+
+requires:
+- /Element
+- /Chain
+- /Events
+- /Options
+- /Browser
+
+provides: [Request]
+
+...
+*/
+
+var Request = new Class({
+
+	Implements: [Chain, Events, Options],
+
+	options: {/*
+		onRequest: $empty,
+		onComplete: $empty,
+		onCancel: $empty,
+		onSuccess: $empty,
+		onFailure: $empty,
+		onException: $empty,*/
+		url: '',
+		data: '',
+		headers: {
+			'X-Requested-With': 'XMLHttpRequest',
+			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+		},
+		async: true,
+		format: false,
+		method: 'post',
+		link: 'ignore',
+		isSuccess: null,
+		emulation: true,
+		urlEncoded: true,
+		encoding: 'utf-8',
+		evalScripts: false,
+		evalResponse: false,
+		noCache: false
+	},
+
+	initialize: function(options){
+		this.xhr = new Browser.Request();
+		this.setOptions(options);
+		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
+		this.headers = new Hash(this.options.headers);
+	},
+
+	onStateChange: function(){
+		if (this.xhr.readyState != 4 || !this.running) return;
+		this.running = false;
+		this.status = 0;
+		$try(function(){
+			this.status = this.xhr.status;
+		}.bind(this));
+		this.xhr.onreadystatechange = $empty;
+		if (this.options.isSuccess.call(this, this.status)){
+			this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
+			this.success(this.response.text, this.response.xml);
+		} else {
+			this.response = {text: null, xml: null};
+			this.failure();
+		}
+	},
+
+	isSuccess: function(){
+		return ((this.status >= 200) && (this.status < 300));
+	},
+
+	processScripts: function(text){
+		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
+		return text.stripScripts(this.options.evalScripts);
+	},
+
+	success: function(text, xml){
+		this.onSuccess(this.processScripts(text), xml);
+	},
+
+	onSuccess: function(){
+		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
+	},
+
+	failure: function(){
+		this.onFailure();
+	},
+
+	onFailure: function(){
+		this.fireEvent('complete').fireEvent('failure', this.xhr);
+	},
+
+	setHeader: function(name, value){
+		this.headers.set(name, value);
+		return this;
+	},
+
+	getHeader: function(name){
+		return $try(function(){
+			return this.xhr.getResponseHeader(name);
+		}.bind(this));
+	},
+
+	check: function(){
+		if (!this.running) return true;
+		switch (this.options.link){
+			case 'cancel': this.cancel(); return true;
+			case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
+		}
+		return false;
+	},
+
+	send: function(options){
+		if (!this.check(options)) return this;
+		this.running = true;
+
+		var type = $type(options);
+		if (type == 'string' || type == 'element') options = {data: options};
+
+		var old = this.options;
+		options = $extend({data: old.data, url: old.url, method: old.method}, options);
+		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
+
+		switch ($type(data)){
+			case 'element': data = document.id(data).toQueryString(); break;
+			case 'object': case 'hash': data = Hash.toQueryString(data);
+		}
+
+		if (this.options.format){
+			var format = 'format=' + this.options.format;
+			data = (data) ? format + '&' + data : format;
+		}
+
+		if (this.options.emulation && !['get', 'post'].contains(method)){
+			var _method = '_method=' + method;
+			data = (data) ? _method + '&' + data : _method;
+			method = 'post';
+		}
+
+		if (this.options.urlEncoded && method == 'post'){
+			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
+			this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding);
+		}
+
+		if (this.options.noCache){
+			var noCache = 'noCache=' + new Date().getTime();
+			data = (data) ? noCache + '&' + data : noCache;
+		}
+
+		var trimPosition = url.lastIndexOf('/');
+		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
+
+		if (data && method == 'get'){
+			url = url + (url.contains('?') ? '&' : '?') + data;
+			data = null;
+		}
+
+		this.xhr.open(method.toUpperCase(), url, this.options.async);
+
+		this.xhr.onreadystatechange = this.onStateChange.bind(this);
+
+		this.headers.each(function(value, key){
+			try {
+				this.xhr.setRequestHeader(key, value);
+			} catch (e){
+				this.fireEvent('exception', [key, value]);
+			}
+		}, this);
+
+		this.fireEvent('request');
+		this.xhr.send(data);
+		if (!this.options.async) this.onStateChange();
+		return this;
+	},
+
+	cancel: function(){
+		if (!this.running) return this;
+		this.running = false;
+		this.xhr.abort();
+		this.xhr.onreadystatechange = $empty;
+		this.xhr = new Browser.Request();
+		this.fireEvent('cancel');
+		return this;
+	}
+
+});
+
+(function(){
+
+var methods = {};
+['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
+	methods[method] = function(){
+		var params = Array.link(arguments, {url: String.type, data: $defined});
+		return this.send($extend(params, {method: method}));
+	};
+});
+
+Request.implement(methods);
+
+})();
+
+Element.Properties.send = {
+
+	set: function(options){
+		var send = this.retrieve('send');
+		if (send) send.cancel();
+		return this.eliminate('send').store('send:options', $extend({
+			data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
+		}, options));
+	},
+
+	get: function(options){
+		if (options || !this.retrieve('send')){
+			if (options || !this.retrieve('send:options')) this.set('send', options);
+			this.store('send', new Request(this.retrieve('send:options')));
+		}
+		return this.retrieve('send');
+	}
+
+};
+
+Element.implement({
+
+	send: function(url){
+		var sender = this.get('send');
+		sender.send({data: this, url: url || sender.options.url});
+		return this;
+	}
+
+});
+/*
+---
+
+script: Request.HTML.js
+
+description: Extends the basic Request Class with additional methods for interacting with HTML responses.
+
+license: MIT-style license.
+
+requires:
+- /Request
+- /Element
+
+provides: [Request.HTML]
+
+...
+*/
+
+Request.HTML = new Class({
+
+	Extends: Request,
+
+	options: {
+		update: false,
+		append: false,
+		evalScripts: true,
+		filter: false
+	},
+
+	processHTML: function(text){
+		var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
+		text = (match) ? match[1] : text;
+
+		var container = new Element('div');
+
+		return $try(function(){
+			var root = '<root>' + text + '</root>', doc;
+			if (Browser.Engine.trident){
+				doc = new ActiveXObject('Microsoft.XMLDOM');
+				doc.async = false;
+				doc.loadXML(root);
+			} else {
+				doc = new DOMParser().parseFromString(root, 'text/xml');
+			}
+			root = doc.getElementsByTagName('root')[0];
+			if (!root) return null;
+			for (var i = 0, k = root.childNodes.length; i < k; i++){
+				var child = Element.clone(root.childNodes[i], true, true);
+				if (child) container.grab(child);
+			}
+			return container;
+		}) || container.set('html', text);
+	},
+
+	success: function(text){
+		var options = this.options, response = this.response;
+
+		response.html = text.stripScripts(function(script){
+			response.javascript = script;
+		});
+
+		var temp = this.processHTML(response.html);
+
+		response.tree = temp.childNodes;
+		response.elements = temp.getElements('*');
+
+		if (options.filter) response.tree = response.elements.filter(options.filter);
+		if (options.update) document.id(options.update).empty().set('html', response.html);
+		else if (options.append) document.id(options.append).adopt(temp.getChildren());
+		if (options.evalScripts) $exec(response.javascript);
+
+		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
+	}
+
+});
+
+Element.Properties.load = {
+
+	set: function(options){
+		var load = this.retrieve('load');
+		if (load) load.cancel();
+		return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
+	},
+
+	get: function(options){
+		if (options || ! this.retrieve('load')){
+			if (options || !this.retrieve('load:options')) this.set('load', options);
+			this.store('load', new Request.HTML(this.retrieve('load:options')));
+		}
+		return this.retrieve('load');
+	}
+
+};
+
+Element.implement({
+
+	load: function(){
+		this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
+		return this;
+	}
+
+});
+/*
+---
+
+script: Request.JSON.js
+
+description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
+
+license: MIT-style license.
+
+requires:
+- /Request JSON
+
+provides: [Request.HTML]
+
+...
+*/
+
+Request.JSON = new Class({
+
+	Extends: Request,
+
+	options: {
+		secure: true
+	},
+
+	initialize: function(options){
+		this.parent(options);
+		this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});
+	},
+
+	success: function(text){
+		this.response.json = JSON.decode(text, this.options.secure);
+		this.onSuccess(this.response.json, text);
+	}
+
+});
+/*
+---
+
+script: More.js
+
+description: MooTools More
+
+license: MIT-style license
+
+authors:
+- Guillermo Rauch
+- Thomas Aylott
+- Scott Kyle
+
+requires:
+- core:1.2.4/MooTools
+
+provides: [MooTools.More]
+
+...
+*/
+
+MooTools.More = {
+	'version': '1.2.4.2',
+	'build': 'bd5a93c0913cce25917c48cbdacde568e15e02ef'
+};/*
+---
+
+script: Fx.Elements.js
+
+description: Effect to change any number of CSS properties of any number of Elements.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Fx.CSS
+- /MooTools.More
+
+provides: [Fx.Elements]
+
+...
+*/
+
+Fx.Elements = new Class({
+
+	Extends: Fx.CSS,
+
+	initialize: function(elements, options){
+		this.elements = this.subject = $$(elements);
+		this.parent(options);
+	},
+
+	compute: function(from, to, delta){
+		var now = {};
+		for (var i in from){
+			var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
+			for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
+		}
+		return now;
+	},
+
+	set: function(now){
+		for (var i in now){
+			var iNow = now[i];
+			for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
+		}
+		return this;
+	},
+
+	start: function(obj){
+		if (!this.check(obj)) return this;
+		var from = {}, to = {};
+		for (var i in obj){
+			var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
+			for (var p in iProps){
+				var parsed = this.prepare(this.elements[i], p, iProps[p]);
+				iFrom[p] = parsed.from;
+				iTo[p] = parsed.to;
+			}
+		}
+		return this.parent(from, to);
+	}
+
+});/*
+---
+
+script: Fx.Accordion.js
+
+description: An Fx.Elements extension which allows you to easily create accordion type controls.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Element.Event
+- /Fx.Elements
+
+provides: [Fx.Accordion]
+
+...
+*/
+
+var Accordion = Fx.Accordion = new Class({
+
+	Extends: Fx.Elements,
+
+	options: {/*
+		onActive: $empty(toggler, section),
+		onBackground: $empty(toggler, section),
+		fixedHeight: false,
+		fixedWidth: false,
+		*/
+		display: 0,
+		show: false,
+		height: true,
+		width: false,
+		opacity: true,
+		alwaysHide: false,
+		trigger: 'click',
+		initialDisplayFx: true,
+		returnHeightToAuto: true
+	},
+
+	initialize: function(){
+		var params = Array.link(arguments, {'container': Element.type, 'options': Object.type, 'togglers': $defined, 'elements': $defined});
+		this.parent(params.elements, params.options);
+		this.togglers = $$(params.togglers);
+		this.container = document.id(params.container);
+		this.previous = -1;
+		this.internalChain = new Chain();
+		if (this.options.alwaysHide) this.options.wait = true;
+		if ($chk(this.options.show)){
+			this.options.display = false;
+			this.previous = this.options.show;
+		}
+		if (this.options.start){
+			this.options.display = false;
+			this.options.show = false;
+		}
+		this.effects = {};
+		if (this.options.opacity) this.effects.opacity = 'fullOpacity';
+		if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth';
+		if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight';
+		for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]);
+		this.elements.each(function(el, i){
+			if (this.options.show === i){
+				this.fireEvent('active', [this.togglers[i], el]);
+			} else {
+				for (var fx in this.effects) el.setStyle(fx, 0);
+			}
+		}, this);
+		if ($chk(this.options.display)) this.display(this.options.display, this.options.initialDisplayFx);
+		this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));
+	},
+
+	addSection: function(toggler, element){
+		toggler = document.id(toggler);
+		element = document.id(element);
+		var test = this.togglers.contains(toggler);
+		this.togglers.include(toggler);
+		this.elements.include(element);
+		var idx = this.togglers.indexOf(toggler);
+		var displayer = this.display.bind(this, idx);
+		toggler.store('accordion:display', displayer);
+		toggler.addEvent(this.options.trigger, displayer);
+		if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
+		if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
+		element.fullOpacity = 1;
+		if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth;
+		if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight;
+		element.setStyle('overflow', 'hidden');
+		if (!test){
+			for (var fx in this.effects) element.setStyle(fx, 0);
+		}
+		return this;
+	},
+
+	detach: function(){
+		this.togglers.each(function(toggler) {
+			toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));
+		}, this);
+	},
+
+	display: function(index, useFx){
+		if (!this.check(index, useFx)) return this;
+		useFx = $pick(useFx, true);
+		if (this.options.returnHeightToAuto){
+			var prev = this.elements[this.previous];
+			if (prev && !this.selfHidden){
+				for (var fx in this.effects){
+					prev.setStyle(fx, prev[this.effects[fx]]);
+				}
+			}
+		}
+		index = ($type(index) == 'element') ? this.elements.indexOf(index) : index;
+		if ((this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this;
+		this.previous = index;
+		var obj = {};
+		this.elements.each(function(el, i){
+			obj[i] = {};
+			var hide;
+			if (i != index){
+				hide = true;
+			} else if (this.options.alwaysHide && ((el.offsetHeight > 0 && this.options.height) || el.offsetWidth > 0 && this.options.width)){
+				hide = true;
+				this.selfHidden = true;
+			}
+			this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
+			for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
+		}, this);
+		this.internalChain.chain(function(){
+			if (this.options.returnHeightToAuto && !this.selfHidden){
+				var el = this.elements[index];
+				if (el) el.setStyle('height', 'auto');
+			};
+		}.bind(this));
+		return useFx ? this.start(obj) : this.set(obj);
+	}
+
+});/*
+---
+
+script: Fx.Scroll.js
+
+description: Effect to smoothly scroll any element, including the window.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Fx
+- core:1.2.4/Element.Event
+- core:1.2.4/Element.Dimensions
+- /MooTools.More
+
+provides: [Fx.Scroll]
+
+...
+*/
+
+Fx.Scroll = new Class({
+
+	Extends: Fx,
+
+	options: {
+		offset: {x: 0, y: 0},
+		wheelStops: true
+	},
+
+	initialize: function(element, options){
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+		var cancel = this.cancel.bind(this, false);
+
+		if ($type(this.element) != 'element') this.element = document.id(this.element.getDocument().body);
+
+		var stopper = this.element;
+
+		if (this.options.wheelStops){
+			this.addEvent('start', function(){
+				stopper.addEvent('mousewheel', cancel);
+			}, true);
+			this.addEvent('complete', function(){
+				stopper.removeEvent('mousewheel', cancel);
+			}, true);
+		}
+	},
+
+	set: function(){
+		var now = Array.flatten(arguments);
+		if (Browser.Engine.gecko) now = [Math.round(now[0]), Math.round(now[1])];
+		this.element.scrollTo(now[0], now[1]);
+	},
+
+	compute: function(from, to, delta){
+		return [0, 1].map(function(i){
+			return Fx.compute(from[i], to[i], delta);
+		});
+	},
+
+	start: function(x, y){
+		if (!this.check(x, y)) return this;
+		var scrollSize = this.element.getScrollSize(),
+			scroll = this.element.getScroll(), 
+			values = {x: x, y: y};
+		for (var z in values){
+			var max = scrollSize[z];
+			if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? values[z] : max;
+			else values[z] = scroll[z];
+			values[z] += this.options.offset[z];
+		}
+		return this.parent([scroll.x, scroll.y], [values.x, values.y]);
+	},
+
+	toTop: function(){
+		return this.start(false, 0);
+	},
+
+	toLeft: function(){
+		return this.start(0, false);
+	},
+
+	toRight: function(){
+		return this.start('right', false);
+	},
+
+	toBottom: function(){
+		return this.start(false, 'bottom');
+	},
+
+	toElement: function(el){
+		var position = document.id(el).getPosition(this.element);
+		return this.start(position.x, position.y);
+	},
+
+	scrollIntoView: function(el, axes, offset){
+		axes = axes ? $splat(axes) : ['x','y'];
+		var to = {};
+		el = document.id(el);
+		var pos = el.getPosition(this.element);
+		var size = el.getSize();
+		var scroll = this.element.getScroll();
+		var containerSize = this.element.getSize();
+		var edge = {
+			x: pos.x + size.x,
+			y: pos.y + size.y
+		};
+		['x','y'].each(function(axis) {
+			if (axes.contains(axis)) {
+				if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];
+				if (pos[axis] < scroll[axis]) to[axis] = pos[axis];
+			}
+			if (to[axis] == null) to[axis] = scroll[axis];
+			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
+		}, this);
+		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
+		return this;
+	},
+
+	scrollToCenter: function(el, axes, offset){
+		axes = axes ? $splat(axes) : ['x', 'y'];
+		el = $(el);
+		var to = {},
+			pos = el.getPosition(this.element),
+			size = el.getSize(),
+			scroll = this.element.getScroll(),
+			containerSize = this.element.getSize(),
+			edge = {
+				x: pos.x + size.x,
+				y: pos.y + size.y
+			};
+
+		['x','y'].each(function(axis){
+			if(axes.contains(axis)){
+				to[axis] = pos[axis] - (containerSize[axis] - size[axis])/2;
+			}
+			if(to[axis] == null) to[axis] = scroll[axis];
+			if(offset && offset[axis]) to[axis] = to[axis] + offset[axis];
+		}, this);
+		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
+		return this;
+	}
+
+});
+/*
+---
+
+script: Fx.Slide.js
+
+description: Effect to slide an element in and out of view.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Fx Element.Style
+- /MooTools.More
+
+provides: [Fx.Slide]
+
+...
+*/
+
+Fx.Slide = new Class({
+
+	Extends: Fx,
+
+	options: {
+		mode: 'vertical',
+		hideOverflow: true
+	},
+
+	initialize: function(element, options){
+		this.addEvent('complete', function(){
+			this.open = (this.wrapper['offset' + this.layout.capitalize()] != 0);
+			if (this.open && Browser.Engine.webkit419) this.element.dispose().inject(this.wrapper);
+		}, true);
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+		var wrapper = this.element.retrieve('wrapper');
+		var styles = this.element.getStyles('margin', 'position', 'overflow');
+		if (this.options.hideOverflow) styles = $extend(styles, {overflow: 'hidden'});
+		this.wrapper = wrapper || new Element('div', {
+			styles: styles
+		}).wraps(this.element);
+		this.element.store('wrapper', this.wrapper).setStyle('margin', 0);
+		this.now = [];
+		this.open = true;
+	},
+
+	vertical: function(){
+		this.margin = 'margin-top';
+		this.layout = 'height';
+		this.offset = this.element.offsetHeight;
+	},
+
+	horizontal: function(){
+		this.margin = 'margin-left';
+		this.layout = 'width';
+		this.offset = this.element.offsetWidth;
+	},
+
+	set: function(now){
+		this.element.setStyle(this.margin, now[0]);
+		this.wrapper.setStyle(this.layout, now[1]);
+		return this;
+	},
+
+	compute: function(from, to, delta){
+		return [0, 1].map(function(i){
+			return Fx.compute(from[i], to[i], delta);
+		});
+	},
+
+	start: function(how, mode){
+		if (!this.check(how, mode)) return this;
+		this[mode || this.options.mode]();
+		var margin = this.element.getStyle(this.margin).toInt();
+		var layout = this.wrapper.getStyle(this.layout).toInt();
+		var caseIn = [[margin, layout], [0, this.offset]];
+		var caseOut = [[margin, layout], [-this.offset, 0]];
+		var start;
+		switch (how){
+			case 'in': start = caseIn; break;
+			case 'out': start = caseOut; break;
+			case 'toggle': start = (layout == 0) ? caseIn : caseOut;
+		}
+		return this.parent(start[0], start[1]);
+	},
+
+	slideIn: function(mode){
+		return this.start('in', mode);
+	},
+
+	slideOut: function(mode){
+		return this.start('out', mode);
+	},
+
+	hide: function(mode){
+		this[mode || this.options.mode]();
+		this.open = false;
+		return this.set([-this.offset, 0]);
+	},
+
+	show: function(mode){
+		this[mode || this.options.mode]();
+		this.open = true;
+		return this.set([0, this.offset]);
+	},
+
+	toggle: function(mode){
+		return this.start('toggle', mode);
+	}
+
+});
+
+Element.Properties.slide = {
+
+	set: function(options){
+		var slide = this.retrieve('slide');
+		if (slide) slide.cancel();
+		return this.eliminate('slide').store('slide:options', $extend({link: 'cancel'}, options));
+	},
+
+	get: function(options){
+		if (options || !this.retrieve('slide')){
+			if (options || !this.retrieve('slide:options')) this.set('slide', options);
+			this.store('slide', new Fx.Slide(this, this.retrieve('slide:options')));
+		}
+		return this.retrieve('slide');
+	}
+
+};
+
+Element.implement({
+
+	slide: function(how, mode){
+		how = how || 'toggle';
+		var slide = this.get('slide'), toggle;
+		switch (how){
+			case 'hide': slide.hide(mode); break;
+			case 'show': slide.show(mode); break;
+			case 'toggle':
+				var flag = this.retrieve('slide:flag', slide.open);
+				slide[flag ? 'slideOut' : 'slideIn'](mode);
+				this.store('slide:flag', !flag);
+				toggle = true;
+			break;
+			default: slide.start(how, mode);
+		}
+		if (!toggle) this.eliminate('slide:flag');
+		return this;
+	}
+
+});
+/*
+---
+
+script: Fx.SmoothScroll.js
+
+description: Class for creating a smooth scrolling effect to all internal links on the page.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Selectors
+- /Fx.Scroll
+
+provides: [Fx.SmoothScroll]
+
+...
+*/
+
+var SmoothScroll = Fx.SmoothScroll = new Class({
+
+	Extends: Fx.Scroll,
+
+	initialize: function(options, context){
+		context = context || document;
+		this.doc = context.getDocument();
+		var win = context.getWindow();
+		this.parent(this.doc, options);
+		this.links = $$(this.options.links || this.doc.links);
+		var location = win.location.href.match(/^[^#]*/)[0] + '#';
+		this.links.each(function(link){
+			if (link.href.indexOf(location) != 0) {return;}
+			var anchor = link.href.substr(location.length);
+			if (anchor) this.useLink(link, anchor);
+		}, this);
+		if (!Browser.Engine.webkit419) {
+			this.addEvent('complete', function(){
+				win.location.hash = this.anchor;
+			}, true);
+		}
+	},
+
+	useLink: function(link, anchor){
+		var el;
+		link.addEvent('click', function(event){
+			if (el !== false && !el) el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']');
+			if (el) {
+				event.preventDefault();
+				this.anchor = anchor;
+				this.toElement(el).chain(function(){
+					this.fireEvent('scrolledTo', [link, el]);
+				}.bind(this));
+				link.blur();
+			}
+		}.bind(this));
+	}
+});/*
+---
+
+script: Drag.js
+
+description: The base Drag Class. Can be used to drag and resize Elements using mouse events.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+- Tom Occhinno
+- Jan Kassens
+
+requires:
+- core:1.2.4/Events
+- core:1.2.4/Options
+- core:1.2.4/Element.Event
+- core:1.2.4/Element.Style
+- /MooTools.More
+
+provides: [Drag]
+
+*/
+
+var Drag = new Class({
+
+	Implements: [Events, Options],
+
+	options: {/*
+		onBeforeStart: $empty(thisElement),
+		onStart: $empty(thisElement, event),
+		onSnap: $empty(thisElement)
+		onDrag: $empty(thisElement, event),
+		onCancel: $empty(thisElement),
+		onComplete: $empty(thisElement, event),*/
+		snap: 6,
+		unit: 'px',
+		grid: false,
+		style: true,
+		limit: false,
+		handle: false,
+		invert: false,
+		preventDefault: false,
+		stopPropagation: false,
+		modifiers: {x: 'left', y: 'top'}
+	},
+
+	initialize: function(){
+		var params = Array.link(arguments, {'options': Object.type, 'element': $defined});
+		this.element = document.id(params.element);
+		this.document = this.element.getDocument();
+		this.setOptions(params.options || {});
+		var htype = $type(this.options.handle);
+		this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
+		this.mouse = {'now': {}, 'pos': {}};
+		this.value = {'start': {}, 'now': {}};
+
+		this.selection = (Browser.Engine.trident) ? 'selectstart' : 'mousedown';
+
+		this.bound = {
+			start: this.start.bind(this),
+			check: this.check.bind(this),
+			drag: this.drag.bind(this),
+			stop: this.stop.bind(this),
+			cancel: this.cancel.bind(this),
+			eventStop: $lambda(false)
+		};
+		this.attach();
+	},
+
+	attach: function(){
+		this.handles.addEvent('mousedown', this.bound.start);
+		return this;
+	},
+
+	detach: function(){
+		this.handles.removeEvent('mousedown', this.bound.start);
+		return this;
+	},
+
+	start: function(event){
+		if (event.rightClick) return;
+		if (this.options.preventDefault) event.preventDefault();
+		if (this.options.stopPropagation) event.stopPropagation();
+		this.mouse.start = event.page;
+		this.fireEvent('beforeStart', this.element);
+		var limit = this.options.limit;
+		this.limit = {x: [], y: []};
+		for (var z in this.options.modifiers){
+			if (!this.options.modifiers[z]) continue;
+			if (this.options.style) this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt();
+			else this.value.now[z] = this.element[this.options.modifiers[z]];
+			if (this.options.invert) this.value.now[z] *= -1;
+			this.mouse.pos[z] = event.page[z] - this.value.now[z];
+			if (limit && limit[z]){
+				for (var i = 2; i--; i){
+					if ($chk(limit[z][i])) this.limit[z][i] = $lambda(limit[z][i])();
+				}
+			}
+		}
+		if ($type(this.options.grid) == 'number') this.options.grid = {x: this.options.grid, y: this.options.grid};
+		this.document.addEvents({mousemove: this.bound.check, mouseup: this.bound.cancel});
+		this.document.addEvent(this.selection, this.bound.eventStop);
+	},
+
+	check: function(event){
+		if (this.options.preventDefault) event.preventDefault();
+		var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
+		if (distance > this.options.snap){
+			this.cancel();
+			this.document.addEvents({
+				mousemove: this.bound.drag,
+				mouseup: this.bound.stop
+			});
+			this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
+		}
+	},
+
+	drag: function(event){
+		if (this.options.preventDefault) event.preventDefault();
+		this.mouse.now = event.page;
+		for (var z in this.options.modifiers){
+			if (!this.options.modifiers[z]) continue;
+			this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
+			if (this.options.invert) this.value.now[z] *= -1;
+			if (this.options.limit && this.limit[z]){
+				if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){
+					this.value.now[z] = this.limit[z][1];
+				} else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){
+					this.value.now[z] = this.limit[z][0];
+				}
+			}
+			if (this.options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % this.options.grid[z]);
+			if (this.options.style) {
+				this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit);
+			} else {
+				this.element[this.options.modifiers[z]] = this.value.now[z];
+			}
+		}
+		this.fireEvent('drag', [this.element, event]);
+	},
+
+	cancel: function(event){
+		this.document.removeEvent('mousemove', this.bound.check);
+		this.document.removeEvent('mouseup', this.bound.cancel);
+		if (event){
+			this.document.removeEvent(this.selection, this.bound.eventStop);
+			this.fireEvent('cancel', this.element);
+		}
+	},
+
+	stop: function(event){
+		this.document.removeEvent(this.selection, this.bound.eventStop);
+		this.document.removeEvent('mousemove', this.bound.drag);
+		this.document.removeEvent('mouseup', this.bound.stop);
+		if (event) this.fireEvent('complete', [this.element, event]);
+	}
+
+});
+
+Element.implement({
+
+	makeResizable: function(options){
+		var drag = new Drag(this, $merge({modifiers: {x: 'width', y: 'height'}}, options));
+		this.store('resizer', drag);
+		return drag.addEvent('drag', function(){
+			this.fireEvent('resize', drag);
+		}.bind(this));
+	}
+
+});
+/*
+---
+
+script: Drag.Move.js
+
+description: A Drag extension that provides support for the constraining of draggables to containers and droppables.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+- Tom Occhinno
+- Jan Kassens
+- Aaron Newton
+- Scott Kyle
+
+requires:
+- core:1.2.4/Element.Dimensions
+- /Drag
+
+provides: [Drag.Move]
+
+...
+*/
+
+Drag.Move = new Class({
+
+	Extends: Drag,
+
+	options: {/*
+		onEnter: $empty(thisElement, overed),
+		onLeave: $empty(thisElement, overed),
+		onDrop: $empty(thisElement, overed, event),*/
+		droppables: [],
+		container: false,
+		precalculate: false,
+		includeMargins: true,
+		checkDroppables: true
+	},
+
+	initialize: function(element, options){
+		this.parent(element, options);
+		element = this.element;
+		
+		this.droppables = $$(this.options.droppables);
+		this.container = document.id(this.options.container);
+		
+		if (this.container && $type(this.container) != 'element')
+			this.container = document.id(this.container.getDocument().body);
+		
+		var styles = element.getStyles('left', 'right', 'position');
+		if (styles.left == 'auto' || styles.top == 'auto')
+			element.setPosition(element.getPosition(element.getOffsetParent()));
+		
+		if (styles.position == 'static')
+			element.setStyle('position', 'absolute');
+
+		this.addEvent('start', this.checkDroppables, true);
+
+		this.overed = null;
+	},
+
+	start: function(event){
+		if (this.container) this.options.limit = this.calculateLimit();
+		
+		if (this.options.precalculate){
+			this.positions = this.droppables.map(function(el){
+				return el.getCoordinates();
+			});
+		}
+		
+		this.parent(event);
+	},
+	
+	calculateLimit: function(){
+		var offsetParent = this.element.getOffsetParent(),
+			containerCoordinates = this.container.getCoordinates(offsetParent),
+			containerBorder = {},
+			elementMargin = {},
+			elementBorder = {},
+			containerMargin = {},
+			offsetParentPadding = {};
+
+		['top', 'right', 'bottom', 'left'].each(function(pad){
+			containerBorder[pad] = this.container.getStyle('border-' + pad).toInt();
+			elementBorder[pad] = this.element.getStyle('border-' + pad).toInt();
+			elementMargin[pad] = this.element.getStyle('margin-' + pad).toInt();
+			containerMargin[pad] = this.container.getStyle('margin-' + pad).toInt();
+			offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
+		}, this);
+
+		var width = this.element.offsetWidth + elementMargin.left + elementMargin.right,
+			height = this.element.offsetHeight + elementMargin.top + elementMargin.bottom,
+			left = 0,
+			top = 0,
+			right = containerCoordinates.right - containerBorder.right - width,
+			bottom = containerCoordinates.bottom - containerBorder.bottom - height;
+
+		if (this.options.includeMargins){
+			left += elementMargin.left;
+			top += elementMargin.top;
+		} else {
+			right += elementMargin.right;
+			bottom += elementMargin.bottom;
+		}
+		
+		if (this.element.getStyle('position') == 'relative'){
+			var coords = this.element.getCoordinates(offsetParent);
+			coords.left -= this.element.getStyle('left').toInt();
+			coords.top -= this.element.getStyle('top').toInt();
+			
+			left += containerBorder.left - coords.left;
+			top += containerBorder.top - coords.top;
+			right += elementMargin.left - coords.left;
+			bottom += elementMargin.top - coords.top;
+			
+			if (this.container != offsetParent){
+				left += containerMargin.left + offsetParentPadding.left;
+				top += (Browser.Engine.trident4 ? 0 : containerMargin.top) + offsetParentPadding.top;
+			}
+		} else {
+			left -= elementMargin.left;
+			top -= elementMargin.top;
+			
+			if (this.container == offsetParent){
+				right -= containerBorder.left;
+				bottom -= containerBorder.top;
+			} else {
+				left += containerCoordinates.left + containerBorder.left;
+				top += containerCoordinates.top + containerBorder.top;
+			}
+		}
+		
+		return {
+			x: [left, right],
+			y: [top, bottom]
+		};
+	},
+
+	checkAgainst: function(el, i){
+		el = (this.positions) ? this.positions[i] : el.getCoordinates();
+		var now = this.mouse.now;
+		return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
+	},
+
+	checkDroppables: function(){
+		var overed = this.droppables.filter(this.checkAgainst, this).getLast();
+		if (this.overed != overed){
+			if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
+			if (overed) this.fireEvent('enter', [this.element, overed]);
+			this.overed = overed;
+		}
+	},
+
+	drag: function(event){
+		this.parent(event);
+		if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
+	},
+
+	stop: function(event){
+		this.checkDroppables();
+		this.fireEvent('drop', [this.element, this.overed, event]);
+		this.overed = null;
+		return this.parent(event);
+	}
+
+});
+
+Element.implement({
+
+	makeDraggable: function(options){
+		var drag = new Drag.Move(this, options);
+		this.store('dragger', drag);
+		return drag;
+	}
+
+});
+/*
+---
+
+script: Class.Binds.js
+
+description: Automagically binds specified methods in a class to the instance of the class.
+
+license: MIT-style license
+
+authors:
+- Aaron Newton
+
+requires:
+- core:1.2.4/Class
+- /MooTools.More
+
+provides: [Class.Binds]
+
+...
+*/
+
+Class.Mutators.Binds = function(binds){
+    return binds;
+};
+
+Class.Mutators.initialize = function(initialize){
+	return function(){
+		$splat(this.Binds).each(function(name){
+			var original = this[name];
+			if (original) this[name] = original.bind(this);
+		}, this);
+		return initialize.apply(this, arguments);
+	};
+};
+/*
+---
+
+script: Element.Measure.js
+
+description: Extends the Element native object to include methods useful in measuring dimensions.
+
+credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
+
+license: MIT-style license
+
+authors:
+- Aaron Newton
+
+requires:
+- core:1.2.4/Element.Style
+- core:1.2.4/Element.Dimensions
+- /MooTools.More
+
+provides: [Element.Measure]
+
+...
+*/
+
+Element.implement({
+
+	measure: function(fn){
+		var vis = function(el) {
+			return !!(!el || el.offsetHeight || el.offsetWidth);
+		};
+		if (vis(this)) return fn.apply(this);
+		var parent = this.getParent(),
+			restorers = [],
+			toMeasure = []; 
+		while (!vis(parent) && parent != document.body) {
+			toMeasure.push(parent.expose());
+			parent = parent.getParent();
+		}
+		var restore = this.expose();
+		var result = fn.apply(this);
+		restore();
+		toMeasure.each(function(restore){
+			restore();
+		});
+		return result;
+	},
+
+	expose: function(){
+		if (this.getStyle('display') != 'none') return $empty;
+		var before = this.style.cssText;
+		this.setStyles({
+			display: 'block',
+			position: 'absolute',
+			visibility: 'hidden'
+		});
+		return function(){
+			this.style.cssText = before;
+		}.bind(this);
+	},
+
+	getDimensions: function(options){
+		options = $merge({computeSize: false},options);
+		var dim = {};
+		var getSize = function(el, options){
+			return (options.computeSize)?el.getComputedSize(options):el.getSize();
+		};
+		var parent = this.getParent('body');
+		if (parent && this.getStyle('display') == 'none'){
+			dim = this.measure(function(){
+				return getSize(this, options);
+			});
+		} else if (parent){
+			try { //safari sometimes crashes here, so catch it
+				dim = getSize(this, options);
+			}catch(e){}
+		} else {
+			dim = {x: 0, y: 0};
+		}
+		return $chk(dim.x) ? $extend(dim, {width: dim.x, height: dim.y}) : $extend(dim, {x: dim.width, y: dim.height});
+	},
+
+	getComputedSize: function(options){
+		options = $merge({
+			styles: ['padding','border'],
+			plains: {
+				height: ['top','bottom'],
+				width: ['left','right']
+			},
+			mode: 'both'
+		}, options);
+		var size = {width: 0,height: 0};
+		switch (options.mode){
+			case 'vertical':
+				delete size.width;
+				delete options.plains.width;
+				break;
+			case 'horizontal':
+				delete size.height;
+				delete options.plains.height;
+				break;
+		}
+		var getStyles = [];
+		//this function might be useful in other places; perhaps it should be outside this function?
+		$each(options.plains, function(plain, key){
+			plain.each(function(edge){
+				options.styles.each(function(style){
+					getStyles.push((style == 'border') ? style + '-' + edge + '-' + 'width' : style + '-' + edge);
+				});
+			});
+		});
+		var styles = {};
+		getStyles.each(function(style){ styles[style] = this.getComputedStyle(style); }, this);
+		var subtracted = [];
+		$each(options.plains, function(plain, key){ //keys: width, height, plains: ['left', 'right'], ['top','bottom']
+			var capitalized = key.capitalize();
+			size['total' + capitalized] = size['computed' + capitalized] = 0;
+			plain.each(function(edge){ //top, left, right, bottom
+				size['computed' + edge.capitalize()] = 0;
+				getStyles.each(function(style, i){ //padding, border, etc.
+					//'padding-left'.test('left') size['totalWidth'] = size['width'] + [padding-left]
+					if (style.test(edge)){
+						styles[style] = styles[style].toInt() || 0; //styles['padding-left'] = 5;
+						size['total' + capitalized] = size['total' + capitalized] + styles[style];
+						size['computed' + edge.capitalize()] = size['computed' + edge.capitalize()] + styles[style];
+					}
+					//if width != width (so, padding-left, for instance), then subtract that from the total
+					if (style.test(edge) && key != style &&
+						(style.test('border') || style.test('padding')) && !subtracted.contains(style)){
+						subtracted.push(style);
+						size['computed' + capitalized] = size['computed' + capitalized]-styles[style];
+					}
+				});
+			});
+		});
+
+		['Width', 'Height'].each(function(value){
+			var lower = value.toLowerCase();
+			if(!$chk(size[lower])) return;
+
+			size[lower] = size[lower] + this['offset' + value] + size['computed' + value];
+			size['total' + value] = size[lower] + size['total' + value];
+			delete size['computed' + value];
+		}, this);
+
+		return $extend(styles, size);
+	}
+
+});/*
+---
+
+script: Slider.js
+
+description: Class for creating horizontal and vertical slider controls.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Element.Dimensions
+- /Class.Binds
+- /Drag
+- /Element.Dimensions
+- /Element.Measure
+
+provides: [Slider]
+
+...
+*/
+
+var Slider = new Class({
+
+	Implements: [Events, Options],
+
+	Binds: ['clickedElement', 'draggedKnob', 'scrolledElement'],
+
+	options: {/*
+		onTick: $empty(intPosition),
+		onChange: $empty(intStep),
+		onComplete: $empty(strStep),*/
+		onTick: function(position){
+			if (this.options.snap) position = this.toPosition(this.step);
+			this.knob.setStyle(this.property, position);
+		},
+		initialStep: 0,
+		snap: false,
+		offset: 0,
+		range: false,
+		wheel: false,
+		steps: 100,
+		mode: 'horizontal'
+	},
+
+	initialize: function(element, knob, options){
+		this.setOptions(options);
+		this.element = document.id(element);
+		this.knob = document.id(knob);
+		this.previousChange = this.previousEnd = this.step = -1;
+		var offset, limit = {}, modifiers = {'x': false, 'y': false};
+		switch (this.options.mode){
+			case 'vertical':
+				this.axis = 'y';
+				this.property = 'top';
+				offset = 'offsetHeight';
+				break;
+			case 'horizontal':
+				this.axis = 'x';
+				this.property = 'left';
+				offset = 'offsetWidth';
+		}
+		
+		this.full = this.element.measure(function(){ 
+			this.half = this.knob[offset] / 2; 
+			return this.element[offset] - this.knob[offset] + (this.options.offset * 2); 
+		}.bind(this));
+		
+		this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0;
+		this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps;
+		this.range = this.max - this.min;
+		this.steps = this.options.steps || this.full;
+		this.stepSize = Math.abs(this.range) / this.steps;
+		this.stepWidth = this.stepSize * this.full / Math.abs(this.range) ;
+
+		this.knob.setStyle('position', 'relative').setStyle(this.property, this.options.initialStep ? this.toPosition(this.options.initialStep) : - this.options.offset);
+		modifiers[this.axis] = this.property;
+		limit[this.axis] = [- this.options.offset, this.full - this.options.offset];
+
+		var dragOptions = {
+			snap: 0,
+			limit: limit,
+			modifiers: modifiers,
+			onDrag: this.draggedKnob,
+			onStart: this.draggedKnob,
+			onBeforeStart: (function(){
+				this.isDragging = true;
+			}).bind(this),
+			onCancel: function() {
+				this.isDragging = false;
+			}.bind(this),
+			onComplete: function(){
+				this.isDragging = false;
+				this.draggedKnob();
+				this.end();
+			}.bind(this)
+		};
+		if (this.options.snap){
+			dragOptions.grid = Math.ceil(this.stepWidth);
+			dragOptions.limit[this.axis][1] = this.full;
+		}
+
+		this.drag = new Drag(this.knob, dragOptions);
+		this.attach();
+	},
+
+	attach: function(){
+		this.element.addEvent('mousedown', this.clickedElement);
+		if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement);
+		this.drag.attach();
+		return this;
+	},
+
+	detach: function(){
+		this.element.removeEvent('mousedown', this.clickedElement);
+		this.element.removeEvent('mousewheel', this.scrolledElement);
+		this.drag.detach();
+		return this;
+	},
+
+	set: function(step){
+		if (!((this.range > 0) ^ (step < this.min))) step = this.min;
+		if (!((this.range > 0) ^ (step > this.max))) step = this.max;
+
+		this.step = Math.round(step);
+		this.checkStep();
+		this.fireEvent('tick', this.toPosition(this.step));
+		this.end();
+		return this;
+	},
+
+	clickedElement: function(event){
+		if (this.isDragging || event.target == this.knob) return;
+
+		var dir = this.range < 0 ? -1 : 1;
+		var position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
+		position = position.limit(-this.options.offset, this.full -this.options.offset);
+
+		this.step = Math.round(this.min + dir * this.toStep(position));
+		this.checkStep();
+		this.fireEvent('tick', position);
+		this.end();
+	},
+
+	scrolledElement: function(event){
+		var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0);
+		this.set(mode ? this.step - this.stepSize : this.step + this.stepSize);
+		event.stop();
+	},
+
+	draggedKnob: function(){
+		var dir = this.range < 0 ? -1 : 1;
+		var position = this.drag.value.now[this.axis];
+		position = position.limit(-this.options.offset, this.full -this.options.offset);
+		this.step = Math.round(this.min + dir * this.toStep(position));
+		this.checkStep();
+	},
+
+	checkStep: function(){
+		if (this.previousChange != this.step){
+			this.previousChange = this.step;
+			this.fireEvent('change', this.step);
+		}
+	},
+
+	end: function(){
+		if (this.previousEnd !== this.step){
+			this.previousEnd = this.step;
+			this.fireEvent('complete', this.step + '');
+		}
+	},
+
+	toStep: function(position){
+		var step = (position + this.options.offset) * this.stepSize / this.full * this.steps;
+		return this.options.steps ? Math.round(step -= step % this.stepSize) : step;
+	},
+
+	toPosition: function(step){
+		return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset;
+	}
+
+});/*
+---
+
+script: Sortables.js
+
+description: Class for creating a drag and drop sorting interface for lists of items.
+
+license: MIT-style license
+
+authors:
+- Tom Occhino
+
+requires:
+- /Drag.Move
+
+provides: [Slider]
+
+...
+*/
+
+var Sortables = new Class({
+
+	Implements: [Events, Options],
+
+	options: {/*
+		onSort: $empty(element, clone),
+		onStart: $empty(element, clone),
+		onComplete: $empty(element),*/
+		snap: 4,
+		opacity: 1,
+		clone: false,
+		revert: false,
+		handle: false,
+		constrain: false
+	},
+
+	initialize: function(lists, options){
+		this.setOptions(options);
+		this.elements = [];
+		this.lists = [];
+		this.idle = true;
+
+		this.addLists($$(document.id(lists) || lists));
+		if (!this.options.clone) this.options.revert = false;
+		if (this.options.revert) this.effect = new Fx.Morph(null, $merge({duration: 250, link: 'cancel'}, this.options.revert));
+	},
+
+	attach: function(){
+		this.addLists(this.lists);
+		return this;
+	},
+
+	detach: function(){
+		this.lists = this.removeLists(this.lists);
+		return this;
+	},
+
+	addItems: function(){
+		Array.flatten(arguments).each(function(element){
+			this.elements.push(element);
+			var start = element.retrieve('sortables:start', this.start.bindWithEvent(this, element));
+			(this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);
+		}, this);
+		return this;
+	},
+
+	addLists: function(){
+		Array.flatten(arguments).each(function(list){
+			this.lists.push(list);
+			this.addItems(list.getChildren());
+		}, this);
+		return this;
+	},
+
+	removeItems: function(){
+		return $$(Array.flatten(arguments).map(function(element){
+			this.elements.erase(element);
+			var start = element.retrieve('sortables:start');
+			(this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);
+			
+			return element;
+		}, this));
+	},
+
+	removeLists: function(){
+		return $$(Array.flatten(arguments).map(function(list){
+			this.lists.erase(list);
+			this.removeItems(list.getChildren());
+			
+			return list;
+		}, this));
+	},
+
+	getClone: function(event, element){
+		if (!this.options.clone) return new Element('div').inject(document.body);
+		if ($type(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);
+		return element.clone(true).setStyles({
+			margin: '0px',
+			position: 'absolute',
+			visibility: 'hidden',
+			'width': element.getStyle('width')
+		}).inject(this.list).setPosition(element.getPosition(element.getOffsetParent()));
+	},
+
+	getDroppables: function(){
+		var droppables = this.list.getChildren();
+		if (!this.options.constrain) droppables = this.lists.concat(droppables).erase(this.list);
+		return droppables.erase(this.clone).erase(this.element);
+	},
+
+	insert: function(dragging, element){
+		var where = 'inside';
+		if (this.lists.contains(element)){
+			this.list = element;
+			this.drag.droppables = this.getDroppables();
+		} else {
+			where = this.element.getAllPrevious().contains(element) ? 'before' : 'after';
+		}
+		this.element.inject(element, where);
+		this.fireEvent('sort', [this.element, this.clone]);
+	},
+
+	start: function(event, element){
+		if (!this.idle) return;
+		this.idle = false;
+		this.element = element;
+		this.opacity = element.get('opacity');
+		this.list = element.getParent();
+		this.clone = this.getClone(event, element);
+
+		this.drag = new Drag.Move(this.clone, {
+			snap: this.options.snap,
+			container: this.options.constrain && this.element.getParent(),
+			droppables: this.getDroppables(),
+			onSnap: function(){
+				event.stop();
+				this.clone.setStyle('visibility', 'visible');
+				this.element.set('opacity', this.options.opacity || 0);
+				this.fireEvent('start', [this.element, this.clone]);
+			}.bind(this),
+			onEnter: this.insert.bind(this),
+			onCancel: this.reset.bind(this),
+			onComplete: this.end.bind(this)
+		});
+
+		this.clone.inject(this.element, 'before');
+		this.drag.start(event);
+	},
+
+	end: function(){
+		this.drag.detach();
+		this.element.set('opacity', this.opacity);
+		if (this.effect){
+			var dim = this.element.getStyles('width', 'height');
+			var pos = this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));
+			this.effect.element = this.clone;
+			this.effect.start({
+				top: pos.top,
+				left: pos.left,
+				width: dim.width,
+				height: dim.height,
+				opacity: 0.25
+			}).chain(this.reset.bind(this));
+		} else {
+			this.reset();
+		}
+	},
+
+	reset: function(){
+		this.idle = true;
+		this.clone.destroy();
+		this.fireEvent('complete', this.element);
+	},
+
+	serialize: function(){
+		var params = Array.link(arguments, {modifier: Function.type, index: $defined});
+		var serial = this.lists.map(function(list){
+			return list.getChildren().map(params.modifier || function(element){
+				return element.get('id');
+			}, this);
+		}, this);
+
+		var index = params.index;
+		if (this.lists.length == 1) index = 0;
+		return $chk(index) && index >= 0 && index < this.lists.length ? serial[index] : serial;
+	}
+
+});
+/*
+---
+
+script: Color.js
+
+description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Array
+- core:1.2.4/String
+- core:1.2.4/Number
+- core:1.2.4/Hash
+- core:1.2.4/Function
+- core:1.2.4/$util
+
+provides: [Color]
+
+...
+*/
+
+var Color = new Native({
+
+	initialize: function(color, type){
+		if (arguments.length >= 3){
+			type = 'rgb'; color = Array.slice(arguments, 0, 3);
+		} else if (typeof color == 'string'){
+			if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
+			else if (color.match(/hsb/)) color = color.hsbToRgb();
+			else color = color.hexToRgb(true);
+		}
+		type = type || 'rgb';
+		switch (type){
+			case 'hsb':
+				var old = color;
+				color = color.hsbToRgb();
+				color.hsb = old;
+			break;
+			case 'hex': color = color.hexToRgb(true); break;
+		}
+		color.rgb = color.slice(0, 3);
+		color.hsb = color.hsb || color.rgbToHsb();
+		color.hex = color.rgbToHex();
+		return $extend(color, this);
+	}
+
+});
+
+Color.implement({
+
+	mix: function(){
+		var colors = Array.slice(arguments);
+		var alpha = ($type(colors.getLast()) == 'number') ? colors.pop() : 50;
+		var rgb = this.slice();
+		colors.each(function(color){
+			color = new Color(color);
+			for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
+		});
+		return new Color(rgb, 'rgb');
+	},
+
+	invert: function(){
+		return new Color(this.map(function(value){
+			return 255 - value;
+		}));
+	},
+
+	setHue: function(value){
+		return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
+	},
+
+	setSaturation: function(percent){
+		return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
+	},
+
+	setBrightness: function(percent){
+		return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
+	}
+
+});
+
+var $RGB = function(r, g, b){
+	return new Color([r, g, b], 'rgb');
+};
+
+var $HSB = function(h, s, b){
+	return new Color([h, s, b], 'hsb');
+};
+
+var $HEX = function(hex){
+	return new Color(hex, 'hex');
+};
+
+Array.implement({
+
+	rgbToHsb: function(){
+		var red = this[0],
+				green = this[1],
+				blue = this[2],
+				hue = 0;
+		var max = Math.max(red, green, blue),
+				min = Math.min(red, green, blue);
+		var delta = max - min;
+		var brightness = max / 255,
+				saturation = (max != 0) ? delta / max : 0;
+		if(saturation != 0) {
+			var rr = (max - red) / delta;
+			var gr = (max - green) / delta;
+			var br = (max - blue) / delta;
+			if (red == max) hue = br - gr;
+			else if (green == max) hue = 2 + rr - br;
+			else hue = 4 + gr - rr;
+			hue /= 6;
+			if (hue < 0) hue++;
+		}
+		return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];
+	},
+
+	hsbToRgb: function(){
+		var br = Math.round(this[2] / 100 * 255);
+		if (this[1] == 0){
+			return [br, br, br];
+		} else {
+			var hue = this[0] % 360;
+			var f = hue % 60;
+			var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
+			var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
+			var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);
+			switch (Math.floor(hue / 60)){
+				case 0: return [br, t, p];
+				case 1: return [q, br, p];
+				case 2: return [p, br, t];
+				case 3: return [p, q, br];
+				case 4: return [t, p, br];
+				case 5: return [br, p, q];
+			}
+		}
+		return false;
+	}
+
+});
+
+String.implement({
+
+	rgbToHsb: function(){
+		var rgb = this.match(/\d{1,3}/g);
+		return (rgb) ? rgb.rgbToHsb() : null;
+	},
+
+	hsbToRgb: function(){
+		var hsb = this.match(/\d{1,3}/g);
+		return (hsb) ? hsb.hsbToRgb() : null;
+	}
+
+});
+/*
+---
+
+script: Group.js
+
+description: Class for monitoring collections of events
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Events
+- /MooTools.More
+
+provides: [Group]
+
+...
+*/
+
+var Group = new Class({
+
+	initialize: function(){
+		this.instances = Array.flatten(arguments);
+		this.events = {};
+		this.checker = {};
+	},
+
+	addEvent: function(type, fn){
+		this.checker[type] = this.checker[type] || {};
+		this.events[type] = this.events[type] || [];
+		if (this.events[type].contains(fn)) return false;
+		else this.events[type].push(fn);
+		this.instances.each(function(instance, i){
+			instance.addEvent(type, this.check.bind(this, [type, instance, i]));
+		}, this);
+		return this;
+	},
+
+	check: function(type, instance, i){
+		this.checker[type][i] = true;
+		var every = this.instances.every(function(current, j){
+			return this.checker[type][j] || false;
+		}, this);
+		if (!every) return;
+		this.checker[type] = {};
+		this.events[type].each(function(event){
+			event.call(this, this.instances, instance);
+		}, this);
+	}
+
+});
+/*
+---
+
+script: Hash.Cookie.js
+
+description: Class for creating, reading, and deleting Cookies in JSON format.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+- Aaron Newton
+
+requires:
+- core:1.2.4/Cookie
+- core:1.2.4/JSON
+- /MooTools.More
+
+provides: [Hash.Cookie]
+
+...
+*/
+
+Hash.Cookie = new Class({
+
+	Extends: Cookie,
+
+	options: {
+		autoSave: true
+	},
+
+	initialize: function(name, options){
+		this.parent(name, options);
+		this.load();
+	},
+
+	save: function(){
+		var value = JSON.encode(this.hash);
+		if (!value || value.length > 4096) return false; //cookie would be truncated!
+		if (value == '{}') this.dispose();
+		else this.write(value);
+		return true;
+	},
+
+	load: function(){
+		this.hash = new Hash(JSON.decode(this.read(), true));
+		return this;
+	}
+
+});
+
+Hash.each(Hash.prototype, function(method, name){
+	if (typeof method == 'function') Hash.Cookie.implement(name, function(){
+		var value = method.apply(this.hash, arguments);
+		if (this.options.autoSave) this.save();
+		return value;
+	});
+});/*
+---
+
+script: Scroller.js
+
+description: Class which scrolls the contents of any Element (including the window) when the mouse reaches the Element's boundaries.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Events
+- core:1.2.4/Options
+- core:1.2.4/Element.Event
+- core:1.2.4/Element.Dimensions
+
+provides: [Scroller]
+
+...
+*/
+
+var Scroller = new Class({
+
+	Implements: [Events, Options],
+
+	options: {
+		area: 20,
+		velocity: 1,
+		onChange: function(x, y){
+			this.element.scrollTo(x, y);
+		},
+		fps: 50
+	},
+
+	initialize: function(element, options){
+		this.setOptions(options);
+		this.element = document.id(element);
+		this.listener = ($type(this.element) != 'element') ? document.id(this.element.getDocument().body) : this.element;
+		this.timer = null;
+		this.bound = {
+			attach: this.attach.bind(this),
+			detach: this.detach.bind(this),
+			getCoords: this.getCoords.bind(this)
+		};
+	},
+
+	start: function(){
+		this.listener.addEvents({
+			mouseover: this.bound.attach,
+			mouseout: this.bound.detach
+		});
+	},
+
+	stop: function(){
+		this.listener.removeEvents({
+			mouseover: this.bound.attach,
+			mouseout: this.bound.detach
+		});
+		this.detach();
+		this.timer = $clear(this.timer);
+	},
+
+	attach: function(){
+		this.listener.addEvent('mousemove', this.bound.getCoords);
+	},
+
+	detach: function(){
+		this.listener.removeEvent('mousemove', this.bound.getCoords);
+		this.timer = $clear(this.timer);
+	},
+
+	getCoords: function(event){
+		this.page = (this.listener.get('tag') == 'body') ? event.client : event.page;
+		if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this);
+	},
+
+	scroll: function(){
+		var size = this.element.getSize(), 
+			scroll = this.element.getScroll(), 
+			pos = this.element.getOffsets(), 
+			scrollSize = this.element.getScrollSize(), 
+			change = {x: 0, y: 0};
+		for (var z in this.page){
+			if (this.page[z] < (this.options.area + pos[z]) && scroll[z] != 0)
+				change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity;
+			else if (this.page[z] + this.options.area > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z])
+				change[z] = (this.page[z] - size[z] + this.options.area - pos[z]) * this.options.velocity;
+		}
+		if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]);
+	}
+
+});/*
+---
+
+script: Tips.js
+
+name: Tips
+
+description: Class for creating nice tips that follow the mouse cursor when hovering an element.
+
+license: MIT-style license
+
+authors:
+  - Valerio Proietti
+  - Christoph Pojer
+
+requires:
+  - Core:1.2.4/Options
+  - Core:1.2.4/Events
+  - Core:1.2.4/Element.Event
+  - Core:1.2.4/Element.Style
+  - Core:1.2.4/Element.Dimensions
+  - /MooTools.More
+
+provides: [Tips]
+
+...
+*/
+
+(function(){
+
+var read = function(option, element){
+	return (option) ? ($type(option) == 'function' ? option(element) : element.get(option)) : '';
+};
+
+this.Tips = new Class({
+
+	Implements: [Events, Options],
+
+	options: {
+		/*
+		onAttach: $empty(element),
+		onDetach: $empty(element),
+		*/
+		onShow: function(){
+			this.tip.setStyle('display', 'block');
+		},
+		onHide: function(){
+			this.tip.setStyle('display', 'none');
+		},
+		title: 'title',
+		text: function(element){
+			return element.get('rel') || element.get('href');
+		},
+		showDelay: 100,
+		hideDelay: 100,
+		className: 'tip-wrap',
+		offset: {x: 16, y: 16},
+		windowPadding: {x:0, y:0},
+		fixed: false
+	},
+
+	initialize: function(){
+		var params = Array.link(arguments, {options: Object.type, elements: $defined});
+		this.setOptions(params.options);
+		if (params.elements) this.attach(params.elements);
+		this.container = new Element('div', {'class': 'tip'});
+	},
+
+	toElement: function(){
+		if (this.tip) return this.tip;
+		
+		this.container = new Element('div', {'class': 'tip'});
+		return this.tip = new Element('div', {
+			'class': this.options.className,
+			styles: {
+				position: 'absolute',
+				top: 0,
+				left: 0
+			}
+		}).adopt(
+			new Element('div', {'class': 'tip-top'}),
+			this.container,
+			new Element('div', {'class': 'tip-bottom'})
+		).inject(document.body);
+	},
+
+	attach: function(elements){
+		$$(elements).each(function(element){
+			var title = read(this.options.title, element),
+				text = read(this.options.text, element);
+			
+			element.erase('title').store('tip:native', title).retrieve('tip:title', title);
+			element.retrieve('tip:text', text);
+			this.fireEvent('attach', [element]);
+			
+			var events = ['enter', 'leave'];
+			if (!this.options.fixed) events.push('move');
+			
+			events.each(function(value){
+				var event = element.retrieve('tip:' + value);
+				if (!event) event = this['element' + value.capitalize()].bindWithEvent(this, element);
+				
+				element.store('tip:' + value, event).addEvent('mouse' + value, event);
+			}, this);
+		}, this);
+		
+		return this;
+	},
+
+	detach: function(elements){
+		$$(elements).each(function(element){
+			['enter', 'leave', 'move'].each(function(value){
+				element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
+			});
+			
+			this.fireEvent('detach', [element]);
+			
+			if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
+				var original = element.retrieve('tip:native');
+				if (original) element.set('title', original);
+			}
+		}, this);
+		
+		return this;
+	},
+
+	elementEnter: function(event, element){
+		this.container.empty();
+		
+		['title', 'text'].each(function(value){
+			var content = element.retrieve('tip:' + value);
+			if (content) this.fill(new Element('div', {'class': 'tip-' + value}).inject(this.container), content);
+		}, this);
+		
+		$clear(this.timer);
+		this.timer = (function(){
+			this.show(element);
+			this.position((this.options.fixed) ? {page: element.getPosition()} : event);
+		}).delay(this.options.showDelay, this);
+	},
+
+	elementLeave: function(event, element){
+		$clear(this.timer);
+		this.timer = this.hide.delay(this.options.hideDelay, this, element);
+		this.fireForParent(event, element);
+	},
+
+	fireForParent: function(event, element){
+		element = element.getParent();
+		if (!element || element == document.body) return;
+		if (element.retrieve('tip:enter')) element.fireEvent('mouseenter', event);
+		else this.fireForParent(event, element);
+	},
+
+	elementMove: function(event, element){
+		this.position(event);
+	},
+
+	position: function(event){
+		if (!this.tip) document.id(this);
+
+		var size = window.getSize(), scroll = window.getScroll(),
+			tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
+			props = {x: 'left', y: 'top'},
+			obj = {};
+		
+		for (var z in props){
+			obj[props[z]] = event.page[z] + this.options.offset[z];
+			if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - this.options.windowPadding[z]) obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
+		}
+		
+		this.tip.setStyles(obj);
+	},
+
+	fill: function(element, contents){
+		if(typeof contents == 'string') element.set('html', contents);
+		else element.adopt(contents);
+	},
+
+	show: function(element){
+		if (!this.tip) document.id(this);
+		this.fireEvent('show', [this.tip, element]);
+	},
+
+	hide: function(element){
+		if (!this.tip) document.id(this);
+		this.fireEvent('hide', [this.tip, element]);
+	}
+
+});
+
+})();
+
+/*
+---
+
+script: Assets.js
+
+description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document.
+
+license: MIT-style license
+
+authors:
+- Valerio Proietti
+
+requires:
+- core:1.2.4/Element.Event
+- /MooTools.More
+
+provides: [Assets]
+
+...
+*/
+
+var Asset = {
+
+	javascript: function(source, properties){
+		properties = $extend({
+			onload: $empty,
+			document: document,
+			check: $lambda(true)
+		}, properties);
+
+		var script = new Element('script', {src: source, type: 'text/javascript'});
+
+		var load = properties.onload.bind(script), 
+			check = properties.check, 
+			doc = properties.document;
+		delete properties.onload;
+		delete properties.check;
+		delete properties.document;
+
+		script.addEvents({
+			load: load,
+			readystatechange: function(){
+				if (['loaded', 'complete'].contains(this.readyState)) load();
+			}
+		}).set(properties);
+
+		if (Browser.Engine.webkit419) var checker = (function(){
+			if (!$try(check)) return;
+			$clear(checker);
+			load();
+		}).periodical(50);
+
+		return script.inject(doc.head);
+	},
+
+	css: function(source, properties){
+		return new Element('link', $merge({
+			rel: 'stylesheet',
+			media: 'screen',
+			type: 'text/css',
+			href: source
+		}, properties)).inject(document.head);
+	},
+
+	image: function(source, properties){
+		properties = $merge({
+			onload: $empty,
+			onabort: $empty,
+			onerror: $empty
+		}, properties);
+		var image = new Image();
+		var element = document.id(image) || new Element('img');
+		['load', 'abort', 'error'].each(function(name){
+			var type = 'on' + name;
+			var event = properties[type];
+			delete properties[type];
+			image[type] = function(){
+				if (!image) return;
+				if (!element.parentNode){
+					element.width = image.width;
+					element.height = image.height;
+				}
+				image = image.onload = image.onabort = image.onerror = null;
+				event.delay(1, element, element);
+				element.fireEvent(name, element, 1);
+			};
+		});
+		image.src = element.src = source;
+		if (image && image.complete) image.onload.delay(1);
+		return element.set(properties);
+	},
+
+	images: function(sources, options){
+		options = $merge({
+			onComplete: $empty,
+			onProgress: $empty,
+			onError: $empty,
+			properties: {}
+		}, options);
+		sources = $splat(sources);
+		var images = [];
+		var counter = 0;
+		return new Elements(sources.map(function(source){
+			return Asset.image(source, $extend(options.properties, {
+				onload: function(){
+					options.onProgress.call(this, counter, sources.indexOf(source));
+					counter++;
+					if (counter == sources.length) options.onComplete();
+				},
+				onerror: function(){
+					options.onError.call(this, counter, sources.indexOf(source));
+					counter++;
+					if (counter == sources.length) options.onComplete();
+				}
+			}));
+		}));
+	}
+
+};
+
+/*
+---
+
+script: mootools-1.1-to-1.2-upgrade-helper.js
+
+description: Provides legacy API for Mootools 1.2
+
+license: MIT-style license
+
+authors:
+- Aaron Newton
+
+...
+*/
+
+if(!window.console) var console = {};
+if(!console.log) console.log = function(){};
+if(!console.warn) console.warn = console.log;
+if(!console.error) console.error = console.warn;
+
+MooTools.upgradeLog = function() {
+	if (console[this.upgradeLogLevel]) console[this.upgradeLogLevel].apply(console, arguments);
+};
+
+(function(){
+	oldA = $A;
+	window.$A = function(iterable, start, length){
+		if (start != undefined && length != undefined) {
+			MooTools.upgradeLog('1.1 > 1.2: $A no longer takes start and length arguments.');
+			if (Browser.Engine.trident && $type(iterable) == 'collection'){
+				start = start || 0;
+				if (start < 0) start = iterable.length + start;
+				length = length || (iterable.length - start);
+				var array = [];
+				for (var i = 0; i < length; i++) array[i] = iterable[start++];
+				return array;
+			}
+			start = (start || 0) + ((start < 0) ? iterable.length : 0);
+			var end = ((!$chk(length)) ? iterable.length : length) + start;
+			return Array.prototype.slice.call(iterable, start, end);
+		}
+		return oldA(iterable);
+	};
+
+
+	var strs = ['Array', 'Function', 'String', 'RegExp', 'Number', 'Window', 'Document', 'Element', 'Elements'];
+	for (var i = 0, l = strs.length; i < l; i++) {
+		var type = strs[i];
+		var natv = window[type];
+		if (natv) {
+			var extend = natv.extend;
+			natv.extend = function(props){
+				MooTools.upgradeLog('1.1 > 1.2: native types no longer use .extend to add methods to prototypes but instead use .implement. NOTE: YOUR METHODS WERE NOT IMPLEMENTED ON THE NATIVE ' + type.toUpperCase() + ' PROTOTYPE.');
+				return extend.apply(this, arguments);
+			};
+		}
+	}
+})();
+
+window.onDomReady = Window.onDomReady = function(fn){
+	MooTools.upgradeLog('1.1 > 1.2: window.onDomReady is no longer supported. Use window.addEvent("domready") instead');
+	return window.addEvent('domready', fn);
+};if (Browser.__defineGetter__) {
+	Browser.__defineGetter__('hasGetter',function(){
+		return true;
+	});
+}
+
+if(Browser.hasGetter){ // webkit, gecko, opera support
+	
+	window.__defineGetter__('ie',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.ie is deprecated. Use Browser.Engine.trident');
+		return (Browser.Engine.name == 'trident') ? true : false;
+	});
+	window.__defineGetter__('ie6',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.ie6 is deprecated. Use Browser.Engine.trident and Browser.Engine.version');
+		return (Browser.Engine.name == 'trident' && Browser.Engine.version == 4) ? true : false;
+	});
+	window.__defineGetter__('ie7',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.ie7 is deprecated. Use Browser.Engine.trident and Browser.Engine.version');
+		return (Browser.Engine.name == 'trident' && Browser.Engine.version == 5) ? true : false;
+	});
+	window.__defineGetter__('gecko',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.gecko is deprecated. Use Browser.Engine.gecko');
+		return (Browser.Engine.name == 'gecko') ? true : false;
+	});
+	window.__defineGetter__('webkit',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit');
+		return (Browser.Engine.name == 'webkit') ? true : false;
+	});
+	window.__defineGetter__('webkit419',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version');
+		return (Browser.Engine.name == 'webkit' && Browser.Engine.version == 419) ? true : false;
+	});
+	window.__defineGetter__('webkit420',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.webkit is deprecated. Use Browser.Engine.webkit and Browser.Engine.version');
+		return (Browser.Engine.name == 'webkit' && Browser.Engine.version == 420) ? true : false;
+	});
+	window.__defineGetter__('opera',function(){
+		MooTools.upgradeLog('1.1 > 1.2: window.opera is deprecated. Use Browser.Engine.presto');
+		return (Browser.Engine.name == 'presto') ? true : false;
+	});
+} else {
+	window[Browser.Engine.name] = window[Browser.Engine.name + Browser.Engine.version] = true;
+	window.ie = window.trident;
+	window.ie6 = window.trident4;
+	window.ie7 = window.trident5;	
+}
+Array.implement({
+
+	copy: function(start, length){
+		MooTools.upgradeLog('1.1 > 1.2: Array.copy is deprecated. Use Array.splice');
+		return $A(this, start, length);
+	},
+
+	remove : function(item){
+		MooTools.upgradeLog('1.1 > 1.2: Array.remove is deprecated. Use Array.erase');
+		return this.erase(item);
+	},
+
+	merge : function(array){
+		MooTools.upgradeLog('1.1 > 1.2: Array.merge is deprecated. Use Array.combine');
+		return this.combine(array);
+	}
+
+});
+Function.implement({
+
+	bindAsEventListener: function(bind, args){
+		MooTools.upgradeLog('1.1 > 1.2: Function.bindAsEventListener is deprecated. Use bindWithEvent.');
+		return this.bindWithEvent.call(this, bind, args);
+	}
+
+});
+
+Function.empty = function(){
+	MooTools.upgradeLog('1.1 > 1.2: Function.empty is now just $empty.');
+};Hash.implement({
+
+	keys : function(){
+		MooTools.upgradeLog('1.1 > 1.2: Hash.keys is deprecated. Use Hash.getKeys');
+		return this.getKeys();
+	},
+
+	values : function(){
+		MooTools.upgradeLog('1.1 > 1.2: Hash.values is deprecated. Use Hash.getValues');
+		return this.getValues();
+	},
+
+	hasKey : function(item){
+		MooTools.upgradeLog('1.1 > 1.2: Hash.hasKey is deprecated. Use Hash.has');
+		return this.has(item);
+	},
+
+	merge : function(properties){
+		MooTools.upgradeLog('1.1 > 1.2: Hash.merge is deprecated. Use Hash.combine');
+		return this.extend(properties);
+	},
+
+	remove: function(key){
+		MooTools.upgradeLog('1.1 > 1.2: Hash.remove is deprecated. use Hash.erase');
+		return this.erase(key);
+	}
+
+});
+
+Object.toQueryString = function(obj){
+	MooTools.upgradeLog('1.1 > 1.2: Object.toQueryString() is deprecated. use Hash.toQueryString() instead');
+	$H(obj).each(function(item, key){
+		if ($type(item) == 'object' || $type(item) == 'array'){
+			obj[key] = item.toString();
+		}
+	});
+	return Hash.toQueryString(obj);
+};
+
+var Abstract = function(obj){
+	MooTools.upgradeLog('1.1 > 1.2: Abstract is deprecated. Use Hash');
+	return new Hash(obj);
+};Class.empty = function(){ 
+	MooTools.upgradeLog('1.1 > 1.2: replace Class.empty with $empty');
+	return $empty;
+};
+
+//legacy .extend support
+
+(function(){
+	var proto = function(obj) {
+		var f = function(){
+			return this;
+		};
+		f.prototype = obj;
+		return f;
+	};
+
+	Class.prototype.extend = function(properties){
+		MooTools.upgradeLog('1.1 > 1.2: Class.extend is deprecated. See the class Extend mutator.');
+		var maker = proto(properties);
+		var made = new maker();
+		made.Extends = this;
+		return new Class(made);
+	};
+
+	var __implement = Class.prototype.implement;
+	Class.prototype.implement = function(){
+		if (arguments.length > 1 && Array.every(arguments, Object.type)){
+			MooTools.upgradeLog('1.1 > 1.2: Class.implement no longer takes more than one thing at a time, either MyClass.implement(key, value) or MyClass.implement(object) but NOT MyClass.implement(new Foo, new Bar, new Baz). See also: the class Implements mutator.');
+			Array.each(arguments, function(argument){
+				__implement.call(this, argument);
+			}, this);
+			return this;
+		}
+		return __implement.apply(this, arguments);
+	};
+})();(function(){
+
+	var getPosition = Element.prototype.getPosition;
+	var getCoordinates = Element.prototype.getCoordinates;
+
+	function isBody(element){
+		return (/^(?:body|html)$/i).test(element.tagName);
+	};
+
+	var getSize = Element.prototype.getSize;
+
+	Element.implement({
+	
+		getSize: function(){
+			MooTools.upgradeLog('1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.');
+			var size = getSize.apply(this, arguments);
+			return $merge(size, {
+				size: size,
+				scroll: this.getScroll(),
+				scrollSize: this.getScrollSize()
+			});
+		},
+
+		getPosition: function(relative){
+			if (relative && $type(relative) == "array") {
+				MooTools.upgradeLog('1.1 > 1.2: Element.getPosition no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.');
+				relative = null;
+			}
+			return getPosition.apply(this, [relative]);
+		},
+
+		getCoordinates: function(relative){
+			if (relative && $type(relative) == "array") {
+				MooTools.upgradeLog('1.1 > 1.2: Element.getCoordinates no longer accepts an array of overflown elements but rather, optionally, a single element to get relative coordinates.');
+				relative = null;
+			}
+			return getCoordinates.apply(this, [relative]);
+		}
+	
+	});
+
+	Native.implement([Document, Window], {
+
+		getSize: function(){
+			MooTools.upgradeLog('1.1 > 1.2: NOTE: getSize is different in 1.2; it no longer returns values for size, scroll, and scrollSize, but instead just returns x/y values for the dimensions of the element.');
+			var size;
+			var win = this.getWindow();
+			var doc = this.getDocument();
+			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
+			if (Browser.Engine.presto || Browser.Engine.webkit){
+				size =  {x: win.innerWidth, y: win.innerHeight};
+			} else {
+				size = {x: doc.clientWidth, y: doc.clientHeight};
+			}
+			return $extend(size, {
+				size: size,
+				scroll: {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop},
+				scrollSize: {x: Math.max(doc.scrollWidth, size.x), y: Math.max(doc.scrollHeight, size.y)}
+			});
+		}
+
+	});
+
+})();Event.keys = Event.Keys; // TODO
+(function(){
+
+	var toQueryString = Element.prototype.toQueryString;
+
+	Element.implement({
+
+		getFormElements: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.getFormElements is deprecated, use Element.getElements("input, textarea, select");'); 
+			return this.getElements('input, textarea, select');
+		},
+
+		replaceWith: function(el){
+			MooTools.upgradeLog('1.1 > 1.2: Element.replaceWith is deprecated, use Element.replaces instead.'); 
+			el = $(el);
+			this.parentNode.replaceChild(el, this);
+			return el;
+		},
+
+		remove: function() {
+			MooTools.upgradeLog('1.1 > 1.2: Element.remove is deprecated - use Element.dispose.');
+			return this.dispose.apply(this, arguments);
+		},
+
+		getText: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.getText is deprecated - use Element.get("text").'); 
+			return this.get('text');
+		},
+
+		setText: function(text){
+			MooTools.upgradeLog('1.1 > 1.2: Element.setText is deprecated - use Element.set("text", text).'); 
+			return this.set('text', text);
+		},
+
+		setHTML: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.setHTML is deprecated - use Element.set("html", HTML).'); 
+			return this.set('html', arguments);
+		},
+
+		getHTML: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.getHTML is deprecated - use Element.get("html").'); 
+			return this.get('html');
+		},
+
+		getTag: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.getTag is deprecated - use Element.get("tag").'); 
+			return this.get('tag');
+		},
+	
+		getValue: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Element.getValue is deprecated - use Element.get("value").');
+			switch(this.getTag()){
+				case 'select':
+					var values = [];
+					$each(this.options, function(option){
+						if (option.selected) values.push($pick(option.value, option.text));
+					});
+					return (this.multiple) ? values : values[0];
+				case 'input': if (!(this.checked && ['checkbox', 'radio'].contains(this.type)) && !['hidden', 'text', 'password'].contains(this.type)) break;
+				case 'textarea': return this.value;
+			}
+			return false;
+		},
+
+		toQueryString: function(){
+			MooTools.upgradeLog('1.1 > 1.2: warning Element.toQueryString is slightly different; inputs without names are excluded, inputs with type == submit, reset, and file are excluded, and inputs with undefined values are excluded.');
+			return toQueryString.apply(this, arguments);
+		}
+	});
+})();
+
+Element.Properties.properties = {
+	
+	set: function(props){
+		MooTools.upgradeLog('1.1 > 1.2: Element.set({properties: {}}) is deprecated; instead of properties, just name the values at the root of the object (Element.set({src: url})).');
+		$H(props).each(function(value, property){
+			this.set(property, value);
+		}, this);
+	}
+	
+};
+Element.implement({
+
+	setOpacity: function(op){
+		MooTools.upgradeLog('1.1 > 1.2: Element.setOpacity is deprecated; use Element.setStyle("opacity", value).');
+		return this.setStyle('opacity', op);
+	}
+
+});
+
+Element.Properties.styles = {
+	
+	set: function(styles){
+		MooTools.upgradeLog('1.1 > 1.2: Element.set("styles") no longer accepts a string as an argument. Pass an object instead.');
+		if ($type(styles) == 'string'){
+			styles.split(";").each(function(style){
+				this.setStyle(style.split(":")[0], style.split(":")[1]);
+			}, this);
+		} else {
+			this.setStyles(styles);
+		}
+	}
+	
+};Fx.implement({
+
+	custom: function(from, to){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.custom is deprecated. use Fx.start.');
+		return this.start(from, to);
+	},
+
+	clearTimer: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.clearTimer is deprecated. use Fx.cancel.');
+		return this.cancel();
+	},
+
+	stop: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.stop is deprecated. use Fx.cancel.');
+		return this.cancel();
+	}
+
+});
+
+Fx.Base = new Class({
+	Extends: Fx,
+	initialize: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.Base is deprecated. use Fx.');
+		this.parent.apply(this, arguments);
+	}
+});
+Fx.Style = new Class({
+	Extends: Fx.Tween,
+	initialize: function(element, property, options){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.Style is deprecated. use Fx.Tween.');
+		this.property = property;
+		this.parent(element, options);
+	},
+	
+	start: function(from, to) {
+		return this.parent(this.property, from, to);
+	},
+	
+	set: function(to) {
+		return this.parent(this.property, to);
+	},
+	
+	hide: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.Style .hide() is deprecated; use Fx.Tween .set(0) instead');
+		return this.set(0);
+	}
+
+});
+
+Element.implement({
+
+	effect: function(property, options){
+		MooTools.upgradeLog('1.1 > 1.2: Element.effect is deprecated; use Fx.Tween or Element.tween.');
+		return new Fx.Style(this, property, options);
+	}
+
+});
+Fx.Styles = new Class({
+	Extends: Fx.Morph,
+	initialize: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.Styles is deprecated. use Fx.Morph.');
+		this.parent.apply(this, arguments);
+	}
+});
+
+Element.implement({
+
+	effects: function(options){
+		MooTools.upgradeLog('1.1 > 1.2: Element.effects is deprecated; use Fx.Morph or Element.morph.');
+		return new Fx.Morph(this, options);
+	}
+
+});Fx.Scroll.implement({
+
+	scrollTo: function(y, x){
+		MooTools.upgradeLog('1.1 > 1.2: Fx.Scroll\'s .scrollTo is deprecated; use .start.');
+		return this.start(y, x);
+	}
+
+});Request.implement({
+	//1.11 passed along the response text and xml to onComplete
+	onStateChange: function(){
+		if (this.xhr.readyState != 4 || !this.running) return;
+		this.running = false;
+		this.status = 0;
+		$try(function(){
+			this.status = this.xhr.status;
+		}.bind(this));
+		this.xhr.onreadystatechange = $empty;
+		this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
+		if (this.options.isSuccess.call(this, this.status)) this.success(this.response.text, this.response.xml);
+		else this.failure(this.response.text, this.response.xml);
+	},
+	
+	failure: function(){
+		this.onFailure.apply(this, arguments);
+	},
+
+	onFailure: function(){
+		MooTools.upgradeLog('1.1 > 1.2: Note that onComplete does not receive arguments in 1.2. Also note that onComplete is invoked on BOTH success and failure (while in 1.1 it was only invoked on success). Use the onSuccess event instead if you wish to limit this invocation to success.');
+		this.fireEvent('complete', arguments).fireEvent('failure', this.xhr);
+	}
+
+});
+
+var XHR = new Class({
+
+	Extends: Request,
+
+	options: {
+		update: false
+	},
+
+	initialize: function(options){
+		MooTools.upgradeLog('1.1 > 1.2: XHR is deprecated. Use Request.');
+		this.parent(options);
+		this.transport = this.xhr;
+	},
+
+	request: function(data){
+		MooTools.upgradeLog('1.1 > 1.2: XHR.request() is deprecated. Use Request.send() instead.');
+		return this.send(this.url, data || this.options.data);
+	},
+
+	send: function(url, data){
+		if (!this.check(arguments.callee, url, data)) return this;
+		return this.parent({url: url, data: data});
+	},
+
+	success: function(text, xml){
+		text = this.processScripts(text);
+		if (this.options.update) $(this.options.update).empty().set('html', text);
+		this.onSuccess(text, xml);
+	},
+
+	failure: function(){
+		this.fireEvent('failure', this.xhr);
+	}
+
+});
+
+
+var Ajax = new Class({
+
+	Extends: XHR,
+
+	initialize: function(url, options){
+		MooTools.upgradeLog('1.1 > 1.2: Ajax is deprecated. Use Request.');
+		this.url = url;
+		this.parent(options);
+	},
+
+	success: function(text, xml){
+		// This version processes scripts *after* the update element is updated, like Mootools 1.1's Ajax class
+		// Partially from Remote.Ajax.success
+		this.processScripts(text);
+		response = this.response;
+		response.html = text.stripScripts(function(script){
+				response.javascript = script;
+		});
+		if (this.options.update) $(this.options.update).empty().set('html', response.html);
+		if (this.options.evalScripts) $exec(response.javascript);
+		this.onSuccess(text, xml);
+	}
+
+});
+
+(function(){
+	var send = Element.prototype.send;
+	Element.implement({
+		send: function(url) {
+			if ($type(url) == "string") return send.apply(this, arguments);
+			if ($type(url) == "object") {
+				MooTools.upgradeLog('1.1 > 1.2: Element.send no longer takes an options argument as its object but rather a url. See docs.');
+				this.set('send', url);
+				send.call(this);
+			}
+			return this;
+		}
+	});
+})();JSON.Remote = new Class({
+
+	options: {
+		key: 'json'
+	},
+
+	Extends: Request.JSON,
+
+	initialize: function(url, options){
+		MooTools.upgradeLog('JSON.Remote is deprecated. Use Request.JSON');
+		this.parent(options);
+		this.onComplete = $empty;
+		this.url = url;
+	},
+
+	send: function(data){
+		if (!this.check(arguments.callee, data)) return this;
+		return this.parent({url: this.url, data: {json: Json.encode(data)}});
+	},
+
+	failure: function(){
+		this.fireEvent('failure', this.xhr);
+	}
+
+});
+
+Cookie.set = function(key, value, options){
+	MooTools.upgradeLog('1.1 > 1.2: Cookie.set is deprecated. Use Cookie.write');
+	return new Cookie(key, options).write(value);
+};
+
+Cookie.get = function(key){
+	MooTools.upgradeLog('1.1 > 1.2: Cookie.get is deprecated. Use Cookie.read');
+	return new Cookie(key).read();
+};
+
+Cookie.remove = function(key, options){
+	MooTools.upgradeLog('1.1 > 1.2: Cookie.remove is deprecated. Use Cookie.dispose');
+	return new Cookie(key, options).dispose();
+};
+JSON.toString = function(obj){ 
+	MooTools.upgradeLog('1.1 > 1.2: JSON.toString is deprecated. Use JSON.encode');
+	return JSON.encode(obj); 
+};
+JSON.evaluate = function(str){
+	MooTools.upgradeLog('1.1 > 1.2: JSON.evaluate is deprecated. Use JSON.decode');
+	return JSON.decode(str); 
+};
+var Json = JSON;
+
+Native.implement([Element, Document], {
+
+	getElementsByClassName: function(className){
+		MooTools.upgradeLog('1.1 > 1.2: Element.filterByTag is deprecated.');
+		
+		return this.getElements('.' + className);
+	},
+
+	getElementsBySelector: function(selector){
+		MooTools.upgradeLog('1.1 > 1.2: Element.getElementsBySelector is deprecated. Use getElements()');
+		return this.getElements(selector);
+	}
+
+});
+
+Elements.implement({
+
+	filterByTag: function(tag){
+		MooTools.upgradeLog('1.1 > 1.2: Elements.filterByTag is deprecated. Use Elements.filter.');
+		return this.filter(tag);
+	},
+
+	filterByClass: function(className){
+		MooTools.upgradeLog('1.1 > 1.2: Elements.filterByClass is deprecated. Use Elements.filter.');
+		return this.filter('.' + className);
+	},
+
+	filterById: function(id){
+		MooTools.upgradeLog('1.1 > 1.2: Elements.filterById is deprecated. Use Elements.filter.');
+		return this.filter('#' + id);
+	},
+
+	filterByAttribute: function(name, operator, value){
+		MooTools.upgradeLog('1.1 > 1.2: Elements.filterByAttribute is deprecated. Use Elements.filter.');
+		var filtered = this.filter('[' + name + (operator || '') + (value || '') + ']');
+		if (value) filtered = filtered.filter('[' + name + ']');
+		return filtered;
+	}
+
+});
+
+var $E = function(selector, filter){
+	MooTools.upgradeLog('1.1 > 1.2: $E is deprecated, use document.getElement.');
+	return ($(filter) || document).getElement(selector);
+};
+
+var $ES = function(selector, filter){
+	MooTools.upgradeLog('1.1 > 1.2: $ES is deprecated. Use $$.');
+	return ($(filter) || document).getElements(selector);
+};(function(){
+	if (!window.Tips) return;
+
+	Tips.implement({
+
+		initialize: function(){
+			MooTools.upgradeLog('1.1 > 1.2: Tips DOM element layout has changed and your CSS classes may need to change.');
+			var params = Array.link(arguments, {options: Object.type, elements: $defined});
+			this.setOptions(params.options);
+			if (this.options.offsets) {
+				MooTools.upgradeLog('1.1 > 1.2: Tips no longer have an "offsets" option; use "offset".');
+				this.options.offset = this.options.offsets;
+			}
+			document.id(this);
+			this.addEvent('show', function(){
+				this.tip.addClass('tool-tip');
+				this.tip.getElement('.tip-title').addClass('tool-title');
+				this.tip.getElement('.tip-text').addClass('tool-text');
+			});
+			this.parseTitle(params.elements);
+			if (params.elements) this.attach(params.elements);
+		},
+
+		parseTitle: function(elements){
+			elements.each(function(element){
+			var title = element.get('title');
+				if (title.test('::')) {
+					MooTools.upgradeLog('1.1 > 1.2: Tips no longer parse the title attribute for "::" for title/caption; use title and rel attributes instead.');
+					element.store('tip:title', title.split('::')[0]);
+					element.store('tip:text', title.split('::')[1]);
+					element.set('title', '');
+				}
+			});
+		}
+
+	});
+
+})();
\ No hay ningún carácter de nueva línea al final del fichero
diff -aruN --binary 18/plugins/system/mtupgrade.php 20/plugins/system/mtupgrade.php
--- 18/plugins/system/mtupgrade.php	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade.php	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1,50 @@
+<?php
+/**
+* @version		$Id: mtupgrade.php 18130 2010-07-14 11:21:35Z louis $
+* @package		Joomla
+* @copyright	Copyright (C) 2005 - 2009 Open Source Matters. All rights reserved.
+* @license		GNU/GPL, see LICENSE.php
+* Joomla! is free software. This version may have been modified pursuant
+* to the GNU General Public License, and as distributed it includes or
+* is derivative of works licensed under the GNU General Public License or
+* other free or open source software licenses.
+* See COPYRIGHT.php for copyright notices and details.
+*/
+
+// no direct access
+defined('_JEXEC') or die('Restricted access');
+
+jimport('joomla.plugin.plugin');
+
+class plgSystemMTUpgrade extends JPlugin
+{
+	/**
+	 * Constructor
+	 *
+	 * For php4 compatability we must not use the __constructor as a constructor for plugins
+	 * because func_get_args ( void ) returns a copy of all passed arguments NOT references.
+	 * This causes problems with cross-referencing necessary for the observer design pattern.
+	 *
+	 * @access	protected
+	 * @param	object	$subject The object to observe
+	 * @param 	array   $config  An array that holds the plugin configuration
+	 * @since	1.0
+	 */
+	function plgSystemMTUpgrade(& $subject, $config)
+	{
+		parent::__construct($subject, $config);
+	}
+
+	/**
+	 * onAfterInitialise handler
+	 *
+	 * Adds the mtupgrade folder to the list of directories to search for JHTML helpers.
+	 *
+	 * @access	public
+	 * @return null
+	 */
+	function onAfterInitialise()
+	{
+		JHTML::addIncludePath(JPATH_PLUGINS.DS.'system'.DS.'mtupgrade');
+	}
+}
diff -aruN --binary 18/plugins/system/mtupgrade.xml 20/plugins/system/mtupgrade.xml
--- 18/plugins/system/mtupgrade.xml	1970-01-01 01:00:00.000000000 +0100
+++ 20/plugins/system/mtupgrade.xml	2010-07-18 05:20:32.000000000 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<install version="1.5" type="plugin" group="system" method="upgrade">
+	<name>System - Mootools Upgrade</name>
+	<author>Joomla! Project</author>
+	<creationDate>June 2010</creationDate>
+	<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
+	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
+	<authorEmail>admin@joomla.org</authorEmail>
+	<authorUrl>www.joomla.org</authorUrl>
+	<version>1.5</version>
+	<description>Mootools 1.2.4</description>
+	<files>
+		<filename plugin="mtupgrade">mtupgrade.php</filename>
+		<folder>mtupgrade</folder>
+	</files>
+	<params>
+	</params>
+</install>
diff -aruN --binary 18/templates/ja_purity/ja_templatetools.php 20/templates/ja_purity/ja_templatetools.php
--- 18/templates/ja_purity/ja_templatetools.php	2009-11-04 19:51:20.000000000 +0100
+++ 20/templates/ja_purity/ja_templatetools.php	2010-07-18 05:15:44.000000000 +0200
@@ -103,14 +103,13 @@
 		}
 
 		$user	=& JFactory::getUser();
-		if (isset($user))
-		{
+		$sql = 'SELECT count(*) FROM #__menu AS m'
+			. ' WHERE menutype=' . $database -> Quote($menutype)
+			. ' AND published=1 AND parent=0 and ordering < ' . $ordering
+		;
+		if (isset($user)) {
 			$aid = $user->get('aid', 0);
-			$sql = "SELECT count(*) FROM #__menu AS m"
-			. "\nWHERE menutype='". $menutype ."' AND published='1' AND access <= '$aid' AND parent=0 and ordering < $ordering";
-		} else {
-			$sql = "SELECT count(*) FROM #__menu AS m"
-			. "\nWHERE menutype='". $menutype ."' AND published='1' AND parent=0 and ordering < $ordering";
+			$sql .= " AND access <= '$aid'";
 		}
 		$database->setQuery($sql);
 
