diff -x .svn -aruN 2.2rc2a.cp.src/account_edit.php 2.3.1.src/account_edit.php
--- 2.2rc2a.cp.src/account_edit.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_edit.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_edit.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,7 +20,7 @@
 // needs to be included earlier to set the success message in the messageStack
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ACCOUNT_EDIT);
 
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     if (ACCOUNT_GENDER == 'true') $gender = tep_db_prepare_input($HTTP_POST_VARS['gender']);
     $firstname = tep_db_prepare_input($HTTP_POST_VARS['firstname']);
     $lastname = tep_db_prepare_input($HTTP_POST_VARS['lastname']);
@@ -52,7 +52,7 @@
     }
 
     if (ACCOUNT_DOB == 'true') {
-      if (!checkdate(substr(tep_date_raw($dob), 4, 2), substr(tep_date_raw($dob), 6, 2), substr(tep_date_raw($dob), 0, 4))) {
+      if ((is_numeric(tep_date_raw($dob)) == false) || (@checkdate(substr(tep_date_raw($dob), 4, 2), substr(tep_date_raw($dob), 6, 2), substr(tep_date_raw($dob), 0, 4)) == false)) {
         $error = true;
 
         $messageStack->add('account_edit', ENTRY_DATE_OF_BIRTH_ERROR);
@@ -118,68 +118,31 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ACCOUNT_EDIT, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+  require('includes/form_check.js.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<?php require('includes/form_check.js.php'); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('account_edit', tep_href_link(FILENAME_ACCOUNT_EDIT, '', 'SSL'), 'post', 'onSubmit="return check_form(account_edit);"') . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('account_edit') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('account_edit'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('account_edit');
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><b><?php echo MY_ACCOUNT_TITLE; ?></b></td>
-                <td class="inputRequirement" align="right"><?php echo FORM_REQUIRED_INFORMATION; ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" cellspacing="2" cellpadding="2">
+
+<?php echo tep_draw_form('account_edit', tep_href_link(FILENAME_ACCOUNT_EDIT, '', 'SSL'), 'post', 'onsubmit="return check_form(account_edit);"', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <div>
+    <div class="inputRequirement" style="float: right;"><?php echo FORM_REQUIRED_INFORMATION; ?></div>
+
+    <h2><?php echo MY_ACCOUNT_TITLE; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
+
 <?php
   if (ACCOUNT_GENDER == 'true') {
     if (isset($gender)) {
@@ -189,81 +152,65 @@
     }
     $female = !$male;
 ?>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_GENDER; ?></td>
-                    <td class="main"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
-                  </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_GENDER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_FIRST_NAME; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('firstname', $account['customers_firstname']) . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_LAST_NAME; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('lastname', $account['customers_lastname']) . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
-                  </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_FIRST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('firstname', $account['customers_firstname']) . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_LAST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('lastname', $account['customers_lastname']) . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_DOB == 'true') {
 ?>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_DATE_OF_BIRTH; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('dob', tep_date_short($account['customers_dob'])) . '&nbsp;' . (tep_not_null(ENTRY_DATE_OF_BIRTH_TEXT) ? '<span class="inputRequirement">' . ENTRY_DATE_OF_BIRTH_TEXT . '</span>': ''); ?></td>
-                  </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_DATE_OF_BIRTH; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('dob', tep_date_short($account['customers_dob']), 'id="dob"') . '&nbsp;' . (tep_not_null(ENTRY_DATE_OF_BIRTH_TEXT) ? '<span class="inputRequirement">' . ENTRY_DATE_OF_BIRTH_TEXT . '</span>': ''); ?><script type="text/javascript">$('#dob').datepicker({dateFormat: '<?php echo JQUERY_DATEPICKER_FORMAT; ?>', changeMonth: true, changeYear: true, yearRange: '-100:+0'});</script></td>
+      </tr>
+
 <?php
   }
 ?>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('email_address', $account['customers_email_address']) . '&nbsp;' . (tep_not_null(ENTRY_EMAIL_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_TELEPHONE_NUMBER; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('telephone', $account['customers_telephone']) . '&nbsp;' . (tep_not_null(ENTRY_TELEPHONE_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_TELEPHONE_NUMBER_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_FAX_NUMBER; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('fax', $account['customers_fax']) . '&nbsp;' . (tep_not_null(ENTRY_FAX_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_FAX_NUMBER_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('email_address', $account['customers_email_address']) . '&nbsp;' . (tep_not_null(ENTRY_EMAIL_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>': ''); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_TELEPHONE_NUMBER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('telephone', $account['customers_telephone']) . '&nbsp;' . (tep_not_null(ENTRY_TELEPHONE_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_TELEPHONE_NUMBER_TEXT . '</span>': ''); ?></td>
       </tr>
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey"><?php echo ENTRY_FAX_NUMBER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('fax', $account['customers_fax']) . '&nbsp;' . (tep_not_null(ENTRY_FAX_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_FAX_NUMBER_TEXT . '</span>': ''); ?></td>
       </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+    <br />
+
+    <div class="buttonSet">
+      <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+      <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+    </div>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/account_history_info.php 2.3.1.src/account_history_info.php
--- 2.2rc2a.cp.src/account_history_info.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_history_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_history_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -35,228 +35,159 @@
 
   require(DIR_WS_CLASSES . 'order.php');
   $order = new order($HTTP_GET_VARS['order_id']);
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_history.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <h2><?php echo sprintf(HEADING_ORDER_NUMBER, $HTTP_GET_VARS['order_id']) . ' <span class="contentText">(' . $order->info['orders_status'] . ')</span>'; ?></h2>
+
+  <div class="contentText">
+    <div>
+      <span style="float: right;"><?php echo HEADING_ORDER_TOTAL . ' ' . $order->info['total']; ?></span>
+      <?php echo HEADING_ORDER_DATE . ' ' . tep_date_long($order->info['date_purchased']); ?>
+    </div>
+
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+<?php
+  if ($order->delivery != false) {
+?>
+        <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main" colspan="2"><b><?php echo sprintf(HEADING_ORDER_NUMBER, $HTTP_GET_VARS['order_id']) . ' <small>(' . $order->info['orders_status'] . ')</small>'; ?></b></td>
+            <td><strong><?php echo HEADING_DELIVERY_ADDRESS; ?></strong></td>
           </tr>
           <tr>
-            <td class="smallText"><?php echo HEADING_ORDER_DATE . ' ' . tep_date_long($order->info['date_purchased']); ?></td>
-            <td class="smallText" align="right"><?php echo HEADING_ORDER_TOTAL . ' ' . $order->info['total']; ?></td>
+            <td><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, ' ', '<br />'); ?></td>
           </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-<?php
-  if ($order->delivery != false) {
-?>
-            <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><b><?php echo HEADING_DELIVERY_ADDRESS; ?></b></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, ' ', '<br>'); ?></td>
-              </tr>
 <?php
     if (tep_not_null($order->info['shipping_method'])) {
 ?>
-              <tr>
-                <td class="main"><b><?php echo HEADING_SHIPPING_METHOD; ?></b></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo $order->info['shipping_method']; ?></td>
-              </tr>
+          <tr>
+            <td><strong><?php echo HEADING_SHIPPING_METHOD; ?></strong></td>
+          </tr>
+          <tr>
+            <td><?php echo $order->info['shipping_method']; ?></td>
+          </tr>
 <?php
     }
 ?>
-            </table></td>
+        </table></td>
 <?php
   }
 ?>
-            <td width="<?php echo (($order->delivery != false) ? '70%' : '100%'); ?>" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <td width="<?php echo (($order->delivery != false) ? '70%' : '100%'); ?>" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   if (sizeof($order->info['tax_groups']) > 1) {
 ?>
-                  <tr>
-                    <td class="main" colspan="2"><b><?php echo HEADING_PRODUCTS; ?></b></td>
-                    <td class="smallText" align="right"><b><?php echo HEADING_TAX; ?></b></td>
-                    <td class="smallText" align="right"><b><?php echo HEADING_TOTAL; ?></b></td>
-                  </tr>
+          <tr>
+            <td colspan="2"><strong><?php echo HEADING_PRODUCTS; ?></strong></td>
+            <td align="right"><strong><?php echo HEADING_TAX; ?></strong></td>
+            <td align="right"><strong><?php echo HEADING_TOTAL; ?></strong></td>
+          </tr>
 <?php
   } else {
 ?>
-                  <tr>
-                    <td class="main" colspan="3"><b><?php echo HEADING_PRODUCTS; ?></b></td>
-                  </tr>
+          <tr>
+            <td colspan="2"><strong><?php echo HEADING_PRODUCTS; ?></strong></td>
+            <td align="right"><strong><?php echo HEADING_TOTAL; ?></strong></td>
+          </tr>
 <?php
   }
 
   for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
     echo '          <tr>' . "\n" .
-         '            <td class="main" align="right" valign="top" width="30">' . $order->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
-         '            <td class="main" valign="top">' . $order->products[$i]['name'];
+         '            <td align="right" valign="top" width="30">' . $order->products[$i]['qty'] . '&nbsp;x&nbsp;</td>' . "\n" .
+         '            <td valign="top">' . $order->products[$i]['name'];
 
     if ( (isset($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0) ) {
       for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
-        echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></small></nobr>';
+        echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></small></nobr>';
       }
     }
 
     echo '</td>' . "\n";
 
     if (sizeof($order->info['tax_groups']) > 1) {
-      echo '            <td class="main" valign="top" align="right">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n";
+      echo '            <td valign="top" align="right">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n";
     }
 
-    echo '            <td class="main" align="right" valign="top">' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</td>' . "\n" .
+    echo '            <td align="right" valign="top">' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</td>' . "\n" .
          '          </tr>' . "\n";
   }
 ?>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
         </table></td>
       </tr>
+    </table>
+  </div>
+
+  <h2><?php echo HEADING_BILLING_INFORMATION; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo HEADING_BILLING_INFORMATION; ?></b></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><b><?php echo HEADING_BILLING_ADDRESS; ?></b></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, ' ', '<br>'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><b><?php echo HEADING_PAYMENT_METHOD; ?></b></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo $order->info['payment_method']; ?></td>
-              </tr>
-            </table></td>
-            <td width="70%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+          <tr>
+            <td><strong><?php echo HEADING_BILLING_ADDRESS; ?></strong></td>
+          </tr>
+          <tr>
+            <td><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, ' ', '<br />'); ?></td>
+          </tr>
+          <tr>
+            <td><strong><?php echo HEADING_PAYMENT_METHOD; ?></strong></td>
+          </tr>
+          <tr>
+            <td><?php echo $order->info['payment_method']; ?></td>
+          </tr>
+        </table></td>
+        <td width="70%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   for ($i=0, $n=sizeof($order->totals); $i<$n; $i++) {
-    echo '              <tr>' . "\n" .
-         '                <td class="main" align="right" width="100%">' . $order->totals[$i]['title'] . '</td>' . "\n" .
-         '                <td class="main" align="right">' . $order->totals[$i]['text'] . '</td>' . "\n" .
-         '              </tr>' . "\n";
+    echo '          <tr>' . "\n" .
+         '            <td align="right" width="100%">' . $order->totals[$i]['title'] . '</td>' . "\n" .
+         '            <td align="right">' . $order->totals[$i]['text'] . '</td>' . "\n" .
+         '          </tr>' . "\n";
   }
 ?>
-            </table></td>
-          </tr>
         </table></td>
       </tr>
+    </table>
+  </div>
+
+  <h2><?php echo HEADING_ORDER_HISTORY; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo HEADING_ORDER_HISTORY; ?></b></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   $statuses_query = tep_db_query("select os.orders_status_name, osh.date_added, osh.comments from " . TABLE_ORDERS_STATUS . " os, " . TABLE_ORDERS_STATUS_HISTORY . " osh where osh.orders_id = '" . (int)$HTTP_GET_VARS['order_id'] . "' and osh.orders_status_id = os.orders_status_id and os.language_id = '" . (int)$languages_id . "' and os.public_flag = '1' order by osh.date_added");
   while ($statuses = tep_db_fetch_array($statuses_query)) {
-    echo '              <tr>' . "\n" .
-         '                <td class="main" valign="top" width="70">' . tep_date_short($statuses['date_added']) . '</td>' . "\n" .
-         '                <td class="main" valign="top" width="70">' . $statuses['orders_status_name'] . '</td>' . "\n" .
-         '                <td class="main" valign="top">' . (empty($statuses['comments']) ? '&nbsp;' : nl2br(tep_output_string_protected($statuses['comments']))) . '</td>' . "\n" .
-         '              </tr>' . "\n";
+    echo '          <tr>' . "\n" .
+         '            <td valign="top" width="70">' . tep_date_short($statuses['date_added']) . '</td>' . "\n" .
+         '            <td valign="top" width="70">' . $statuses['orders_status_name'] . '</td>' . "\n" .
+         '            <td valign="top">' . (empty($statuses['comments']) ? '&nbsp;' : nl2br(tep_output_string_protected($statuses['comments']))) . '</td>' . "\n" .
+         '          </tr>' . "\n";
   }
 ?>
-            </table></td>
-          </tr>
         </table></td>
       </tr>
+    </table>
+  </div>
+
 <?php
   if (DOWNLOAD_ENABLED == 'true') include(DIR_WS_MODULES . 'downloads.php');
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, tep_get_all_get_params(array('order_id')), 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  <div class="buttonSet">
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT_HISTORY, tep_get_all_get_params(array('order_id')), 'SSL')); ?>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/account_history.php 2.3.1.src/account_history.php
--- 2.2rc2a.cp.src/account_history.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_history.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_history.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,43 +21,14 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_history.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+
 <?php
   $orders_total = tep_count_customer_orders();
 
@@ -78,91 +49,47 @@
         $order_name = $history['billing_name'];
       }
 ?>
-          <table border="0" width="100%" cellspacing="0" cellpadding="2">
-            <tr>
-              <td class="main"><?php echo '<b>' . TEXT_ORDER_NUMBER . '</b> ' . $history['orders_id']; ?></td>
-              <td class="main" align="right"><?php echo '<b>' . TEXT_ORDER_STATUS . '</b> ' . $history['orders_status_name']; ?></td>
-            </tr>
-          </table>
-          <table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-            <tr class="infoBoxContents">
-              <td><table border="0" width="100%" cellspacing="2" cellpadding="4">
-                <tr>
-                  <td class="main" width="50%" valign="top"><?php echo '<b>' . TEXT_ORDER_DATE . '</b> ' . tep_date_long($history['date_purchased']) . '<br><b>' . $order_type . '</b> ' . tep_output_string_protected($order_name); ?></td>
-                  <td class="main" width="30%" valign="top"><?php echo '<b>' . TEXT_ORDER_PRODUCTS . '</b> ' . $products['count'] . '<br><b>' . TEXT_ORDER_COST . '</b> ' . strip_tags($history['order_total']); ?></td>
-                  <td class="main" width="20%"><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . 'order_id=' . $history['orders_id'], 'SSL') . '">' . tep_image_button('small_view.gif', SMALL_IMAGE_BUTTON_VIEW) . '</a>'; ?></td>
-                </tr>
-              </table></td>
-            </tr>
-          </table>
-          <table border="0" width="100%" cellspacing="0" cellpadding="2">
-            <tr>
-              <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
-            </tr>
-          </table>
+
+  <h2><?php echo TEXT_ORDER_NUMBER . ' ' . $history['orders_id'] . ' <span class="contentText">(' . $history['orders_status_name'] . ')</span>'; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="2" cellpadding="2">
+      <tr>
+        <td width="50%" valign="top"><?php echo '<strong>' . TEXT_ORDER_DATE . '</strong> ' . tep_date_long($history['date_purchased']) . '<br /><strong>' . $order_type . '</strong> ' . tep_output_string_protected($order_name); ?></td>
+        <td width="30%" valign="top"><?php echo '<strong>' . TEXT_ORDER_PRODUCTS . '</strong> ' . $products['count'] . '<br /><strong>' . TEXT_ORDER_COST . '</strong> ' . strip_tags($history['order_total']); ?></td>
+        <td width="20%" align="right"><?php echo tep_draw_button(SMALL_IMAGE_BUTTON_VIEW, 'document', tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . 'order_id=' . $history['orders_id'], 'SSL'), 'primary'); ?></td>
+     </tr>
+    </table>
+  </div>
+
 <?php
     }
-  } else {
 ?>
-          <table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-            <tr class="infoBoxContents">
-              <td><table border="0" width="100%" cellspacing="2" cellpadding="4">
-                <tr>
-                  <td class="main"><?php echo TEXT_NO_PURCHASES; ?></td>
-                </tr>
-              </table></td>
-            </tr>
-          </table>
+
+  <div class="contentText">
+    <p style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $history_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></p>
+
+    <p><?php echo $history_split->display_count(TEXT_DISPLAY_NUMBER_OF_ORDERS); ?></p>
+  </div>
+
 <?php
-  }
+  } else {
 ?>
-        </td>
-      </tr>
+
+  <div class="contentText">
+    <p><?php echo TEXT_NO_PURCHASES; ?></p>
+  </div>
+
 <?php
-  if ($orders_total > 0) {
+  }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText" valign="top"><?php echo $history_split->display_count(TEXT_DISPLAY_NUMBER_OF_ORDERS); ?></td>
-            <td class="smallText" align="right"><?php echo TEXT_RESULT_PAGE . ' ' . $history_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <div class="buttonSet">
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+  </div>
+</div>
+
 <?php
-  }
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/account_newsletters.php 2.3.1.src/account_newsletters.php
--- 2.2rc2a.cp.src/account_newsletters.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_newsletters.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -23,7 +23,7 @@
   $newsletter_query = tep_db_query("select customers_newsletter from " . TABLE_CUSTOMERS . " where customers_id = '" . (int)$customer_id . "'");
   $newsletter = tep_db_fetch_array($newsletter_query);
 
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     if (isset($HTTP_POST_VARS['newsletter_general']) && is_numeric($HTTP_POST_VARS['newsletter_general'])) {
       $newsletter_general = tep_db_prepare_input($HTTP_POST_VARS['newsletter_general']);
     } else {
@@ -43,117 +43,36 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ACCOUNT_NEWSLETTERS, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function rowOverEffect(object) {
-  if (object.className == 'moduleRow') object.className = 'moduleRowOver';
-}
-
-function rowOutEffect(object) {
-  if (object.className == 'moduleRowOver') object.className = 'moduleRow';
-}
-
-function checkBox(object) {
-  document.account_newsletter.elements[object].checked = !document.account_newsletter.elements[object].checked;
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('account_newsletter', tep_href_link(FILENAME_ACCOUNT_NEWSLETTERS, '', 'SSL')) . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo MY_NEWSLETTERS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="checkBox('newsletter_general')">
-                    <td class="main"><?php echo tep_draw_checkbox_field('newsletter_general', '1', (($newsletter['customers_newsletter'] == '1') ? true : false), 'onclick="checkBox(\'newsletter_general\')"'); ?></td>
-                    <td class="main"><b><?php echo MY_NEWSLETTERS_GENERAL_NEWSLETTER; ?></b></td>
-                  </tr>
-                  <tr>
-                    <td class="main">&nbsp;</td>
-                    <td><table border="0" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo MY_NEWSLETTERS_GENERAL_NEWSLETTER_DESCRIPTION; ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<?php echo tep_draw_form('account_newsletter', tep_href_link(FILENAME_ACCOUNT_NEWSLETTERS, '', 'SSL'), 'post', '', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <h2><?php echo MY_NEWSLETTERS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td><?php echo tep_draw_checkbox_field('newsletter_general', '1', (($newsletter['customers_newsletter'] == '1') ? true : false), 'onclick="checkBox(\'newsletter_general\')"'); ?></td>
+        <td><strong><?php echo MY_NEWSLETTERS_GENERAL_NEWSLETTER; ?></strong><br /><?php echo MY_NEWSLETTERS_GENERAL_NEWSLETTER_DESCRIPTION; ?></td>
       </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/account_notifications.php 2.3.1.src/account_notifications.php
--- 2.2rc2a.cp.src/account_notifications.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_notifications.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_notifications.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -23,7 +23,7 @@
   $global_query = tep_db_query("select global_product_notifications from " . TABLE_CUSTOMERS_INFO . " where customers_info_id = '" . (int)$customer_id . "'");
   $global = tep_db_fetch_array($global_query);
 
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     if (isset($HTTP_POST_VARS['product_global']) && is_numeric($HTTP_POST_VARS['product_global'])) {
       $product_global = tep_db_prepare_input($HTTP_POST_VARS['product_global']);
     } else {
@@ -69,184 +69,96 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function rowOverEffect(object) {
-  if (object.className == 'moduleRow') object.className = 'moduleRowOver';
-}
-
-function rowOutEffect(object) {
-  if (object.className == 'moduleRowOver') object.className = 'moduleRow';
-}
-
-function checkBox(object) {
-  document.account_notifications.elements[object].checked = !document.account_notifications.elements[object].checked;
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('account_notifications', tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL')) . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo MY_NOTIFICATIONS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo MY_NOTIFICATIONS_DESCRIPTION; ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo GLOBAL_NOTIFICATIONS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="checkBox('product_global')">
-                    <td class="main" width="30"><?php echo tep_draw_checkbox_field('product_global', '1', (($global['global_product_notifications'] == '1') ? true : false), 'onclick="checkBox(\'product_global\')"'); ?></td>
-                    <td class="main"><b><?php echo GLOBAL_NOTIFICATIONS_TITLE; ?></b></td>
-                  </tr>
-                  <tr>
-                    <td width="30">&nbsp;</td>
-                    <td class="main"><?php echo GLOBAL_NOTIFICATIONS_DESCRIPTION; ?></td>
-                  </tr>
-                </table></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<?php echo tep_draw_form('account_notifications', tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL'), 'post', '', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <h2><?php echo MY_NOTIFICATIONS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <?php echo MY_NOTIFICATIONS_DESCRIPTION; ?>
+  </div>
+
+  <h2><?php echo GLOBAL_NOTIFICATIONS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td width="30"><?php echo tep_draw_checkbox_field('product_global', '1', (($global['global_product_notifications'] == '1') ? true : false), 'onclick="checkBox(\'product_global\')"'); ?></td>
+        <td><strong><?php echo GLOBAL_NOTIFICATIONS_TITLE; ?></strong><br /><?php echo GLOBAL_NOTIFICATIONS_DESCRIPTION; ?></td>
       </tr>
+    </table>
+  </div>
+
 <?php
   if ($global['global_product_notifications'] != '1') {
 ?>
-      <tr>
-        <td class="main"><b><?php echo NOTIFICATIONS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+  <h2><?php echo NOTIFICATIONS_TITLE; ?></h2>
+
+  <div class="contentText">
+
 <?php
     $products_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_NOTIFICATIONS . " where customers_id = '" . (int)$customer_id . "'");
     $products_check = tep_db_fetch_array($products_check_query);
     if ($products_check['total'] > 0) {
 ?>
-                  <tr>
-                    <td class="main" colspan="2"><?php echo NOTIFICATIONS_DESCRIPTION; ?></td>
-                  </tr>
+
+    <div><?php echo NOTIFICATIONS_DESCRIPTION; ?></div>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
       $counter = 0;
       $products_query = tep_db_query("select pd.products_id, pd.products_name from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_NOTIFICATIONS . " pn where pn.customers_id = '" . (int)$customer_id . "' and pn.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by pd.products_name");
       while ($products = tep_db_fetch_array($products_query)) {
 ?>
-                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="checkBox('products[<?php echo $counter; ?>]')">
-                    <td class="main" width="30"><?php echo tep_draw_checkbox_field('products[' . $counter . ']', $products['products_id'], true, 'onclick="checkBox(\'products[' . $counter . ']\')"'); ?></td>
-                    <td class="main"><b><?php echo $products['products_name']; ?></b></td>
-                  </tr>
+
+      <tr>
+        <td width="30"><?php echo tep_draw_checkbox_field('products[' . $counter . ']', $products['products_id'], true, 'onclick="checkBox(\'products[' . $counter . ']\')"'); ?></td>
+        <td><strong><?php echo $products['products_name']; ?></strong></td>
+      </tr>
+
 <?php
         $counter++;
       }
+?>
+
+    </table>
+
+<?php
     } else {
 ?>
-                  <tr>
-                    <td class="main"><?php echo NOTIFICATIONS_NON_EXISTING; ?></td>
-                  </tr>
+
+    <div>
+      <?php echo NOTIFICATIONS_NON_EXISTING; ?>
+    </div>
+
 <?php
     }
 ?>
-                </table></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/account_password.php 2.3.1.src/account_password.php
--- 2.2rc2a.cp.src/account_password.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account_password.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account_password.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,18 +20,14 @@
 // needs to be included earlier to set the success message in the messageStack
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ACCOUNT_PASSWORD);
 
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $password_current = tep_db_prepare_input($HTTP_POST_VARS['password_current']);
     $password_new = tep_db_prepare_input($HTTP_POST_VARS['password_new']);
     $password_confirmation = tep_db_prepare_input($HTTP_POST_VARS['password_confirmation']);
 
     $error = false;
 
-    if (strlen($password_current) < ENTRY_PASSWORD_MIN_LENGTH) {
-      $error = true;
-
-      $messageStack->add('account_password', ENTRY_PASSWORD_CURRENT_ERROR);
-    } elseif (strlen($password_new) < ENTRY_PASSWORD_MIN_LENGTH) {
+    if (strlen($password_new) < ENTRY_PASSWORD_MIN_LENGTH) {
       $error = true;
 
       $messageStack->add('account_password', ENTRY_PASSWORD_NEW_ERROR);
@@ -63,121 +59,54 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ACCOUNT_PASSWORD, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+  require('includes/form_check.js.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<?php require('includes/form_check.js.php'); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('account_password', tep_href_link(FILENAME_ACCOUNT_PASSWORD, '', 'SSL'), 'post', 'onSubmit="return check_form(account_password);"') . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('account_password') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('account_password'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('account_password');
   }
 ?>
+
+<?php echo tep_draw_form('account_password', tep_href_link(FILENAME_ACCOUNT_PASSWORD, '', 'SSL'), 'post', 'onsubmit="return check_form(account_password);"', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <div>
+    <span class="inputRequirement" style="float: right;"><?php echo FORM_REQUIRED_INFORMATION; ?></span>
+    <h2><?php echo MY_PASSWORD_TITLE; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="2" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><b><?php echo MY_PASSWORD_TITLE; ?></b></td>
-                <td class="inputRequirement" align="right"><?php echo FORM_REQUIRED_INFORMATION; ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" cellspacing="2" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo ENTRY_PASSWORD_CURRENT; ?></td>
-                    <td class="main"><?php echo tep_draw_password_field('password_current') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CURRENT_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CURRENT_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_PASSWORD_NEW; ?></td>
-                    <td class="main"><?php echo tep_draw_password_field('password_new') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_NEW_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_NEW_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo ENTRY_PASSWORD_CONFIRMATION; ?></td>
-                    <td class="main"><?php echo tep_draw_password_field('password_confirmation') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CONFIRMATION_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CONFIRMATION_TEXT . '</span>': ''); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD_CURRENT; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('password_current') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CURRENT_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CURRENT_TEXT . '</span>': ''); ?></td>
       </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+      <tr> 
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD_NEW; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('password_new') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_NEW_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_NEW_TEXT . '</span>': ''); ?></td>
       </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+      <tr> 
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD_CONFIRMATION; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('password_confirmation') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CONFIRMATION_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CONFIRMATION_TEXT . '</span>': ''); ?></td>
       </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/account.php 2.3.1.src/account.php
--- 2.2rc2a.cp.src/account.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/account.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: account.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,222 +20,48 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ACCOUNT);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function rowOverEffect(object) {
-  if (object.className == 'moduleRow') object.className = 'moduleRowOver';
-}
-
-function rowOutEffect(object) {
-  if (object.className == 'moduleRowOver') object.className = 'moduleRow';
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('account') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('account'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('account');
   }
-
-  if (tep_count_customer_orders() > 0) {
-?>
-      <tr>
-        <td><table border="0" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo OVERVIEW_TITLE; ?></b></td>
-            <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL') . '"><u>' . OVERVIEW_SHOW_ALL_ORDERS . '</u></a>'; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main" align="center" valign="top" width="130"><?php echo '<b>' . OVERVIEW_PREVIOUS_ORDERS . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-<?php
-    $orders_query = tep_db_query("select o.orders_id, o.date_purchased, o.delivery_name, o.delivery_country, o.billing_name, o.billing_country, ot.text as order_total, s.orders_status_name from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_TOTAL . " ot, " . TABLE_ORDERS_STATUS . " s where o.customers_id = '" . (int)$customer_id . "' and o.orders_id = ot.orders_id and ot.class = 'ot_total' and o.orders_status = s.orders_status_id and s.language_id = '" . (int)$languages_id . "' and s.public_flag = '1' order by orders_id desc limit 3");
-    while ($orders = tep_db_fetch_array($orders_query)) {
-      if (tep_not_null($orders['delivery_name'])) {
-        $order_name = $orders['delivery_name'];
-        $order_country = $orders['delivery_country'];
-      } else {
-        $order_name = $orders['billing_name'];
-        $order_country = $orders['billing_country'];
-      }
-?>
-                  <tr class="moduleRow" onMouseOver="rowOverEffect(this)" onMouseOut="rowOutEffect(this)" onClick="document.location.href='<?php echo tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $orders['orders_id'], 'SSL'); ?>'">
-                    <td class="main" width="80"><?php echo tep_date_short($orders['date_purchased']); ?></td>
-                    <td class="main"><?php echo '#' . $orders['orders_id']; ?></td>
-                    <td class="main"><?php echo tep_output_string_protected($order_name) . ', ' . $order_country; ?></td>
-                    <td class="main"><?php echo $orders['orders_status_name']; ?></td>
-                    <td class="main" align="right"><?php echo $orders['order_total']; ?></td>
-                    <td class="main" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $orders['orders_id'], 'SSL') . '">' . tep_image_button('small_view.gif', SMALL_IMAGE_BUTTON_VIEW) . '</a>'; ?></td>
-                  </tr>
-<?php
-    }
 ?>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<div class="contentContainer">
+  <h2><?php echo MY_ACCOUNT_TITLE; ?></h2>
+
+  <div class="contentText">
+    <ul class="accountLinkList">
+      <li><span class="ui-icon ui-icon-person accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_EDIT, '', 'SSL') . '">' . MY_ACCOUNT_INFORMATION . '</a>'; ?></li>
+      <li><span class="ui-icon ui-icon-home accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL') . '">' . MY_ACCOUNT_ADDRESS_BOOK . '</a>'; ?></li>
+      <li><span class="ui-icon ui-icon-key accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_PASSWORD, '', 'SSL') . '">' . MY_ACCOUNT_PASSWORD . '</a>'; ?></li>
+    </ul>
+  </div>
+
+  <h2><?php echo MY_ORDERS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <ul class="accountLinkList">
+      <li><span class="ui-icon ui-icon-cart accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL') . '">' . MY_ORDERS_VIEW . '</a>'; ?></li>
+    </ul>
+  </div>
+
+  <h2><?php echo EMAIL_NOTIFICATIONS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <ul class="accountLinkList">
+      <li><span class="ui-icon ui-icon-mail-closed accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_NEWSLETTERS, '', 'SSL') . '">' . EMAIL_NOTIFICATIONS_NEWSLETTERS . '</a>'; ?></li>
+      <li><span class="ui-icon ui-icon-heart accountLinkListEntry"></span><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL') . '">' . EMAIL_NOTIFICATIONS_PRODUCTS . '</a>'; ?></li>
+    </ul>
+  </div>
+</div>
+
 <?php
-  }
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo MY_ACCOUNT_TITLE; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td width="60"><?php echo tep_image(DIR_WS_IMAGES . 'account_personal.gif'); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ACCOUNT_EDIT, '', 'SSL') . '">' . MY_ACCOUNT_INFORMATION . '</a>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL') . '">' . MY_ACCOUNT_ADDRESS_BOOK . '</a>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ACCOUNT_PASSWORD, '', 'SSL') . '">' . MY_ACCOUNT_PASSWORD . '</a>'; ?></td>
-                  </tr>
-                </table></td>
-                <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo MY_ORDERS_TITLE; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td width="60"><?php echo tep_image(DIR_WS_IMAGES . 'account_orders.gif'); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL') . '">' . MY_ORDERS_VIEW . '</a>'; ?></td>
-                  </tr>
-                </table></td>
-                <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo EMAIL_NOTIFICATIONS_TITLE; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td width="60"><?php echo tep_image(DIR_WS_IMAGES . 'account_notifications.gif'); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ACCOUNT_NEWSLETTERS, '', 'SSL') . '">' . EMAIL_NOTIFICATIONS_NEWSLETTERS . '</a>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo tep_image(DIR_WS_IMAGES . 'arrow_green.gif') . ' <a href="' . tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL') . '">' . EMAIL_NOTIFICATIONS_PRODUCTS . '</a>'; ?></td>
-                  </tr>
-                </table></td>
-                <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/address_book.php 2.3.1.src/address_book.php
--- 2.2rc2a.cp.src/address_book.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/address_book.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: address_book.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,170 +21,76 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function rowOverEffect(object) {
-  if (object.className == 'moduleRow') object.className = 'moduleRowOver';
-}
-
-function rowOutEffect(object) {
-  if (object.className == 'moduleRowOver') object.className = 'moduleRow';
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_address_book.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('addressbook') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('addressbook'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('addressbook');
   }
 ?>
-      <tr>
-        <td class="main"><b><?php echo PRIMARY_ADDRESS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo PRIMARY_ADDRESS_DESCRIPTION; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><b><?php echo PRIMARY_ADDRESS_TITLE; ?></b><br><?php echo tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $customer_default_address_id, true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo ADDRESS_BOOK_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+<div class="contentContainer">
+  <h2><?php echo PRIMARY_ADDRESS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style="float: right;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo PRIMARY_ADDRESS_TITLE; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo tep_address_label($customer_id, $customer_default_address_id, true, ' ', '<br />'); ?>
+      </div>
+    </div>
+
+    <?php echo PRIMARY_ADDRESS_DESCRIPTION; ?>
+  </div>
+
+  <div style="clear: both;"></div>
+
+  <h2><?php echo ADDRESS_BOOK_TITLE; ?></h2>
+
+  <div class="contentText">
+
 <?php
   $addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' order by firstname, lastname");
   while ($addresses = tep_db_fetch_array($addresses_query)) {
     $format_id = tep_get_address_format_id($addresses['country_id']);
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onClick="document.location.href='<?php echo tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit=' . $addresses['address_book_id'], 'SSL'); ?>'">
-                    <td class="main"><b><?php echo tep_output_string_protected($addresses['firstname'] . ' ' . $addresses['lastname']); ?></b><?php if ($addresses['address_book_id'] == $customer_default_address_id) echo '&nbsp;<small><i>' . PRIMARY_ADDRESS . '</i></small>'; ?></td>
-                    <td class="main" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit=' . $addresses['address_book_id'], 'SSL') . '">' . tep_image_button('small_edit.gif', SMALL_IMAGE_BUTTON_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete=' . $addresses['address_book_id'], 'SSL') . '">' . tep_image_button('small_delete.gif', SMALL_IMAGE_BUTTON_DELETE) . '</a>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><table border="0" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo tep_address_format($format_id, $addresses, true, ' ', '<br>'); ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+    <div>
+      <span style="float: right;"><?php echo tep_draw_button(SMALL_IMAGE_BUTTON_EDIT, 'document', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit=' . $addresses['address_book_id'], 'SSL')) . ' ' . tep_draw_button(SMALL_IMAGE_BUTTON_DELETE, 'trash', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete=' . $addresses['address_book_id'], 'SSL')); ?></span>
+      <p><strong><?php echo tep_output_string_protected($addresses['firstname'] . ' ' . $addresses['lastname']); ?></strong><?php if ($addresses['address_book_id'] == $customer_default_address_id) echo '&nbsp;<small><i>' . PRIMARY_ADDRESS . '</i></small>'; ?></p>
+      <p style="padding-left: 20px;"><?php echo tep_address_format($format_id, $addresses, true, ' ', '<br />'); ?></p>
+    </div>
+
 <?php
   }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
+
+  </div>
+
+  <div class="buttonSet">
+
 <?php
   if (tep_count_customer_address_book_entries() < MAX_ADDRESS_BOOK_ENTRIES) {
 ?>
-                <td class="smallText" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL') . '">' . tep_image_button('button_add_address.gif', IMAGE_BUTTON_ADD_ADDRESS) . '</a>'; ?></td>
+
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_ADD_ADDRESS, 'home', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL'), 'primary'); ?></span>
+
 <?php
   }
 ?>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="smallText"><?php echo sprintf(TEXT_MAXIMUM_ENTRIES, MAX_ADDRESS_BOOK_ENTRIES); ?></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ACCOUNT, '', 'SSL')); ?>
+  </div>
+
+  <p><?php echo sprintf(TEXT_MAXIMUM_ENTRIES, MAX_ADDRESS_BOOK_ENTRIES); ?></p>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/address_book_process.php 2.3.1.src/address_book_process.php
--- 2.2rc2a.cp.src/address_book_process.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/address_book_process.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: address_book_process.php 1766 2008-01-03 17:35:06Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,17 +20,21 @@
 // needs to be included earlier to set the success message in the messageStack
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ADDRESS_BOOK_PROCESS);
 
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'deleteconfirm') && isset($HTTP_GET_VARS['delete']) && is_numeric($HTTP_GET_VARS['delete'])) {
-    tep_db_query("delete from " . TABLE_ADDRESS_BOOK . " where address_book_id = '" . (int)$HTTP_GET_VARS['delete'] . "' and customers_id = '" . (int)$customer_id . "'");
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'deleteconfirm') && isset($HTTP_GET_VARS['delete']) && is_numeric($HTTP_GET_VARS['delete']) && isset($HTTP_GET_VARS['formid']) && ($HTTP_GET_VARS['formid'] == md5($sessiontoken))) {
+    if ((int)$HTTP_GET_VARS['delete'] == $customer_default_address_id) {
+      $messageStack->add_session('addressbook', WARNING_PRIMARY_ADDRESS_DELETION, 'warning');
+    } else {
+      tep_db_query("delete from " . TABLE_ADDRESS_BOOK . " where address_book_id = '" . (int)$HTTP_GET_VARS['delete'] . "' and customers_id = '" . (int)$customer_id . "'");
 
-    $messageStack->add_session('addressbook', SUCCESS_ADDRESS_BOOK_ENTRY_DELETED, 'success');
+      $messageStack->add_session('addressbook', SUCCESS_ADDRESS_BOOK_ENTRY_DELETED, 'success');
+    }
 
     tep_redirect(tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL'));
   }
 
 // error checking when updating or adding an entry
   $process = false;
-  if (isset($HTTP_POST_VARS['action']) && (($HTTP_POST_VARS['action'] == 'process') || ($HTTP_POST_VARS['action'] == 'update'))) {
+  if (isset($HTTP_POST_VARS['action']) && (($HTTP_POST_VARS['action'] == 'process') || ($HTTP_POST_VARS['action'] == 'update')) && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $process = true;
     $error = false;
 
@@ -242,126 +246,62 @@
   } else {
     $breadcrumb->add(NAVBAR_TITLE_ADD_ENTRY, tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL'));
   }
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if (!isset($HTTP_GET_VARS['delete'])) {
     include('includes/form_check.js.php');
   }
 ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php if (!isset($HTTP_GET_VARS['delete'])) echo tep_draw_form('addressbook', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, (isset($HTTP_GET_VARS['edit']) ? 'edit=' . $HTTP_GET_VARS['edit'] : ''), 'SSL'), 'post', 'onSubmit="return check_form(addressbook);"'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php if (isset($HTTP_GET_VARS['edit'])) { echo HEADING_TITLE_MODIFY_ENTRY; } elseif (isset($HTTP_GET_VARS['delete'])) { echo HEADING_TITLE_DELETE_ENTRY; } else { echo HEADING_TITLE_ADD_ENTRY; } ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_address_book.gif', (isset($HTTP_GET_VARS['edit']) ? HEADING_TITLE_MODIFY_ENTRY : HEADING_TITLE_ADD_ENTRY), HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php if (isset($HTTP_GET_VARS['edit'])) { echo HEADING_TITLE_MODIFY_ENTRY; } elseif (isset($HTTP_GET_VARS['delete'])) { echo HEADING_TITLE_DELETE_ENTRY; } else { echo HEADING_TITLE_ADD_ENTRY; } ?></h1>
+
 <?php
   if ($messageStack->size('addressbook') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('addressbook'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('addressbook');
   }
+?>
 
+<?php
   if (isset($HTTP_GET_VARS['delete'])) {
 ?>
-      <tr>
-        <td class="main"><b><?php echo DELETE_ADDRESS_TITLE; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo DELETE_ADDRESS_DESCRIPTION; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><b><?php echo SELECTED_ADDRESS; ?></b><br><?php echo tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $HTTP_GET_VARS['delete'], true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete=' . $HTTP_GET_VARS['delete'] . '&action=deleteconfirm', 'SSL') . '">' . tep_image_button('button_delete.gif', IMAGE_BUTTON_DELETE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+<div class="contentContainer">
+  <h2><?php echo DELETE_ADDRESS_TITLE; ?></h2>
+
+  <div class="contentText">
+    <p><?php echo DELETE_ADDRESS_DESCRIPTION; ?></p>
+
+    <p><?php echo tep_address_label($customer_id, $HTTP_GET_VARS['delete'], true, ' ', '<br />'); ?></p>
+  </div>
+
+  <div>
+    <span style="float: right;"><?php echo tep_draw_button(IMAGE_BUTTON_DELETE, 'trash', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete=' . $HTTP_GET_VARS['delete'] . '&action=deleteconfirm&formid=' . md5($sessiontoken), 'SSL'), 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL')); ?>
+  </div>
+</div>
+
 <?php
   } else {
 ?>
-      <tr>
-        <td><?php include(DIR_WS_MODULES . 'address_book_details.php'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<?php echo tep_draw_form('addressbook', tep_href_link(FILENAME_ADDRESS_BOOK_PROCESS, (isset($HTTP_GET_VARS['edit']) ? 'edit=' . $HTTP_GET_VARS['edit'] : ''), 'SSL'), 'post', 'onsubmit="return check_form(addressbook);"', true); ?>
+
+<div class="contentContainer">
+
+<?php include(DIR_WS_MODULES . 'address_book_details.php'); ?>
+
 <?php
     if (isset($HTTP_GET_VARS['edit']) && is_numeric($HTTP_GET_VARS['edit'])) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_draw_hidden_field('action', 'update') . tep_draw_hidden_field('edit', $HTTP_GET_VARS['edit']) . tep_image_submit('button_update.gif', IMAGE_BUTTON_UPDATE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <div>
+    <span style="float: right;"><?php echo tep_draw_hidden_field('action', 'update') . tep_draw_hidden_field('edit', $HTTP_GET_VARS['edit']) . tep_draw_button(IMAGE_BUTTON_UPDATE, 'refresh', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL')); ?>
+  </div>
+
 <?php
     } else {
       if (sizeof($navigation->snapshot) > 0) {
@@ -370,40 +310,26 @@
         $back_link = tep_href_link(FILENAME_ADDRESS_BOOK, '', 'SSL');
       }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . $back_link . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_draw_hidden_field('action', 'process') . tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_hidden_field('action', 'process') . tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', $back_link); ?>
+  </div>
 
 <?php
     }
+?>
+
+</div>
+
+</form>
+
+<?php
   }
 ?>
-    </table><?php if (!isset($HTTP_GET_VARS['delete'])) echo '</form>'; ?></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/action_recorder.php 2.3.1.src/admin/action_recorder.php
--- 2.2rc2a.cp.src/admin/action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,214 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  require('includes/application_top.php');
+
+  $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
+  $directory_array = array();
+  if ($dir = @dir(DIR_FS_CATALOG_MODULES . 'action_recorder/')) {
+    while ($file = $dir->read()) {
+      if (!is_dir(DIR_FS_CATALOG_MODULES . 'action_recorder/' . $file)) {
+        if (substr($file, strrpos($file, '.')) == $file_extension) {
+          $directory_array[] = $file;
+        }
+      }
+    }
+    sort($directory_array);
+    $dir->close();
+  }
+
+  for ($i=0, $n=sizeof($directory_array); $i<$n; $i++) {
+    $file = $directory_array[$i];
+
+    if (file_exists(DIR_FS_CATALOG_LANGUAGES . $language . '/modules/action_recorder/' . $file)) {
+      include(DIR_FS_CATALOG_LANGUAGES . $language . '/modules/action_recorder/' . $file);
+    }
+
+    include(DIR_FS_CATALOG_MODULES . 'action_recorder/' . $file);
+
+    $class = substr($file, 0, strrpos($file, '.'));
+    if (tep_class_exists($class)) {
+      ${$class} = new $class;
+    }
+  }
+
+  $modules_array = array();
+  $modules_list_array = array(array('id' => '', 'text' => TEXT_ALL_MODULES));
+
+  $modules_query = tep_db_query("select distinct module from " . TABLE_ACTION_RECORDER . " order by module");
+  while ($modules = tep_db_fetch_array($modules_query)) {
+    $modules_array[] = $modules['module'];
+
+    $modules_list_array[] = array('id' => $modules['module'],
+                                  'text' => (is_object(${$modules['module']}) ? ${$modules['module']}->title : $modules['module']));
+  }
+
+  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+
+  if (tep_not_null($action)) {
+    switch ($action) {
+      case 'expire':
+        $expired_entries = 0;
+
+        if (isset($HTTP_GET_VARS['module']) && in_array($HTTP_GET_VARS['module'], $modules_array)) {
+          if (is_object(${$HTTP_GET_VARS['module']})) {
+            $expired_entries += ${$HTTP_GET_VARS['module']}->expireEntries();
+          } else {
+            $delete_query = tep_db_query("delete from " . TABLE_ACTION_RECORDER . " where module = '" . tep_db_input($HTTP_GET_VARS['module']) . "'");
+            $expired_entries += mysql_affected_rows($db_link);
+          }
+        } else {
+          foreach ($modules_array as $module) {
+            if (is_object(${$module})) {
+              $expired_entries += ${$module}->expireEntries();
+            }
+          }
+        }
+
+        $messageStack->add_session(sprintf(SUCCESS_EXPIRED_ENTRIES, $expired_entries), 'success');
+
+        tep_redirect(tep_href_link(FILENAME_ACTION_RECORDER));
+
+        break;
+    }
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td><table border="0" width="100%" cellspacing="0" cellpadding="2" height="40">
+          <tr>
+            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
+            <td align="right"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+              <tr>
+                <td class="smallText" align="right">
+<?php
+  echo tep_draw_form('search', FILENAME_ACTION_RECORDER, '', 'get');
+  echo TEXT_FILTER_SEARCH . ' ' . tep_draw_input_field('search');
+  echo tep_draw_hidden_field('module') . tep_hide_session_id() . '</form>';
+?>
+                </td>
+              </tr>
+              <tr>
+                <td class="smallText" align="right">
+<?php
+  echo tep_draw_form('filter', FILENAME_ACTION_RECORDER, '', 'get');
+  echo tep_draw_pull_down_menu('module', $modules_list_array, null, 'onchange="this.form.submit();"');
+  echo tep_draw_hidden_field('search') . tep_hide_session_id() . '</form>';
+?>
+                </td>
+              </tr>
+            </table></td>
+            <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_ACTION_RECORDER, 'action=expire' . (isset($HTTP_GET_VARS['module']) && in_array($HTTP_GET_VARS['module'], $modules_array) ? '&module=' . $HTTP_GET_VARS['module'] : '')), 'primary'); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+              <tr class="dataTableHeadingRow">
+                <td class="dataTableHeadingContent" width="20">&nbsp;</td>
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_MODULE; ?></td>
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_CUSTOMER; ?></td>
+                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_DATE_ADDED; ?></td>
+                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
+              </tr>
+<?php
+  $filter = array();
+
+  if (isset($HTTP_GET_VARS['module']) && in_array($HTTP_GET_VARS['module'], $modules_array)) {
+    $filter[] = " module = '" . tep_db_input($HTTP_GET_VARS['module']) . "' ";
+  }
+
+  if (isset($HTTP_GET_VARS['search']) && !empty($HTTP_GET_VARS['search'])) {
+    $filter[] = " identifier like '%" . tep_db_input($HTTP_GET_VARS['search']) . "%' ";
+  }
+
+  $actions_query_raw = "select * from " . TABLE_ACTION_RECORDER . (!empty($filter) ? " where " . implode(" and ", $filter) : "") . " order by date_added desc";
+  $actions_split = new splitPageResults($HTTP_GET_VARS['page'], MAX_DISPLAY_SEARCH_RESULTS, $actions_query_raw, $actions_query_numrows);
+  $actions_query = tep_db_query($actions_query_raw);
+  while ($actions = tep_db_fetch_array($actions_query)) {
+    $module = $actions['module'];
+
+    $module_title = $actions['module'];
+    if (is_object(${$module})) {
+      $module_title = ${$module}->title;
+    }
+
+    if ((!isset($HTTP_GET_VARS['aID']) || (isset($HTTP_GET_VARS['aID']) && ($HTTP_GET_VARS['aID'] == $actions['id']))) && !isset($aInfo)) {
+      $actions_extra_query = tep_db_query("select identifier from " . TABLE_ACTION_RECORDER . " where id = '" . (int)$actions['id'] . "'");
+      $actions_extra = tep_db_fetch_array($actions_extra_query);
+
+      $aInfo_array = array_merge($actions, $actions_extra, array('module' => $module_title));
+      $aInfo = new objectInfo($aInfo_array);
+    }
+
+    if ( (isset($aInfo) && is_object($aInfo)) && ($actions['id'] == $aInfo->id) ) {
+      echo '                  <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' . "\n";
+    } else {
+      echo '                  <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_ACTION_RECORDER, 'aID=' . $actions['id']) . '\'">' . "\n";
+    }
+?>
+                <td class="dataTableContent" align="center"><?php echo tep_image(DIR_WS_IMAGES . 'icons/' . (($actions['success'] == '1') ? 'tick.gif' : 'cross.gif')); ?></td>
+                <td class="dataTableContent"><?php echo $module_title; ?></td>
+                <td class="dataTableContent"><?php echo tep_output_string_protected($actions['user_name']) . ' [' . (int)$actions['user_id'] . ']'; ?></td>
+                <td class="dataTableContent" align="right"><?php echo tep_datetime_short($actions['date_added']); ?></td>
+                <td class="dataTableContent" align="right"><?php if ( (isset($aInfo) && is_object($aInfo)) && ($actions['id'] == $aInfo->id) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif', ''); } else { echo '<a href="' . tep_href_link(FILENAME_ACTION_RECORDER, 'aID=' . $actions['id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
+              </tr>
+<?php
+  }
+?>
+              <tr>
+                <td colspan="5"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+                  <tr>
+                    <td class="smallText" valign="top"><?php echo $actions_split->display_count($actions_query_numrows, MAX_DISPLAY_SEARCH_RESULTS, $HTTP_GET_VARS['page'], TEXT_DISPLAY_NUMBER_OF_ENTRIES); ?></td>
+                    <td class="smallText" align="right"><?php echo $actions_split->display_links($actions_query_numrows, MAX_DISPLAY_SEARCH_RESULTS, MAX_DISPLAY_PAGE_LINKS, $HTTP_GET_VARS['page'], (isset($HTTP_GET_VARS['module']) && in_array($HTTP_GET_VARS['module'], $modules_array) && is_object(${$HTTP_GET_VARS['module']}) ? 'module=' . $HTTP_GET_VARS['module'] : null) . '&' . (isset($HTTP_GET_VARS['search']) && !empty($HTTP_GET_VARS['search']) ? 'search=' . $HTTP_GET_VARS['search'] : null)); ?></td>
+                  </tr>
+                </table></td>
+              </tr>
+            </table></td>
+<?php
+  $heading = array();
+  $contents = array();
+
+  switch ($action) {
+    default:
+      if (isset($aInfo) && is_object($aInfo)) {
+        $heading[] = array('text' => '<strong>' . $aInfo->module . '</strong>');
+
+        $contents[] = array('text' => TEXT_INFO_IDENTIFIER . '<br /><br />' . (!empty($aInfo->identifier) ? '<a href="' . tep_href_link(FILENAME_ACTION_RECORDER, 'search=' . $aInfo->identifier) . '"><u>' . tep_output_string_protected($aInfo->identifier) . '</u></a>': '(empty)'));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_datetime_short($aInfo->date_added));
+      }
+      break;
+  }
+
+  if ( (tep_not_null($heading)) && (tep_not_null($contents)) ) {
+    echo '            <td width="25%" valign="top">' . "\n";
+
+    $box = new box;
+    echo $box->infoBox($heading, $contents);
+
+    echo '            </td>' . "\n";
+  }
+?>
+          </tr>
+        </table></td>
+      </tr>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/administrators.php 2.3.1.src/admin/administrators.php
--- 2.2rc2a.cp.src/admin/administrators.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/administrators.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,17 +1,49 @@
 <?php
 /*
-  $Id: administrators.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
 
+  $htaccess_array = null;
+  $htpasswd_array = null;
+  $is_iis = stripos($HTTP_SERVER_VARS['SERVER_SOFTWARE'], 'iis');
+
+  $authuserfile_array = array('##### OSCOMMERCE ADMIN PROTECTION - BEGIN #####',
+                              'AuthType Basic',
+                              'AuthName "osCommerce Online Merchant Administration Tool"',
+                              'AuthUserFile ' . DIR_FS_ADMIN . '.htpasswd_oscommerce',
+                              'Require valid-user',
+                              '##### OSCOMMERCE ADMIN PROTECTION - END #####');
+
+  if (!$is_iis && file_exists(DIR_FS_ADMIN . '.htpasswd_oscommerce') && tep_is_writable(DIR_FS_ADMIN . '.htpasswd_oscommerce') && file_exists(DIR_FS_ADMIN . '.htaccess') && tep_is_writable(DIR_FS_ADMIN . '.htaccess')) {
+    $htaccess_array = array();
+    $htpasswd_array = array();
+
+    if (filesize(DIR_FS_ADMIN . '.htaccess') > 0) {
+      $fg = fopen(DIR_FS_ADMIN . '.htaccess', 'rb');
+      $data = fread($fg, filesize(DIR_FS_ADMIN . '.htaccess'));
+      fclose($fg);
+
+      $htaccess_array = explode("\n", $data);
+    }
+
+    if (filesize(DIR_FS_ADMIN . '.htpasswd_oscommerce') > 0) {
+      $fg = fopen(DIR_FS_ADMIN . '.htpasswd_oscommerce', 'rb');
+      $data = fread($fg, filesize(DIR_FS_ADMIN . '.htpasswd_oscommerce'));
+      fclose($fg);
+
+      $htpasswd_array = explode("\n", $data);
+    }
+  }
+
   $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
 
   if (tep_not_null($action)) {
@@ -26,6 +58,38 @@
 
         if (tep_db_num_rows($check_query) < 1) {
           tep_db_query("insert into " . TABLE_ADMINISTRATORS . " (user_name, user_password) values ('" . tep_db_input($username) . "', '" . tep_db_input(tep_encrypt_password($password)) . "')");
+
+          if (is_array($htpasswd_array)) {
+            for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+              list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+              if ($ht_username == $username) {
+                unset($htpasswd_array[$i]);
+              }
+            }
+
+            if (isset($HTTP_POST_VARS['htaccess']) && ($HTTP_POST_VARS['htaccess'] == 'true')) {
+              $htpasswd_array[] = $username . ':' . tep_crypt_apr_md5($password);
+            }
+
+            $fp = fopen(DIR_FS_ADMIN . '.htpasswd_oscommerce', 'w');
+            fwrite($fp, implode("\n", $htpasswd_array));
+            fclose($fp);
+
+            if (!in_array('AuthUserFile ' . DIR_FS_ADMIN . '.htpasswd_oscommerce', $htaccess_array) && !empty($htpasswd_array)) {
+              array_splice($htaccess_array, sizeof($htaccess_array), 0, $authuserfile_array);
+            } elseif (empty($htpasswd_array)) {
+              for ($i=0, $n=sizeof($htaccess_array); $i<$n; $i++) {
+                if (in_array($htaccess_array[$i], $authuserfile_array)) {
+                  unset($htaccess_array[$i]);
+                }
+              }
+            }
+
+            $fp = fopen(DIR_FS_ADMIN . '.htaccess', 'w');
+            fwrite($fp, implode("\n", $htaccess_array));
+            fclose($fp);
+          }
         } else {
           $messageStack->add_session(ERROR_ADMINISTRATOR_EXISTS, 'error');
         }
@@ -38,17 +102,75 @@
         $username = tep_db_prepare_input($HTTP_POST_VARS['username']);
         $password = tep_db_prepare_input($HTTP_POST_VARS['password']);
 
-        $check_query = tep_db_query("select id from " . TABLE_ADMINISTRATORS . " where user_name = '" . tep_db_input($admin['username']) . "'");
+        $check_query = tep_db_query("select id, user_name from " . TABLE_ADMINISTRATORS . " where id = '" . (int)$HTTP_GET_VARS['aID'] . "'");
         $check = tep_db_fetch_array($check_query);
 
-        if ($admin['id'] == $check['id']) {
+// update username in current session if changed
+        if ( ($check['id'] == $admin['id']) && ($check['user_name'] != $admin['username']) ) {
           $admin['username'] = $username;
         }
 
+// update username in htpasswd if changed
+        if (is_array($htpasswd_array)) {
+          for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+            list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+            if ( ($check['user_name'] == $ht_username) && ($check['user_name'] != $username) ) {
+              $htpasswd_array[$i] = $username . ':' . $ht_password;
+            }
+          }
+        }
+
         tep_db_query("update " . TABLE_ADMINISTRATORS . " set user_name = '" . tep_db_input($username) . "' where id = '" . (int)$HTTP_GET_VARS['aID'] . "'");
 
         if (tep_not_null($password)) {
+// update password in htpasswd
+          if (is_array($htpasswd_array)) {
+            for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+              list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+              if ($ht_username == $username) {
+                unset($htpasswd_array[$i]);
+              }
+            }
+
+            if (isset($HTTP_POST_VARS['htaccess']) && ($HTTP_POST_VARS['htaccess'] == 'true')) {
+              $htpasswd_array[] = $username . ':' . tep_crypt_apr_md5($password);
+            }
+          }
+
           tep_db_query("update " . TABLE_ADMINISTRATORS . " set user_password = '" . tep_db_input(tep_encrypt_password($password)) . "' where id = '" . (int)$HTTP_GET_VARS['aID'] . "'");
+        } elseif (!isset($HTTP_POST_VARS['htaccess']) || ($HTTP_POST_VARS['htaccess'] != 'true')) {
+          if (is_array($htpasswd_array)) {
+            for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+              list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+              if ($ht_username == $username) {
+                unset($htpasswd_array[$i]);
+              }
+            }
+          }
+        }
+
+// write new htpasswd file
+        if (is_array($htpasswd_array)) {
+          $fp = fopen(DIR_FS_ADMIN . '.htpasswd_oscommerce', 'w');
+          fwrite($fp, implode("\n", $htpasswd_array));
+          fclose($fp);
+
+          if (!in_array('AuthUserFile ' . DIR_FS_ADMIN . '.htpasswd_oscommerce', $htaccess_array) && !empty($htpasswd_array)) {
+            array_splice($htaccess_array, sizeof($htaccess_array), 0, $authuserfile_array);
+          } elseif (empty($htpasswd_array)) {
+            for ($i=0, $n=sizeof($htaccess_array); $i<$n; $i++) {
+              if (in_array($htaccess_array[$i], $authuserfile_array)) {
+                unset($htaccess_array[$i]);
+              }
+            }
+          }
+
+          $fp = fopen(DIR_FS_ADMIN . '.htaccess', 'w');
+          fwrite($fp, implode("\n", $htaccess_array));
+          fclose($fp);
         }
 
         tep_redirect(tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . (int)$HTTP_GET_VARS['aID']));
@@ -56,43 +178,62 @@
       case 'deleteconfirm':
         $id = tep_db_prepare_input($HTTP_GET_VARS['aID']);
 
-        $check_query = tep_db_query("select id from " . TABLE_ADMINISTRATORS . " where user_name = '" . tep_db_input($admin['username']) . "'");
+        $check_query = tep_db_query("select id, user_name from " . TABLE_ADMINISTRATORS . " where id = '" . (int)$id . "'");
         $check = tep_db_fetch_array($check_query);
 
-        if ($id == $check['id']) {
+        if ($admin['id'] == $check['id']) {
           tep_session_unregister('admin');
         }
 
         tep_db_query("delete from " . TABLE_ADMINISTRATORS . " where id = '" . (int)$id . "'");
 
+        if (is_array($htpasswd_array)) {
+          for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+            list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+            if ($ht_username == $check['user_name']) {
+              unset($htpasswd_array[$i]);
+            }
+          }
+
+          $fp = fopen(DIR_FS_ADMIN . '.htpasswd_oscommerce', 'w');
+          fwrite($fp, implode("\n", $htpasswd_array));
+          fclose($fp);
+
+          if (empty($htpasswd_array)) {
+            for ($i=0, $n=sizeof($htaccess_array); $i<$n; $i++) {
+              if (in_array($htaccess_array[$i], $authuserfile_array)) {
+                unset($htaccess_array[$i]);
+              }
+            }
+
+            $fp = fopen(DIR_FS_ADMIN . '.htaccess', 'w');
+            fwrite($fp, implode("\n", $htaccess_array));
+            fclose($fp);
+          }
+        }
+
         tep_redirect(tep_href_link(FILENAME_ADMINISTRATORS));
         break;
     }
   }
+
+  $secMessageStack = new messageStack();
+
+  if (is_array($htpasswd_array)) {
+    if (empty($htpasswd_array)) {
+      $secMessageStack->add(sprintf(HTPASSWD_INFO, implode('<br />', $authuserfile_array)), 'error');
+    } else {
+      $secMessageStack->add(HTPASSWD_SECURED, 'success');
+    }
+  } else if (!$is_iis) {
+    $secMessageStack->add(HTPASSWD_PERMISSIONS, 'error');
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -102,11 +243,19 @@
         </table></td>
       </tr>
       <tr>
+        <td>
+<?php
+  echo $secMessageStack->output();
+?>
+        </td>
+      </tr>
+      <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
             <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
               <tr class="dataTableHeadingRow">
                 <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_ADMINISTRATORS; ?></td>
+                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_HTPASSWD; ?></td>
                 <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
               </tr>
 <?php
@@ -116,6 +265,24 @@
       $aInfo = new objectInfo($admins);
     }
 
+
+    $htpasswd_secured = tep_image(DIR_WS_IMAGES . 'icon_status_red.gif', 'Not Secured', 10, 10);
+
+    if ($is_iis) {
+      $htpasswd_secured = 'N/A';
+    }
+
+    if (is_array($htpasswd_array)) {
+      for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+        list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+        if ($ht_username == $admins['user_name']) {
+          $htpasswd_secured = tep_image(DIR_WS_IMAGES . 'icon_status_green.gif', 'Secured', 10, 10);
+          break;
+        }
+      }
+    }
+
     if ( (isset($aInfo) && is_object($aInfo)) && ($admins['id'] == $aInfo->id) ) {
       echo '                  <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=edit') . '\'">' . "\n";
     } else {
@@ -123,13 +290,14 @@
     }
 ?>
                 <td class="dataTableContent"><?php echo $admins['user_name']; ?></td>
+                <td class="dataTableContent" align="center"><?php echo $htpasswd_secured; ?></td>
                 <td class="dataTableContent" align="right"><?php if ( (isset($aInfo) && is_object($aInfo)) && ($admins['id'] == $aInfo->id) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif', ''); } else { echo '<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $admins['id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
               </tr>
 <?php
   }
 ?>
               <tr>
-                <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'action=new') . '">' . tep_image_button('button_insert.gif', IMAGE_INSERT) . '</a>'; ?></td>
+                <td class="smallText" colspan="3" align="right"><?php echo tep_draw_button(IMAGE_INSERT, 'plus', tep_href_link(FILENAME_ADMINISTRATORS, 'action=new')); ?></td>
               </tr>
             </table></td>
 <?php
@@ -138,36 +306,57 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_ADMINISTRATOR . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_ADMINISTRATOR . '</strong>');
 
-      $contents = array('form' => tep_draw_form('administrator', FILENAME_ADMINISTRATORS, 'action=insert'));
+      $contents = array('form' => tep_draw_form('administrator', FILENAME_ADMINISTRATORS, 'action=insert', 'post', 'autocomplete="off"'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_USERNAME . '<br>' . tep_draw_input_field('username'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_PASSWORD . '<br>' . tep_draw_password_field('password'));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_save.gif', IMAGE_SAVE) . '&nbsp;<a href="' . tep_href_link(FILENAME_ADMINISTRATORS) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_USERNAME . '<br />' . tep_draw_input_field('username'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_PASSWORD . '<br />' . tep_draw_password_field('password'));
+
+      if (is_array($htpasswd_array)) {
+        $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('htaccess', 'true') . ' ' . TEXT_INFO_PROTECT_WITH_HTPASSWD);
+      }
+
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ADMINISTRATORS)));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . $aInfo->user_name . '</b>');
+      $heading[] = array('text' => '<strong>' . $aInfo->user_name . '</strong>');
 
-      $contents = array('form' => tep_draw_form('administrator', FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=save'));
+      $contents = array('form' => tep_draw_form('administrator', FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=save', 'post', 'autocomplete="off"'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_USERNAME . '<br>' . tep_draw_input_field('username', $aInfo->user_name));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_NEW_PASSWORD . '<br>' . tep_draw_password_field('password'));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_USERNAME . '<br />' . tep_draw_input_field('username', $aInfo->user_name));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_NEW_PASSWORD . '<br />' . tep_draw_password_field('password'));
+
+      if (is_array($htpasswd_array)) {
+        $default_flag = false;
+
+        for ($i=0, $n=sizeof($htpasswd_array); $i<$n; $i++) {
+          list($ht_username, $ht_password) = explode(':', $htpasswd_array[$i], 2);
+
+          if ($ht_username == $aInfo->user_name) {
+            $default_flag = true;
+            break;
+          }
+        }
+
+        $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('htaccess', 'true', $default_flag) . ' ' . TEXT_INFO_PROTECT_WITH_HTPASSWD);
+      }
+
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . $aInfo->user_name . '</b>');
+      $heading[] = array('text' => '<strong>' . $aInfo->user_name . '</strong>');
 
       $contents = array('form' => tep_draw_form('administrator', FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $aInfo->user_name . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $aInfo->user_name . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id)));
       break;
     default:
       if (isset($aInfo) && is_object($aInfo)) {
-        $heading[] = array('text' => '<b>' . $aInfo->user_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $aInfo->user_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_ADMINISTRATORS, 'aID=' . $aInfo->id . '&action=delete')));
       }
       break;
   }
@@ -184,16 +373,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/backup.php 2.3.1.src/admin/backup.php
--- 2.2rc2a.cp.src/admin/backup.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/backup.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: backup.php 1821 2008-01-15 09:58:55Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -63,7 +63,7 @@
             $schema .= ',' . "\n";
           }
 
-          $schema = ereg_replace(",\n$", '', $schema);
+          $schema = preg_replace("/,\n$/", '', $schema);
 
 // add the keys
           $index = array();
@@ -111,7 +111,7 @@
                   $schema .= 'NULL, ';
                 } elseif (tep_not_null($rows[$i])) {
                   $row = addslashes($rows[$i]);
-                  $row = ereg_replace("\n#", "\n".'\#', $row);
+                  $row = preg_replace("/\n#/", "\n".'\#', $row);
 
                   $schema .= '\'' . $row . '\', ';
                 } else {
@@ -119,7 +119,7 @@
                 }
               }
 
-              $schema = ereg_replace(', $', '', $schema) . ');' . "\n";
+              $schema = preg_replace('/, $/', '', $schema) . ');' . "\n";
               fputs($fp, $schema);
             }
           }
@@ -239,7 +239,7 @@
               if ($next == '') { // get the last insert query
                 $next = 'insert';
               }
-              if ( (eregi('create', $next)) || (eregi('insert', $next)) || (eregi('drop t', $next)) ) {
+              if ( (preg_match('/create/i', $next)) || (preg_match('/insert/i', $next)) || (preg_match('/drop t/i', $next)) ) {
                 $query = substr($restore_query, 0, $i);
 
                 $next = '';
@@ -248,7 +248,7 @@
                 $sql_length = strlen($restore_query);
                 $i = strpos($restore_query, ';')-1;
 
-                if (eregi('^create*', $query)) {
+                if (preg_match('/^create*/i', $query)) {
                   $table_name = trim(substr($query, stripos($query, 'table ')+6));
                   $table_name = substr($table_name, 0, strpos($table_name, ' '));
 
@@ -317,7 +317,7 @@
 // check if the backup directory exists
   $dir_ok = false;
   if (is_dir(DIR_FS_BACKUP)) {
-    if (is_writeable(DIR_FS_BACKUP)) {
+    if (tep_is_writable(DIR_FS_BACKUP)) {
       $dir_ok = true;
     } else {
       $messageStack->add(ERROR_BACKUP_DIRECTORY_NOT_WRITEABLE, 'error');
@@ -325,30 +325,11 @@
   } else {
     $messageStack->add(ERROR_BACKUP_DIRECTORY_DOES_NOT_EXIST, 'error');
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -416,7 +397,7 @@
 ?>
               <tr>
                 <td class="smallText" colspan="3"><?php echo TEXT_BACKUP_DIRECTORY . ' ' . DIR_FS_BACKUP; ?></td>
-                <td align="right" class="smallText"><?php if ( ($action != 'backup') && (isset($dir)) ) echo '<a href="' . tep_href_link(FILENAME_BACKUP, 'action=backup') . '">' . tep_image_button('button_backup.gif', IMAGE_BACKUP) . '</a>'; if ( ($action != 'restorelocal') && isset($dir) ) echo '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_BACKUP, 'action=restorelocal') . '">' . tep_image_button('button_restore.gif', IMAGE_RESTORE) . '</a>'; ?></td>
+                <td align="right" class="smallText"><?php if ( ($action != 'backup') && (isset($dir)) ) echo tep_draw_button(IMAGE_BACKUP, 'copy', tep_href_link(FILENAME_BACKUP, 'action=backup')); if ( ($action != 'restorelocal') && isset($dir) ) echo tep_draw_button(IMAGE_RESTORE, 'arrowrefresh-1-w', tep_href_link(FILENAME_BACKUP, 'action=restorelocal')); ?></td>
               </tr>
 <?php
   if (defined('DB_LAST_RESTORE')) {
@@ -434,54 +415,54 @@
 
   switch ($action) {
     case 'backup':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_BACKUP . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_BACKUP . '</strong>');
 
       $contents = array('form' => tep_draw_form('backup', FILENAME_BACKUP, 'action=backupnow'));
       $contents[] = array('text' => TEXT_INFO_NEW_BACKUP);
 
-      $contents[] = array('text' => '<br>' . tep_draw_radio_field('compress', 'no', true) . ' ' . TEXT_INFO_USE_NO_COMPRESSION);
-      if (file_exists(LOCAL_EXE_GZIP)) $contents[] = array('text' => '<br>' . tep_draw_radio_field('compress', 'gzip') . ' ' . TEXT_INFO_USE_GZIP);
+      $contents[] = array('text' => '<br />' . tep_draw_radio_field('compress', 'no', true) . ' ' . TEXT_INFO_USE_NO_COMPRESSION);
+      if (file_exists(LOCAL_EXE_GZIP)) $contents[] = array('text' => '<br />' . tep_draw_radio_field('compress', 'gzip') . ' ' . TEXT_INFO_USE_GZIP);
       if (file_exists(LOCAL_EXE_ZIP)) $contents[] = array('text' => tep_draw_radio_field('compress', 'zip') . ' ' . TEXT_INFO_USE_ZIP);
 
       if ($dir_ok == true) {
-        $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('download', 'yes') . ' ' . TEXT_INFO_DOWNLOAD_ONLY . '*<br><br>*' . TEXT_INFO_BEST_THROUGH_HTTPS);
+        $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('download', 'yes') . ' ' . TEXT_INFO_DOWNLOAD_ONLY . '*<br /><br />*' . TEXT_INFO_BEST_THROUGH_HTTPS);
       } else {
-        $contents[] = array('text' => '<br>' . tep_draw_radio_field('download', 'yes', true) . ' ' . TEXT_INFO_DOWNLOAD_ONLY . '*<br><br>*' . TEXT_INFO_BEST_THROUGH_HTTPS);
+        $contents[] = array('text' => '<br />' . tep_draw_radio_field('download', 'yes', true) . ' ' . TEXT_INFO_DOWNLOAD_ONLY . '*<br /><br />*' . TEXT_INFO_BEST_THROUGH_HTTPS);
       }
 
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_backup.gif', IMAGE_BACKUP) . '&nbsp;<a href="' . tep_href_link(FILENAME_BACKUP) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_BACKUP, 'copy', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BACKUP)));
       break;
     case 'restore':
-      $heading[] = array('text' => '<b>' . $buInfo->date . '</b>');
+      $heading[] = array('text' => '<strong>' . $buInfo->date . '</strong>');
 
       $contents[] = array('text' => tep_break_string(sprintf(TEXT_INFO_RESTORE, DIR_FS_BACKUP . (($buInfo->compression != TEXT_NO_EXTENSION) ? substr($buInfo->file, 0, strrpos($buInfo->file, '.')) : $buInfo->file), ($buInfo->compression != TEXT_NO_EXTENSION) ? TEXT_INFO_UNPACK : ''), 35, ' '));
-      $contents[] = array('align' => 'center', 'text' => '<br><a href="' . tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=restorenow') . '">' . tep_image_button('button_restore.gif', IMAGE_RESTORE) . '</a>&nbsp;<a href="' . tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_RESTORE, 'arrowrefresh-1-w', tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=restorenow'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file)));
       break;
     case 'restorelocal':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_RESTORE_LOCAL . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_RESTORE_LOCAL . '</strong>');
 
       $contents = array('form' => tep_draw_form('restore', FILENAME_BACKUP, 'action=restorelocalnow', 'post', 'enctype="multipart/form-data"'));
-      $contents[] = array('text' => TEXT_INFO_RESTORE_LOCAL . '<br><br>' . TEXT_INFO_BEST_THROUGH_HTTPS);
-      $contents[] = array('text' => '<br>' . tep_draw_file_field('sql_file'));
+      $contents[] = array('text' => TEXT_INFO_RESTORE_LOCAL . '<br /><br />' . TEXT_INFO_BEST_THROUGH_HTTPS);
+      $contents[] = array('text' => '<br />' . tep_draw_file_field('sql_file'));
       $contents[] = array('text' => TEXT_INFO_RESTORE_LOCAL_RAW_FILE);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_restore.gif', IMAGE_RESTORE) . '&nbsp;<a href="' . tep_href_link(FILENAME_BACKUP) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_RESTORE, 'arrowrefresh-1-w', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BACKUP)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . $buInfo->date . '</b>');
+      $heading[] = array('text' => '<strong>' . $buInfo->date . '</strong>');
 
       $contents = array('form' => tep_draw_form('delete', FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $buInfo->file . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $buInfo->file . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file)));
       break;
     default:
       if (isset($buInfo) && is_object($buInfo)) {
-        $heading[] = array('text' => '<b>' . $buInfo->date . '</b>');
+        $heading[] = array('text' => '<strong>' . $buInfo->date . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=restore') . '">' . tep_image_button('button_restore.gif', IMAGE_RESTORE) . '</a> <a href="' . tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE . ' ' . $buInfo->date);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_RESTORE, 'arrowrefresh-1-w', tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=restore')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_BACKUP, 'file=' . $buInfo->file . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE . ' ' . $buInfo->date);
         $contents[] = array('text' => TEXT_INFO_SIZE . ' ' . $buInfo->size);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COMPRESSION . ' ' . $buInfo->compression);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COMPRESSION . ' ' . $buInfo->compression);
       }
       break;
   }
@@ -498,16 +479,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/backups/.htaccess 2.3.1.src/admin/backups/.htaccess
--- 2.2rc2a.cp.src/admin/backups/.htaccess	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/backups/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -1,4 +1,4 @@
-# $Id: .htaccess 1821 2008-01-15 09:58:55Z hpdl $
+# $Id$
 #
 # This is used with Apache WebServers
 # The following blocks direct HTTP requests in this directory recursively
diff -x .svn -aruN 2.2rc2a.cp.src/admin/banner_manager.php 2.3.1.src/admin/banner_manager.php
--- 2.2rc2a.cp.src/admin/banner_manager.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/banner_manager.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: banner_manager.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -71,7 +71,10 @@
                                   'banners_url' => $banners_url,
                                   'banners_image' => $db_image_location,
                                   'banners_group' => $banners_group,
-                                  'banners_html_text' => $banners_html_text);
+                                  'banners_html_text' => $banners_html_text,
+                                  'expires_date' => 'null',
+                                  'expires_impressions' => 0,
+                                  'date_scheduled' => 'null');
 
           if ($action == 'insert') {
             $insert_sql_data = array('date_added' => 'now()',
@@ -91,11 +94,7 @@
           }
 
           if (tep_not_null($expires_date)) {
-            list($day, $month, $year) = explode('/', $expires_date);
-
-            $expires_date = $year .
-                            ((strlen($month) == 1) ? '0' . $month : $month) .
-                            ((strlen($day) == 1) ? '0' . $day : $day);
+            $expires_date = substr($expires_date, 0, 4) . substr($expires_date, 5, 2) . substr($expires_date, 8, 2);
 
             tep_db_query("update " . TABLE_BANNERS . " set expires_date = '" . tep_db_input($expires_date) . "', expires_impressions = null where banners_id = '" . (int)$banners_id . "'");
           } elseif (tep_not_null($expires_impressions)) {
@@ -103,11 +102,7 @@
           }
 
           if (tep_not_null($date_scheduled)) {
-            list($day, $month, $year) = explode('/', $date_scheduled);
-
-            $date_scheduled = $year .
-                              ((strlen($month) == 1) ? '0' . $month : $month) .
-                              ((strlen($day) == 1) ? '0' . $day : $day);
+            $date_scheduled = substr($date_scheduled, 0, 4) . substr($date_scheduled, 5, 2) . substr($date_scheduled, 8, 2);
 
             tep_db_query("update " . TABLE_BANNERS . " set status = '0', date_scheduled = '" . tep_db_input($date_scheduled) . "' where banners_id = '" . (int)$banners_id . "'");
           }
@@ -125,7 +120,7 @@
           $banner = tep_db_fetch_array($banner_query);
 
           if (is_file(DIR_FS_CATALOG_IMAGES . $banner['banners_image'])) {
-            if (is_writeable(DIR_FS_CATALOG_IMAGES . $banner['banners_image'])) {
+            if (tep_is_writable(DIR_FS_CATALOG_IMAGES . $banner['banners_image'])) {
               unlink(DIR_FS_CATALOG_IMAGES . $banner['banners_image']);
             } else {
               $messageStack->add_session(ERROR_IMAGE_IS_NOT_WRITEABLE, 'error');
@@ -140,25 +135,25 @@
 
         if (function_exists('imagecreate') && tep_not_null($banner_extensio)) {
           if (is_file(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banners_id . '.' . $banner_extension)) {
-            if (is_writeable(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banners_id . '.' . $banner_extension)) {
+            if (tep_is_writable(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banners_id . '.' . $banner_extension)) {
               unlink(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banners_id . '.' . $banner_extension);
             }
           }
 
           if (is_file(DIR_WS_IMAGES . 'graphs/banner_yearly-' . $banners_id . '.' . $banner_extension)) {
-            if (is_writeable(DIR_WS_IMAGES . 'graphs/banner_yearly-' . $banners_id . '.' . $banner_extension)) {
+            if (tep_is_writable(DIR_WS_IMAGES . 'graphs/banner_yearly-' . $banners_id . '.' . $banner_extension)) {
               unlink(DIR_WS_IMAGES . 'graphs/banner_yearly-' . $banners_id . '.' . $banner_extension);
             }
           }
 
           if (is_file(DIR_WS_IMAGES . 'graphs/banner_monthly-' . $banners_id . '.' . $banner_extension)) {
-            if (is_writeable(DIR_WS_IMAGES . 'graphs/banner_monthly-' . $banners_id . '.' . $banner_extension)) {
+            if (tep_is_writable(DIR_WS_IMAGES . 'graphs/banner_monthly-' . $banners_id . '.' . $banner_extension)) {
               unlink(DIR_WS_IMAGES . 'graphs/banner_monthly-' . $banners_id . '.' . $banner_extension);
             }
           }
 
           if (is_file(DIR_WS_IMAGES . 'graphs/banner_daily-' . $banners_id . '.' . $banner_extension)) {
-            if (is_writeable(DIR_WS_IMAGES . 'graphs/banner_daily-' . $banners_id . '.' . $banner_extension)) {
+            if (tep_is_writable(DIR_WS_IMAGES . 'graphs/banner_daily-' . $banners_id . '.' . $banner_extension)) {
               unlink(DIR_WS_IMAGES . 'graphs/banner_daily-' . $banners_id . '.' . $banner_extension);
             }
           }
@@ -175,7 +170,7 @@
   $dir_ok = false;
   if (function_exists('imagecreate') && tep_not_null($banner_extension)) {
     if (is_dir(DIR_WS_IMAGES . 'graphs')) {
-      if (is_writeable(DIR_WS_IMAGES . 'graphs')) {
+      if (tep_is_writable(DIR_WS_IMAGES . 'graphs')) {
         $dir_ok = true;
       } else {
         $messageStack->add(ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE, 'error');
@@ -184,36 +179,17 @@
       $messageStack->add(ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST, 'error');
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 function popupImageWindow(url) {
   window.open(url,'popupImageWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
 }
 //--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<div id="spiffycalendar" class="text"></div>
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -242,7 +218,7 @@
 
       $bID = tep_db_prepare_input($HTTP_GET_VARS['bID']);
 
-      $banner_query = tep_db_query("select banners_title, banners_url, banners_image, banners_group, banners_html_text, status, date_format(date_scheduled, '%d/%m/%Y') as date_scheduled, date_format(expires_date, '%d/%m/%Y') as expires_date, expires_impressions, date_status_change from " . TABLE_BANNERS . " where banners_id = '" . (int)$bID . "'");
+      $banner_query = tep_db_query("select banners_title, banners_url, banners_image, banners_group, banners_html_text, status, date_format(date_scheduled, '%Y/%m/%d') as date_scheduled, date_format(expires_date, '%Y/%m/%d') as expires_date, expires_impressions, date_status_change from " . TABLE_BANNERS . " where banners_id = '" . (int)$bID . "'");
       $banner = tep_db_fetch_array($banner_query);
 
       $bInfo->objectInfo($banner);
@@ -256,12 +232,6 @@
       $groups_array[] = array('id' => $groups['banners_group'], 'text' => $groups['banners_group']);
     }
 ?>
-<link rel="stylesheet" type="text/css" href="includes/javascript/spiffyCal/spiffyCal_v2_1.css">
-<script language="JavaScript" src="includes/javascript/spiffyCal/spiffyCal_v2_1.js"></script>
-<script language="javascript">
-  var dateExpires = new ctlSpiffyCalendarBox("dateExpires", "new_banner", "expires_date","btnDate1","<?php echo $bInfo->expires_date; ?>",scBTNMODE_CUSTOMBLUE);
-  var dateScheduled = new ctlSpiffyCalendarBox("dateScheduled", "new_banner", "date_scheduled","btnDate2","<?php echo $bInfo->date_scheduled; ?>",scBTNMODE_CUSTOMBLUE);
-</script>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
@@ -277,14 +247,14 @@
           </tr>
           <tr>
             <td class="main" valign="top"><?php echo TEXT_BANNERS_GROUP; ?></td>
-            <td class="main"><?php echo tep_draw_pull_down_menu('banners_group', $groups_array, $bInfo->banners_group) . TEXT_BANNERS_NEW_GROUP . '<br>' . tep_draw_input_field('new_banners_group', '', '', ((sizeof($groups_array) > 0) ? false : true)); ?></td>
+            <td class="main"><?php echo tep_draw_pull_down_menu('banners_group', $groups_array, $bInfo->banners_group) . TEXT_BANNERS_NEW_GROUP . '<br />' . tep_draw_input_field('new_banners_group', '', '', ((sizeof($groups_array) > 0) ? false : true)); ?></td>
           </tr>
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
             <td class="main" valign="top"><?php echo TEXT_BANNERS_IMAGE; ?></td>
-            <td class="main"><?php echo tep_draw_file_field('banners_image') . ' ' . TEXT_BANNERS_IMAGE_LOCAL . '<br>' . DIR_FS_CATALOG_IMAGES . tep_draw_input_field('banners_image_local', (isset($bInfo->banners_image) ? $bInfo->banners_image : '')); ?></td>
+            <td class="main"><?php echo tep_draw_file_field('banners_image') . ' ' . TEXT_BANNERS_IMAGE_LOCAL . '<br />' . DIR_FS_CATALOG_IMAGES . tep_draw_input_field('banners_image_local', (isset($bInfo->banners_image) ? $bInfo->banners_image : '')); ?></td>
           </tr>
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
@@ -304,17 +274,28 @@
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
-            <td class="main"><?php echo TEXT_BANNERS_SCHEDULED_AT; ?><br><small>(dd/mm/yyyy)</small></td>
-            <td valign="top" class="main"><script language="javascript">dateScheduled.writeControl(); dateScheduled.dateFormat="dd/MM/yyyy";</script></td>
+            <td class="main"><?php echo TEXT_BANNERS_SCHEDULED_AT; ?></td>
+            <td class="main"><?php echo tep_draw_input_field('date_scheduled', $bInfo->date_scheduled, 'id="date_scheduled"') . ' <small>(YYYY-MM-DD)</small>'; ?></td>
           </tr>
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
-            <td valign="top" class="main"><?php echo TEXT_BANNERS_EXPIRES_ON; ?><br><small>(dd/mm/yyyy)</small></td>
-            <td class="main"><script language="javascript">dateExpires.writeControl(); dateExpires.dateFormat="dd/MM/yyyy";</script><?php echo TEXT_BANNERS_OR_AT . '<br>' . tep_draw_input_field('expires_impressions', $bInfo->expires_impressions, 'maxlength="7" size="7"') . ' ' . TEXT_BANNERS_IMPRESSIONS; ?></td>
+            <td valign="top" class="main"><?php echo TEXT_BANNERS_EXPIRES_ON; ?></td>
+            <td class="main"><?php echo tep_draw_input_field('expires_date', $bInfo->expires_date, 'id="expires_date"') . ' <small>(YYYY-MM-DD)</small>' . TEXT_BANNERS_OR_AT . '<br />' . tep_draw_input_field('expires_impressions', $bInfo->expires_impressions, 'maxlength="7" size="7"') . ' ' . TEXT_BANNERS_IMPRESSIONS; ?></td>
           </tr>
-        </table></td>
+        </table>
+
+<script type="text/javascript">
+$('#date_scheduled').datepicker({
+  dateFormat: 'yy-mm-dd'
+});
+$('#expires_date').datepicker({
+  dateFormat: 'yy-mm-dd'
+});
+</script>
+
+        </td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
@@ -322,8 +303,8 @@
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><?php echo TEXT_BANNERS_BANNER_NOTE . '<br>' . TEXT_BANNERS_INSERT_NOTE . '<br>' . TEXT_BANNERS_EXPIRCY_NOTE . '<br>' . TEXT_BANNERS_SCHEDULE_NOTE; ?></td>
-            <td class="main" align="right" valign="top" nowrap><?php echo (($form_action == 'insert') ? tep_image_submit('button_insert.gif', IMAGE_INSERT) : tep_image_submit('button_update.gif', IMAGE_UPDATE)). '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_BANNER_MANAGER, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . (isset($HTTP_GET_VARS['bID']) ? 'bID=' . $HTTP_GET_VARS['bID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+            <td class="main"><?php echo TEXT_BANNERS_BANNER_NOTE . '<br />' . TEXT_BANNERS_INSERT_NOTE . '<br />' . TEXT_BANNERS_EXPIRCY_NOTE . '<br />' . TEXT_BANNERS_SCHEDULE_NOTE; ?></td>
+            <td class="smallText" align="right" valign="top" nowrap><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BANNER_MANAGER, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . (isset($HTTP_GET_VARS['bID']) ? 'bID=' . $HTTP_GET_VARS['bID'] : ''))); ?></td>
           </tr>
         </table></td>
       </form></tr>
@@ -386,7 +367,7 @@
                     <td class="smallText" align="right"><?php echo $banners_split->display_links($banners_query_numrows, MAX_DISPLAY_SEARCH_RESULTS, MAX_DISPLAY_PAGE_LINKS, $HTTP_GET_VARS['page']); ?></td>
                   </tr>
                   <tr>
-                    <td align="right" colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_BANNER_MANAGER, 'action=new') . '">' . tep_image_button('button_new_banner.gif', IMAGE_NEW_BANNER) . '</a>'; ?></td>
+                    <td class="smallText" align="right" colspan="2"><?php echo tep_draw_button(IMAGE_NEW_BANNER, 'plus', tep_href_link(FILENAME_BANNER_MANAGER, 'action=new')); ?></td>
                   </tr>
                 </table></td>
               </tr>
@@ -396,42 +377,42 @@
   $contents = array();
   switch ($action) {
     case 'delete':
-      $heading[] = array('text' => '<b>' . $bInfo->banners_title . '</b>');
+      $heading[] = array('text' => '<strong>' . $bInfo->banners_title . '</strong>');
 
       $contents = array('form' => tep_draw_form('banners', FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $bInfo->banners_title . '</b>');
-      if ($bInfo->banners_image) $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('delete_image', 'on', true) . ' ' . TEXT_INFO_DELETE_IMAGE);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . '&nbsp;<a href="' . tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $HTTP_GET_VARS['bID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $bInfo->banners_title . '</strong>');
+      if ($bInfo->banners_image) $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('delete_image', 'on', true) . ' ' . TEXT_INFO_DELETE_IMAGE);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $HTTP_GET_VARS['bID'])));
       break;
     default:
       if (is_object($bInfo)) {
-        $heading[] = array('text' => '<b>' . $bInfo->banners_title . '</b>');
+        $heading[] = array('text' => '<strong>' . $bInfo->banners_title . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id . '&action=new') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_BANNERS_DATE_ADDED . ' ' . tep_date_short($bInfo->date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id . '&action=new')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id . '&action=delete')) . tep_draw_button(IMAGE_DETAILS, 'info', tep_href_link(FILENAME_BANNER_STATISTICS, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $bInfo->banners_id)));
+        $contents[] = array('text' => '<br />' . TEXT_BANNERS_DATE_ADDED . ' ' . tep_date_short($bInfo->date_added));
 
         if ( (function_exists('imagecreate')) && ($dir_ok) && ($banner_extension) ) {
           $banner_id = $bInfo->banners_id;
           $days = '3';
           include(DIR_WS_INCLUDES . 'graphs/banner_infobox.php');
-          $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banner_id . '.' . $banner_extension));
+          $contents[] = array('align' => 'center', 'text' => '<br />' . tep_image(DIR_WS_IMAGES . 'graphs/banner_infobox-' . $banner_id . '.' . $banner_extension));
         } else {
           include(DIR_WS_FUNCTIONS . 'html_graphs.php');
-          $contents[] = array('align' => 'center', 'text' => '<br>' . tep_banner_graph_infoBox($bInfo->banners_id, '3'));
+          $contents[] = array('align' => 'center', 'text' => '<br />' . tep_banner_graph_infoBox($bInfo->banners_id, '3'));
         }
 
-        $contents[] = array('text' => tep_image(DIR_WS_IMAGES . 'graph_hbar_blue.gif', 'Blue', '5', '5') . ' ' . TEXT_BANNERS_BANNER_VIEWS . '<br>' . tep_image(DIR_WS_IMAGES . 'graph_hbar_red.gif', 'Red', '5', '5') . ' ' . TEXT_BANNERS_BANNER_CLICKS);
+        $contents[] = array('text' => tep_image(DIR_WS_IMAGES . 'graph_hbar_blue.gif', 'Blue', '5', '5') . ' ' . TEXT_BANNERS_BANNER_VIEWS . '<br />' . tep_image(DIR_WS_IMAGES . 'graph_hbar_red.gif', 'Red', '5', '5') . ' ' . TEXT_BANNERS_BANNER_CLICKS);
 
-        if ($bInfo->date_scheduled) $contents[] = array('text' => '<br>' . sprintf(TEXT_BANNERS_SCHEDULED_AT_DATE, tep_date_short($bInfo->date_scheduled)));
+        if ($bInfo->date_scheduled) $contents[] = array('text' => '<br />' . sprintf(TEXT_BANNERS_SCHEDULED_AT_DATE, tep_date_short($bInfo->date_scheduled)));
 
         if ($bInfo->expires_date) {
-          $contents[] = array('text' => '<br>' . sprintf(TEXT_BANNERS_EXPIRES_AT_DATE, tep_date_short($bInfo->expires_date)));
+          $contents[] = array('text' => '<br />' . sprintf(TEXT_BANNERS_EXPIRES_AT_DATE, tep_date_short($bInfo->expires_date)));
         } elseif ($bInfo->expires_impressions) {
-          $contents[] = array('text' => '<br>' . sprintf(TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS, $bInfo->expires_impressions));
+          $contents[] = array('text' => '<br />' . sprintf(TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS, $bInfo->expires_impressions));
         }
 
-        if ($bInfo->date_status_change) $contents[] = array('text' => '<br>' . sprintf(TEXT_BANNERS_STATUS_CHANGE, tep_date_short($bInfo->date_status_change)));
+        if ($bInfo->date_status_change) $contents[] = array('text' => '<br />' . sprintf(TEXT_BANNERS_STATUS_CHANGE, tep_date_short($bInfo->date_status_change)));
       }
       break;
   }
@@ -451,16 +432,9 @@
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/banner_statistics.php 2.3.1.src/admin/banner_statistics.php
--- 2.2rc2a.cp.src/admin/banner_statistics.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/banner_statistics.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: banner_statistics.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,7 +20,7 @@
   $dir_ok = false;
   if (function_exists('imagecreate') && tep_not_null($banner_extension)) {
     if (is_dir(DIR_WS_IMAGES . 'graphs')) {
-      if (is_writeable(DIR_WS_IMAGES . 'graphs')) {
+      if (tep_is_writable(DIR_WS_IMAGES . 'graphs')) {
         $dir_ok = true;
       } else {
         $messageStack->add(ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE, 'error');
@@ -52,44 +52,26 @@
                             'text' => STATISTICS_TYPE_MONTHLY),
                       array('id' => 'yearly',
                             'text' => STATISTICS_TYPE_YEARLY));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr><?php echo tep_draw_form('year', FILENAME_BANNER_STATISTICS, '', 'get'); ?>
             <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
             <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td>
-            <td class="main" align="right"><?php echo TITLE_TYPE . ' ' . tep_draw_pull_down_menu('type', $type_array, (tep_not_null($type) ? $type : 'daily'), 'onChange="this.form.submit();"'); ?><noscript><input type="submit" value="GO"></noscript><br>
+            <td class="main" align="right"><?php echo TITLE_TYPE . ' ' . tep_draw_pull_down_menu('type', $type_array, (tep_not_null($type) ? $type : 'daily'), 'onchange="this.form.submit();"'); ?><noscript><input type="submit" value="GO"></noscript><br />
 <?php
   switch ($type) {
     case 'yearly': break;
     case 'monthly':
-      echo TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>';
+      echo TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onchange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>';
       break;
     default:
     case 'daily':
-      echo TITLE_MONTH . ' ' . tep_draw_pull_down_menu('month', $months_array, (isset($HTTP_GET_VARS['month']) ? $HTTP_GET_VARS['month'] : date('n')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript><br>' . TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onChange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>';
+      echo TITLE_MONTH . ' ' . tep_draw_pull_down_menu('month', $months_array, (isset($HTTP_GET_VARS['month']) ? $HTTP_GET_VARS['month'] : date('n')), 'onchange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript><br />' . TITLE_YEAR . ' ' . tep_draw_pull_down_menu('year', $years_array, (isset($HTTP_GET_VARS['year']) ? $HTTP_GET_VARS['year'] : date('Y')), 'onchange="this.form.submit();"') . '<noscript><input type="submit" value="GO"></noscript>';
       break;
   }
 ?>
@@ -162,18 +144,11 @@
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td class="main" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $HTTP_GET_VARS['bID']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+        <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_BACK, 'arrow-1-w', tep_href_link(FILENAME_BANNER_MANAGER, 'page=' . $HTTP_GET_VARS['page'] . '&bID=' . $HTTP_GET_VARS['bID'])); ?></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/cache.php 2.3.1.src/admin/cache.php
--- 2.2rc2a.cp.src/admin/cache.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/cache.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: cache.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -24,34 +24,15 @@
 
 // check if the cache directory exists
   if (is_dir(DIR_FS_CACHE)) {
-    if (!is_writeable(DIR_FS_CACHE)) $messageStack->add(ERROR_CACHE_DIRECTORY_NOT_WRITEABLE, 'error');
+    if (!tep_is_writable(DIR_FS_CACHE)) $messageStack->add(ERROR_CACHE_DIRECTORY_NOT_WRITEABLE, 'error');
   } else {
     $messageStack->add(ERROR_CACHE_DIRECTORY_DOES_NOT_EXIST, 'error');
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -80,7 +61,7 @@
     }
 
     for ($i=0, $n=sizeof($cache_blocks); $i<$n; $i++) {
-      $cached_file = ereg_replace('-language', '-' . $language, $cache_blocks[$i]['file']);
+      $cached_file = preg_replace('/-language/', '-' . $language, $cache_blocks[$i]['file']);
 
       if (file_exists(DIR_FS_CACHE . $cached_file)) {
         $cache_mtime = strftime(DATE_TIME_FORMAT, filemtime(DIR_FS_CACHE . $cached_file));
@@ -89,9 +70,9 @@
         $dir = dir(DIR_FS_CACHE);
 
         while ($cache_file = $dir->read()) {
-          $cached_file = ereg_replace('-language', '-' . $language, $cache_blocks[$i]['file']);
+          $cached_file = preg_replace('/-language/', '-' . $language, $cache_blocks[$i]['file']);
 
-          if (ereg('^' . $cached_file, $cache_file)) {
+          if (preg_match('/^' . $cached_file. '/', $cache_file)) {
             $cache_mtime = strftime(DATE_TIME_FORMAT, filemtime(DIR_FS_CACHE . $cache_file));
             break;
           }
@@ -116,16 +97,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/categories.php 2.3.1.src/admin/categories.php
--- 2.2rc2a.cp.src/admin/categories.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/categories.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: categories.php 1755 2007-12-21 14:02:36Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -207,71 +207,125 @@
         break;
       case 'insert_product':
       case 'update_product':
-        if (isset($HTTP_POST_VARS['edit_x']) || isset($HTTP_POST_VARS['edit_y'])) {
-          $action = 'new_product';
-        } else {
-          if (isset($HTTP_GET_VARS['pID'])) $products_id = tep_db_prepare_input($HTTP_GET_VARS['pID']);
-          $products_date_available = tep_db_prepare_input($HTTP_POST_VARS['products_date_available']);
+        if (isset($HTTP_GET_VARS['pID'])) $products_id = tep_db_prepare_input($HTTP_GET_VARS['pID']);
+        $products_date_available = tep_db_prepare_input($HTTP_POST_VARS['products_date_available']);
 
-          $products_date_available = (date('Y-m-d') < $products_date_available) ? $products_date_available : 'null';
+        $products_date_available = (date('Y-m-d') < $products_date_available) ? $products_date_available : 'null';
 
-          $sql_data_array = array('products_quantity' => (int)tep_db_prepare_input($HTTP_POST_VARS['products_quantity']),
-                                  'products_model' => tep_db_prepare_input($HTTP_POST_VARS['products_model']),
-                                  'products_price' => tep_db_prepare_input($HTTP_POST_VARS['products_price']),
-                                  'products_date_available' => $products_date_available,
-                                  'products_weight' => (float)tep_db_prepare_input($HTTP_POST_VARS['products_weight']),
-                                  'products_status' => tep_db_prepare_input($HTTP_POST_VARS['products_status']),
-                                  'products_tax_class_id' => tep_db_prepare_input($HTTP_POST_VARS['products_tax_class_id']),
-                                  'manufacturers_id' => (int)tep_db_prepare_input($HTTP_POST_VARS['manufacturers_id']));
+        $sql_data_array = array('products_quantity' => (int)tep_db_prepare_input($HTTP_POST_VARS['products_quantity']),
+                                'products_model' => tep_db_prepare_input($HTTP_POST_VARS['products_model']),
+                                'products_price' => tep_db_prepare_input($HTTP_POST_VARS['products_price']),
+                                'products_date_available' => $products_date_available,
+                                'products_weight' => (float)tep_db_prepare_input($HTTP_POST_VARS['products_weight']),
+                                'products_status' => tep_db_prepare_input($HTTP_POST_VARS['products_status']),
+                                'products_tax_class_id' => tep_db_prepare_input($HTTP_POST_VARS['products_tax_class_id']),
+                                'manufacturers_id' => (int)tep_db_prepare_input($HTTP_POST_VARS['manufacturers_id']));
 
-          if (isset($HTTP_POST_VARS['products_image']) && tep_not_null($HTTP_POST_VARS['products_image']) && ($HTTP_POST_VARS['products_image'] != 'none')) {
-            $sql_data_array['products_image'] = tep_db_prepare_input($HTTP_POST_VARS['products_image']);
-          }
+        $products_image = new upload('products_image');
+        $products_image->set_destination(DIR_FS_CATALOG_IMAGES);
+        if ($products_image->parse() && $products_image->save()) {
+          $sql_data_array['products_image'] = tep_db_prepare_input($products_image->filename);
+        }
+
+        if ($action == 'insert_product') {
+          $insert_sql_data = array('products_date_added' => 'now()');
+
+          $sql_data_array = array_merge($sql_data_array, $insert_sql_data);
+
+          tep_db_perform(TABLE_PRODUCTS, $sql_data_array);
+          $products_id = tep_db_insert_id();
+
+          tep_db_query("insert into " . TABLE_PRODUCTS_TO_CATEGORIES . " (products_id, categories_id) values ('" . (int)$products_id . "', '" . (int)$current_category_id . "')");
+        } elseif ($action == 'update_product') {
+          $update_sql_data = array('products_last_modified' => 'now()');
+
+          $sql_data_array = array_merge($sql_data_array, $update_sql_data);
+
+          tep_db_perform(TABLE_PRODUCTS, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "'");
+        }
+
+        $languages = tep_get_languages();
+        for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
+          $language_id = $languages[$i]['id'];
+
+          $sql_data_array = array('products_name' => tep_db_prepare_input($HTTP_POST_VARS['products_name'][$language_id]),
+                                  'products_description' => tep_db_prepare_input($HTTP_POST_VARS['products_description'][$language_id]),
+                                  'products_url' => tep_db_prepare_input($HTTP_POST_VARS['products_url'][$language_id]));
 
           if ($action == 'insert_product') {
-            $insert_sql_data = array('products_date_added' => 'now()');
+            $insert_sql_data = array('products_id' => $products_id,
+                                     'language_id' => $language_id);
 
             $sql_data_array = array_merge($sql_data_array, $insert_sql_data);
 
-            tep_db_perform(TABLE_PRODUCTS, $sql_data_array);
-            $products_id = tep_db_insert_id();
-
-            tep_db_query("insert into " . TABLE_PRODUCTS_TO_CATEGORIES . " (products_id, categories_id) values ('" . (int)$products_id . "', '" . (int)$current_category_id . "')");
+            tep_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array);
           } elseif ($action == 'update_product') {
-            $update_sql_data = array('products_last_modified' => 'now()');
+            tep_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "' and language_id = '" . (int)$language_id . "'");
+          }
+        }
 
-            $sql_data_array = array_merge($sql_data_array, $update_sql_data);
+        $pi_sort_order = 0;
+        $piArray = array(0);
 
-            tep_db_perform(TABLE_PRODUCTS, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "'");
-          }
+        foreach ($HTTP_POST_FILES as $key => $value) {
+// Update existing large product images
+          if (preg_match('/^products_image_large_([0-9]+)$/', $key, $matches)) {
+            $pi_sort_order++;
+
+            $sql_data_array = array('htmlcontent' => tep_db_prepare_input($HTTP_POST_VARS['products_image_htmlcontent_' . $matches[1]]),
+                                    'sort_order' => $pi_sort_order);
+
+            $t = new upload($key);
+            $t->set_destination(DIR_FS_CATALOG_IMAGES);
+            if ($t->parse() && $t->save()) {
+              $sql_data_array['image'] = tep_db_prepare_input($t->filename);
+            }
+
+            tep_db_perform(TABLE_PRODUCTS_IMAGES, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "' and id = '" . (int)$matches[1] . "'");
+
+            $piArray[] = (int)$matches[1];
+          } elseif (preg_match('/^products_image_large_new_([0-9]+)$/', $key, $matches)) {
+// Insert new large product images
+            $sql_data_array = array('products_id' => (int)$products_id,
+                                    'htmlcontent' => tep_db_prepare_input($HTTP_POST_VARS['products_image_htmlcontent_new_' . $matches[1]]));
+
+            $t = new upload($key);
+            $t->set_destination(DIR_FS_CATALOG_IMAGES);
+            if ($t->parse() && $t->save()) {
+              $pi_sort_order++;
 
-          $languages = tep_get_languages();
-          for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-            $language_id = $languages[$i]['id'];
-
-            $sql_data_array = array('products_name' => tep_db_prepare_input($HTTP_POST_VARS['products_name'][$language_id]),
-                                    'products_description' => tep_db_prepare_input($HTTP_POST_VARS['products_description'][$language_id]),
-                                    'products_url' => tep_db_prepare_input($HTTP_POST_VARS['products_url'][$language_id]));
-
-            if ($action == 'insert_product') {
-              $insert_sql_data = array('products_id' => $products_id,
-                                       'language_id' => $language_id);
-
-              $sql_data_array = array_merge($sql_data_array, $insert_sql_data);
-
-              tep_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array);
-            } elseif ($action == 'update_product') {
-              tep_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "' and language_id = '" . (int)$language_id . "'");
+              $sql_data_array['image'] = tep_db_prepare_input($t->filename);
+              $sql_data_array['sort_order'] = $pi_sort_order;
+
+              tep_db_perform(TABLE_PRODUCTS_IMAGES, $sql_data_array);
+
+              $piArray[] = tep_db_insert_id();
             }
           }
+        }
 
-          if (USE_CACHE == 'true') {
-            tep_reset_cache_block('categories');
-            tep_reset_cache_block('also_purchased');
+        $product_images_query = tep_db_query("select image from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$products_id . "' and id not in (" . implode(',', $piArray) . ")");
+        if (tep_db_num_rows($product_images_query)) {
+          while ($product_images = tep_db_fetch_array($product_images_query)) {
+            $duplicate_image_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_IMAGES . " where image = '" . tep_db_input($product_images['image']) . "'");
+            $duplicate_image = tep_db_fetch_array($duplicate_image_query);
+
+            if ($duplicate_image['total'] < 2) {
+              if (file_exists(DIR_FS_CATALOG_IMAGES . $product_images['image'])) {
+                @unlink(DIR_FS_CATALOG_IMAGES . $product_images['image']);
+              }
+            }
           }
 
-          tep_redirect(tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products_id));
+          tep_db_query("delete from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$products_id . "' and id not in (" . implode(',', $piArray) . ")");
         }
+
+        if (USE_CACHE == 'true') {
+          tep_reset_cache_block('categories');
+          tep_reset_cache_block('also_purchased');
+        }
+
+        tep_redirect(tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products_id));
         break;
       case 'copy_to_confirm':
         if (isset($HTTP_POST_VARS['products_id']) && isset($HTTP_POST_VARS['categories_id'])) {
@@ -300,6 +354,11 @@
               tep_db_query("insert into " . TABLE_PRODUCTS_DESCRIPTION . " (products_id, language_id, products_name, products_description, products_url, products_viewed) values ('" . (int)$dup_products_id . "', '" . (int)$description['language_id'] . "', '" . tep_db_input($description['products_name']) . "', '" . tep_db_input($description['products_description']) . "', '" . tep_db_input($description['products_url']) . "', '0')");
             }
 
+            $product_images_query = tep_db_query("select image, htmlcontent, sort_order from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$products_id . "'");
+            while ($product_images = tep_db_fetch_array($product_images_query)) {
+              tep_db_query("insert into " . TABLE_PRODUCTS_IMAGES . " (products_id, image, htmlcontent, sort_order) values ('" . (int)$dup_products_id . "', '" . tep_db_input($product_images['image']) . "', '" . tep_db_input($product_images['htmlcontent']) . "', '" . tep_db_input($product_images['sort_order']) . "')");
+            }
+
             tep_db_query("insert into " . TABLE_PRODUCTS_TO_CATEGORIES . " (products_id, categories_id) values ('" . (int)$dup_products_id . "', '" . (int)$categories_id . "')");
             $products_id = $dup_products_id;
           }
@@ -312,51 +371,18 @@
 
         tep_redirect(tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $categories_id . '&pID=' . $products_id));
         break;
-      case 'new_product_preview':
-// copy image only if modified
-        $products_image = new upload('products_image');
-        $products_image->set_destination(DIR_FS_CATALOG_IMAGES);
-        if ($products_image->parse() && $products_image->save()) {
-          $products_image_name = $products_image->filename;
-        } else {
-          $products_image_name = (isset($HTTP_POST_VARS['products_previous_image']) ? $HTTP_POST_VARS['products_previous_image'] : '');
-        }
-        break;
     }
   }
 
 // check if the catalog image directory exists
   if (is_dir(DIR_FS_CATALOG_IMAGES)) {
-    if (!is_writeable(DIR_FS_CATALOG_IMAGES)) $messageStack->add(ERROR_CATALOG_IMAGE_DIRECTORY_NOT_WRITEABLE, 'error');
+    if (!tep_is_writable(DIR_FS_CATALOG_IMAGES)) $messageStack->add(ERROR_CATALOG_IMAGE_DIRECTORY_NOT_WRITEABLE, 'error');
   } else {
     $messageStack->add(ERROR_CATALOG_IMAGE_DIRECTORY_DOES_NOT_EXIST, 'error');
   }
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<div id="spiffycalendar" class="text"></div>
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top">
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if ($action == 'new_product') {
     $parameters = array('products_name' => '',
                        'products_description' => '',
@@ -365,13 +391,14 @@
                        'products_quantity' => '',
                        'products_model' => '',
                        'products_image' => '',
+                       'products_larger_images' => array(),
                        'products_price' => '',
                        'products_weight' => '',
                        'products_date_added' => '',
                        'products_last_modified' => '',
                        'products_date_available' => '',
                        'products_status' => '',
-                           'products_tax_class_id' => '',
+                       'products_tax_class_id' => '',
                        'manufacturers_id' => '');
 
     $pInfo = new objectInfo($parameters);
@@ -381,11 +408,14 @@
       $product = tep_db_fetch_array($product_query);
 
       $pInfo->objectInfo($product);
-    } elseif (tep_not_null($HTTP_POST_VARS)) {
-      $pInfo->objectInfo($HTTP_POST_VARS);
-      $products_name = $HTTP_POST_VARS['products_name'];
-      $products_description = $HTTP_POST_VARS['products_description'];
-      $products_url = $HTTP_POST_VARS['products_url'];
+
+      $product_images_query = tep_db_query("select id, image, htmlcontent, sort_order from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product['products_id'] . "' order by sort_order");
+      while ($product_images = tep_db_fetch_array($product_images_query)) {
+        $pInfo->products_larger_images[] = array('id' => $product_images['id'],
+                                                 'image' => $product_images['image'],
+                                                 'htmlcontent' => $product_images['htmlcontent'],
+                                                 'sort_order' => $product_images['sort_order']);
+      }
     }
 
     $manufacturers_array = array(array('id' => '', 'text' => TEXT_NONE));
@@ -410,13 +440,10 @@
       case '1':
       default: $in_status = true; $out_status = false;
     }
+
+    $form_action = (isset($HTTP_GET_VARS['pID'])) ? 'update_product' : 'insert_product';
 ?>
-<link rel="stylesheet" type="text/css" href="includes/javascript/spiffyCal/spiffyCal_v2_1.css">
-<script language="JavaScript" src="includes/javascript/spiffyCal/spiffyCal_v2_1.js"></script>
-<script language="javascript"><!--
-  var dateAvailable = new ctlSpiffyCalendarBox("dateAvailable", "new_product", "products_date_available","btnDate1","<?php echo $pInfo->products_date_available; ?>",scBTNMODE_CUSTOMBLUE);
-//--></script>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 var tax_rates = new Array();
 <?php
     for ($i=0, $n=sizeof($tax_class_array); $i<$n; $i++) {
@@ -463,7 +490,7 @@
   document.forms["new_product"].products_price.value = doRound(netValue, 4);
 }
 //--></script>
-    <?php echo tep_draw_form('new_product', FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : '') . '&action=new_product_preview', 'post', 'enctype="multipart/form-data"'); ?>
+    <?php echo tep_draw_form('new_product', FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : '') . '&action=' . $form_action, 'post', 'enctype="multipart/form-data"'); ?>
     <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
@@ -486,8 +513,8 @@
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
-            <td class="main"><?php echo TEXT_PRODUCTS_DATE_AVAILABLE; ?><br><small>(YYYY-MM-DD)</small></td>
-            <td class="main"><?php echo tep_draw_separator('pixel_trans.gif', '24', '15') . '&nbsp;'; ?><script language="javascript">dateAvailable.writeControl(); dateAvailable.dateFormat="yyyy-MM-dd";</script></td>
+            <td class="main"><?php echo TEXT_PRODUCTS_DATE_AVAILABLE; ?></td>
+            <td class="main"><?php echo tep_draw_separator('pixel_trans.gif', '24', '15') . '&nbsp;' . tep_draw_input_field('products_date_available', $pInfo->products_date_available, 'id="products_date_available"') . ' <small>(YYYY-MM-DD)</small>'; ?></td>
           </tr>
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
@@ -527,7 +554,7 @@
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 updateGross();
 //--></script>
 <?php
@@ -563,8 +590,72 @@
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
-            <td class="main"><?php echo TEXT_PRODUCTS_IMAGE; ?></td>
-            <td class="main"><?php echo tep_draw_separator('pixel_trans.gif', '24', '15') . '&nbsp;' . tep_draw_file_field('products_image') . '<br>' . tep_draw_separator('pixel_trans.gif', '24', '15') . '&nbsp;' . $pInfo->products_image . tep_draw_hidden_field('products_previous_image', $pInfo->products_image); ?></td>
+            <td class="main" valign="top"><?php echo TEXT_PRODUCTS_IMAGE; ?></td>
+            <td class="main" style="padding-left: 30px;">
+              <div><?php echo '<strong>' . TEXT_PRODUCTS_MAIN_IMAGE . ' <small>(' . SMALL_IMAGE_WIDTH . ' x ' . SMALL_IMAGE_HEIGHT . 'px)</small></strong><br />' . (tep_not_null($pInfo->products_image) ? '<a href="' . DIR_WS_CATALOG_IMAGES . $pInfo->products_image . '" target="_blank">' . $pInfo->products_image . '</a> &#124; ' : '') . tep_draw_file_field('products_image'); ?></div>
+
+              <ul id="piList">
+<?php
+    $pi_counter = 0;
+
+    foreach ($pInfo->products_larger_images as $pi) {
+      $pi_counter++;
+
+      echo '                <li id="piId' . $pi_counter . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s" style="float: right;"></span><a href="#" onclick="showPiDelConfirm(' . $pi_counter . ');return false;" class="ui-icon ui-icon-trash" style="float: right;"></a><strong>' . TEXT_PRODUCTS_LARGE_IMAGE . '</strong><br />' . tep_draw_file_field('products_image_large_' . $pi['id']) . '<br /><a href="' . DIR_WS_CATALOG_IMAGES . $pi['image'] . '" target="_blank">' . $pi['image'] . '</a><br /><br />' . TEXT_PRODUCTS_LARGE_IMAGE_HTML_CONTENT . '<br />' . tep_draw_textarea_field('products_image_htmlcontent_' . $pi['id'], 'soft', '70', '3', $pi['htmlcontent']) . '</li>';
+    }
+?>
+              </ul>
+
+              <a href="#" onclick="addNewPiForm();return false;"><span class="ui-icon ui-icon-plus" style="float: left;"></span><?php echo TEXT_PRODUCTS_ADD_LARGE_IMAGE; ?></a>
+
+<div id="piDelConfirm" title="<?php echo TEXT_PRODUCTS_LARGE_IMAGE_DELETE_TITLE; ?>">
+  <p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span><?php echo TEXT_PRODUCTS_LARGE_IMAGE_CONFIRM_DELETE; ?></p>
+</div>
+
+<style type="text/css">
+#piList { list-style-type: none; margin: 0; padding: 0; }
+#piList li { margin: 5px 0; padding: 2px; }
+</style>
+
+<script type="text/javascript">
+$('#piList').sortable({
+  containment: 'parent'
+});
+
+var piSize = <?php echo $pi_counter; ?>;
+
+function addNewPiForm() {
+  piSize++;
+
+  $('#piList').append('<li id="piId' + piSize + '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s" style="float: right;"></span><a href="#" onclick="showPiDelConfirm(' + piSize + ');return false;" class="ui-icon ui-icon-trash" style="float: right;"></a><strong><?php echo TEXT_PRODUCTS_LARGE_IMAGE; ?></strong><br /><input type="file" name="products_image_large_new_' + piSize + '" /><br /><br /><?php echo TEXT_PRODUCTS_LARGE_IMAGE_HTML_CONTENT; ?><br /><textarea name="products_image_htmlcontent_new_' + piSize + '" wrap="soft" cols="70" rows="3"></textarea></li>');
+}
+
+var piDelConfirmId = 0;
+
+$('#piDelConfirm').dialog({
+  autoOpen: false,
+  resizable: false,
+  draggable: false,
+  modal: true,
+  buttons: {
+    'Delete': function() {
+      $('#piId' + piDelConfirmId).effect('blind').remove();
+      $(this).dialog('close');
+    },
+    Cancel: function() {
+      $(this).dialog('close');
+    }
+  }
+});
+
+function showPiDelConfirm(piId) {
+  piDelConfirmId = piId;
+
+  $('#piDelConfirm').dialog('open');
+}
+</script>
+
+            </td>
           </tr>
           <tr>
             <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
@@ -573,7 +664,7 @@
     for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
 ?>
           <tr>
-            <td class="main"><?php if ($i == 0) echo TEXT_PRODUCTS_URL . '<br><small>' . TEXT_PRODUCTS_URL_WITHOUT_HTTP . '</small>'; ?></td>
+            <td class="main"><?php if ($i == 0) echo TEXT_PRODUCTS_URL . '<br /><small>' . TEXT_PRODUCTS_URL_WITHOUT_HTTP . '</small>'; ?></td>
             <td class="main"><?php echo tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('products_url[' . $languages[$i]['id'] . ']', (isset($products_url[$languages[$i]['id']]) ? stripslashes($products_url[$languages[$i]['id']]) : tep_get_products_url($pInfo->products_id, $languages[$i]['id']))); ?></td>
           </tr>
 <?php
@@ -592,39 +683,30 @@
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td class="main" align="right"><?php echo tep_draw_hidden_field('products_date_added', (tep_not_null($pInfo->products_date_added) ? $pInfo->products_date_added : date('Y-m-d'))) . tep_image_submit('button_preview.gif', IMAGE_PREVIEW) . '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+        <td class="smallText" align="right"><?php echo tep_draw_hidden_field('products_date_added', (tep_not_null($pInfo->products_date_added) ? $pInfo->products_date_added : date('Y-m-d'))) . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : ''))); ?></td>
       </tr>
-    </table></form>
-<?php
-  } elseif ($action == 'new_product_preview') {
-    if (tep_not_null($HTTP_POST_VARS)) {
-      $pInfo = new objectInfo($HTTP_POST_VARS);
-      $products_name = $HTTP_POST_VARS['products_name'];
-      $products_description = $HTTP_POST_VARS['products_description'];
-      $products_url = $HTTP_POST_VARS['products_url'];
-    } else {
-      $product_query = tep_db_query("select p.products_id, pd.language_id, pd.products_name, pd.products_description, pd.products_url, p.products_quantity, p.products_model, p.products_image, p.products_price, p.products_weight, p.products_date_added, p.products_last_modified, p.products_date_available, p.products_status, p.manufacturers_id  from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = pd.products_id and p.products_id = '" . (int)$HTTP_GET_VARS['pID'] . "'");
-      $product = tep_db_fetch_array($product_query);
+    </table>
 
-      $pInfo = new objectInfo($product);
-      $products_image_name = $pInfo->products_image;
-    }
+<script type="text/javascript">
+$('#products_date_available').datepicker({
+  dateFormat: 'yy-mm-dd'
+});
+</script>
 
-    $form_action = (isset($HTTP_GET_VARS['pID'])) ? 'update_product' : 'insert_product';
+    </form>
+<?php
+  } elseif ($action == 'new_product_preview') {
+    $product_query = tep_db_query("select p.products_id, pd.language_id, pd.products_name, pd.products_description, pd.products_url, p.products_quantity, p.products_model, p.products_image, p.products_price, p.products_weight, p.products_date_added, p.products_last_modified, p.products_date_available, p.products_status, p.manufacturers_id  from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = pd.products_id and p.products_id = '" . (int)$HTTP_GET_VARS['pID'] . "'");
+    $product = tep_db_fetch_array($product_query);
 
-    echo tep_draw_form($form_action, FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : '') . '&action=' . $form_action, 'post', 'enctype="multipart/form-data"');
+    $pInfo = new objectInfo($product);
+    $products_image_name = $pInfo->products_image;
 
     $languages = tep_get_languages();
     for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-      if (isset($HTTP_GET_VARS['read']) && ($HTTP_GET_VARS['read'] == 'only')) {
-        $pInfo->products_name = tep_get_products_name($pInfo->products_id, $languages[$i]['id']);
-        $pInfo->products_description = tep_get_products_description($pInfo->products_id, $languages[$i]['id']);
-        $pInfo->products_url = tep_get_products_url($pInfo->products_id, $languages[$i]['id']);
-      } else {
-        $pInfo->products_name = tep_db_prepare_input($products_name[$languages[$i]['id']]);
-        $pInfo->products_description = tep_db_prepare_input($products_description[$languages[$i]['id']]);
-        $pInfo->products_url = tep_db_prepare_input($products_url[$languages[$i]['id']]);
-      }
+      $pInfo->products_name = tep_get_products_name($pInfo->products_id, $languages[$i]['id']);
+      $pInfo->products_description = tep_get_products_description($pInfo->products_id, $languages[$i]['id']);
+      $pInfo->products_url = tep_get_products_url($pInfo->products_id, $languages[$i]['id']);
 ?>
     <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
@@ -677,58 +759,25 @@
 <?php
     }
 
-    if (isset($HTTP_GET_VARS['read']) && ($HTTP_GET_VARS['read'] == 'only')) {
-      if (isset($HTTP_GET_VARS['origin'])) {
-        $pos_params = strpos($HTTP_GET_VARS['origin'], '?', 0);
-        if ($pos_params != false) {
-          $back_url = substr($HTTP_GET_VARS['origin'], 0, $pos_params);
-          $back_url_params = substr($HTTP_GET_VARS['origin'], $pos_params + 1);
-        } else {
-          $back_url = $HTTP_GET_VARS['origin'];
-          $back_url_params = '';
-        }
+    if (isset($HTTP_GET_VARS['origin'])) {
+      $pos_params = strpos($HTTP_GET_VARS['origin'], '?', 0);
+      if ($pos_params != false) {
+        $back_url = substr($HTTP_GET_VARS['origin'], 0, $pos_params);
+        $back_url_params = substr($HTTP_GET_VARS['origin'], $pos_params + 1);
       } else {
-        $back_url = FILENAME_CATEGORIES;
-        $back_url_params = 'cPath=' . $cPath . '&pID=' . $pInfo->products_id;
+        $back_url = $HTTP_GET_VARS['origin'];
+        $back_url_params = '';
       }
-?>
-      <tr>
-        <td align="right"><?php echo '<a href="' . tep_href_link($back_url, $back_url_params, 'NONSSL') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
-      </tr>
-<?php
     } else {
+      $back_url = FILENAME_CATEGORIES;
+      $back_url_params = 'cPath=' . $cPath . '&pID=' . $pInfo->products_id;
+    }
 ?>
       <tr>
-        <td align="right" class="smallText">
-<?php
-/* Re-Post all POST'ed variables */
-      reset($HTTP_POST_VARS);
-      while (list($key, $value) = each($HTTP_POST_VARS)) {
-        if (!is_array($HTTP_POST_VARS[$key])) {
-          echo tep_draw_hidden_field($key, htmlspecialchars(stripslashes($value)));
-        }
-      }
-      $languages = tep_get_languages();
-      for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-        echo tep_draw_hidden_field('products_name[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_name[$languages[$i]['id']])));
-        echo tep_draw_hidden_field('products_description[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_description[$languages[$i]['id']])));
-        echo tep_draw_hidden_field('products_url[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_url[$languages[$i]['id']])));
-      }
-      echo tep_draw_hidden_field('products_image', stripslashes($products_image_name));
-
-      echo tep_image_submit('button_back.gif', IMAGE_BACK, 'name="edit"') . '&nbsp;&nbsp;';
-
-      if (isset($HTTP_GET_VARS['pID'])) {
-        echo tep_image_submit('button_update.gif', IMAGE_UPDATE);
-      } else {
-        echo tep_image_submit('button_insert.gif', IMAGE_INSERT);
-      }
-      echo '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . (isset($HTTP_GET_VARS['pID']) ? '&pID=' . $HTTP_GET_VARS['pID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>';
-?></td>
+        <td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params, 'NONSSL')); ?></td>
       </tr>
-    </table></form>
+    </table>
 <?php
-    }
   } else {
 ?>
     <table border="0" width="100%" cellspacing="0" cellpadding="2">
@@ -751,7 +800,7 @@
                 <td class="smallText" align="right">
 <?php
     echo tep_draw_form('goto', FILENAME_CATEGORIES, '', 'get');
-    echo HEADING_TITLE_GOTO . ' ' . tep_draw_pull_down_menu('cPath', tep_get_category_tree(), $current_category_id, 'onChange="this.form.submit();"');
+    echo HEADING_TITLE_GOTO . ' ' . tep_draw_pull_down_menu('cPath', tep_get_category_tree(), $current_category_id, 'onchange="this.form.submit();"');
     echo tep_hide_session_id() . '</form>';
 ?>
                 </td>
@@ -800,7 +849,7 @@
         echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $categories['categories_id']) . '\'">' . "\n";
       }
 ?>
-                <td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, tep_get_path($categories['categories_id'])) . '">' . tep_image(DIR_WS_ICONS . 'folder.gif', ICON_FOLDER) . '</a>&nbsp;<b>' . $categories['categories_name'] . '</b>'; ?></td>
+                <td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, tep_get_path($categories['categories_id'])) . '">' . tep_image(DIR_WS_ICONS . 'folder.gif', ICON_FOLDER) . '</a>&nbsp;<strong>' . $categories['categories_name'] . '</strong>'; ?></td>
                 <td class="dataTableContent" align="center">&nbsp;</td>
                 <td class="dataTableContent" align="right"><?php if (isset($cInfo) && is_object($cInfo) && ($categories['categories_id'] == $cInfo->categories_id) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif', ''); } else { echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $categories['categories_id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
               </tr>
@@ -829,12 +878,12 @@
       }
 
       if (isset($pInfo) && is_object($pInfo) && ($products['products_id'] == $pInfo->products_id) ) {
-        echo '              <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products['products_id'] . '&action=new_product_preview&read=only') . '\'">' . "\n";
+        echo '              <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products['products_id'] . '&action=new_product_preview') . '\'">' . "\n";
       } else {
         echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products['products_id']) . '\'">' . "\n";
       }
 ?>
-                <td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products['products_id'] . '&action=new_product_preview&read=only') . '">' . tep_image(DIR_WS_ICONS . 'preview.gif', ICON_PREVIEW) . '</a>&nbsp;' . $products['products_name']; ?></td>
+                <td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $products['products_id'] . '&action=new_product_preview') . '">' . tep_image(DIR_WS_ICONS . 'preview.gif', ICON_PREVIEW) . '</a>&nbsp;' . $products['products_name']; ?></td>
                 <td class="dataTableContent" align="center">
 <?php
       if ($products['products_status'] == '1') {
@@ -864,8 +913,8 @@
               <tr>
                 <td colspan="3"><table border="0" width="100%" cellspacing="0" cellpadding="2">
                   <tr>
-                    <td class="smallText"><?php echo TEXT_CATEGORIES . '&nbsp;' . $categories_count . '<br>' . TEXT_PRODUCTS . '&nbsp;' . $products_count; ?></td>
-                    <td align="right" class="smallText"><?php if (sizeof($cPath_array) > 0) echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, $cPath_back . 'cID=' . $current_category_id) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>&nbsp;'; if (!isset($HTTP_GET_VARS['search'])) echo '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&action=new_category') . '">' . tep_image_button('button_new_category.gif', IMAGE_NEW_CATEGORY) . '</a>&nbsp;<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&action=new_product') . '">' . tep_image_button('button_new_product.gif', IMAGE_NEW_PRODUCT) . '</a>'; ?>&nbsp;</td>
+                    <td class="smallText"><?php echo TEXT_CATEGORIES . '&nbsp;' . $categories_count . '<br />' . TEXT_PRODUCTS . '&nbsp;' . $products_count; ?></td>
+                    <td align="right" class="smallText"><?php if (sizeof($cPath_array) > 0) echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_CATEGORIES, $cPath_back . 'cID=' . $current_category_id)); if (!isset($HTTP_GET_VARS['search'])) echo tep_draw_button(IMAGE_NEW_CATEGORY, 'plus', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&action=new_category')) . tep_draw_button(IMAGE_NEW_PRODUCT, 'plus', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&action=new_product')); ?>&nbsp;</td>
                   </tr>
                 </table></td>
               </tr>
@@ -875,7 +924,7 @@
     $contents = array();
     switch ($action) {
       case 'new_category':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_CATEGORY . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_CATEGORY . '</strong>');
 
         $contents = array('form' => tep_draw_form('newcategory', FILENAME_CATEGORIES, 'action=insert_category&cPath=' . $cPath, 'post', 'enctype="multipart/form-data"'));
         $contents[] = array('text' => TEXT_NEW_CATEGORY_INTRO);
@@ -883,16 +932,16 @@
         $category_inputs_string = '';
         $languages = tep_get_languages();
         for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
-          $category_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('categories_name[' . $languages[$i]['id'] . ']');
+          $category_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('categories_name[' . $languages[$i]['id'] . ']');
         }
 
-        $contents[] = array('text' => '<br>' . TEXT_CATEGORIES_NAME . $category_inputs_string);
-        $contents[] = array('text' => '<br>' . TEXT_CATEGORIES_IMAGE . '<br>' . tep_draw_file_field('categories_image'));
-        $contents[] = array('text' => '<br>' . TEXT_SORT_ORDER . '<br>' . tep_draw_input_field('sort_order', '', 'size="2"'));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_save.gif', IMAGE_SAVE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_CATEGORIES_NAME . $category_inputs_string);
+        $contents[] = array('text' => '<br />' . TEXT_CATEGORIES_IMAGE . '<br />' . tep_draw_file_field('categories_image'));
+        $contents[] = array('text' => '<br />' . TEXT_SORT_ORDER . '<br />' . tep_draw_input_field('sort_order', '', 'size="2"'));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath)));
         break;
       case 'edit_category':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_CATEGORY . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_CATEGORY . '</strong>');
 
         $contents = array('form' => tep_draw_form('categories', FILENAME_CATEGORIES, 'action=update_category&cPath=' . $cPath, 'post', 'enctype="multipart/form-data"') . tep_draw_hidden_field('categories_id', $cInfo->categories_id));
         $contents[] = array('text' => TEXT_EDIT_INTRO);
@@ -900,39 +949,39 @@
         $category_inputs_string = '';
         $languages = tep_get_languages();
         for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
-          $category_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('categories_name[' . $languages[$i]['id'] . ']', tep_get_category_name($cInfo->categories_id, $languages[$i]['id']));
+          $category_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('categories_name[' . $languages[$i]['id'] . ']', tep_get_category_name($cInfo->categories_id, $languages[$i]['id']));
         }
 
-        $contents[] = array('text' => '<br>' . TEXT_EDIT_CATEGORIES_NAME . $category_inputs_string);
-        $contents[] = array('text' => '<br>' . tep_image(DIR_WS_CATALOG_IMAGES . $cInfo->categories_image, $cInfo->categories_name) . '<br>' . DIR_WS_CATALOG_IMAGES . '<br><b>' . $cInfo->categories_image . '</b>');
-        $contents[] = array('text' => '<br>' . TEXT_EDIT_CATEGORIES_IMAGE . '<br>' . tep_draw_file_field('categories_image'));
-        $contents[] = array('text' => '<br>' . TEXT_EDIT_SORT_ORDER . '<br>' . tep_draw_input_field('sort_order', $cInfo->sort_order, 'size="2"'));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_save.gif', IMAGE_SAVE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_EDIT_CATEGORIES_NAME . $category_inputs_string);
+        $contents[] = array('text' => '<br />' . tep_image(DIR_WS_CATALOG_IMAGES . $cInfo->categories_image, $cInfo->categories_name) . '<br />' . DIR_WS_CATALOG_IMAGES . '<br /><strong>' . $cInfo->categories_image . '</strong>');
+        $contents[] = array('text' => '<br />' . TEXT_EDIT_CATEGORIES_IMAGE . '<br />' . tep_draw_file_field('categories_image'));
+        $contents[] = array('text' => '<br />' . TEXT_EDIT_SORT_ORDER . '<br />' . tep_draw_input_field('sort_order', $cInfo->sort_order, 'size="2"'));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id)));
         break;
       case 'delete_category':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_CATEGORY . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_CATEGORY . '</strong>');
 
         $contents = array('form' => tep_draw_form('categories', FILENAME_CATEGORIES, 'action=delete_category_confirm&cPath=' . $cPath) . tep_draw_hidden_field('categories_id', $cInfo->categories_id));
         $contents[] = array('text' => TEXT_DELETE_CATEGORY_INTRO);
-        $contents[] = array('text' => '<br><b>' . $cInfo->categories_name . '</b>');
-        if ($cInfo->childs_count > 0) $contents[] = array('text' => '<br>' . sprintf(TEXT_DELETE_WARNING_CHILDS, $cInfo->childs_count));
-        if ($cInfo->products_count > 0) $contents[] = array('text' => '<br>' . sprintf(TEXT_DELETE_WARNING_PRODUCTS, $cInfo->products_count));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br /><strong>' . $cInfo->categories_name . '</strong>');
+        if ($cInfo->childs_count > 0) $contents[] = array('text' => '<br />' . sprintf(TEXT_DELETE_WARNING_CHILDS, $cInfo->childs_count));
+        if ($cInfo->products_count > 0) $contents[] = array('text' => '<br />' . sprintf(TEXT_DELETE_WARNING_PRODUCTS, $cInfo->products_count));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id)));
         break;
       case 'move_category':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_MOVE_CATEGORY . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_MOVE_CATEGORY . '</strong>');
 
         $contents = array('form' => tep_draw_form('categories', FILENAME_CATEGORIES, 'action=move_category_confirm&cPath=' . $cPath) . tep_draw_hidden_field('categories_id', $cInfo->categories_id));
         $contents[] = array('text' => sprintf(TEXT_MOVE_CATEGORIES_INTRO, $cInfo->categories_name));
-        $contents[] = array('text' => '<br>' . sprintf(TEXT_MOVE, $cInfo->categories_name) . '<br>' . tep_draw_pull_down_menu('move_to_category_id', tep_get_category_tree(), $current_category_id));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_move.gif', IMAGE_MOVE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . sprintf(TEXT_MOVE, $cInfo->categories_name) . '<br />' . tep_draw_pull_down_menu('move_to_category_id', tep_get_category_tree(), $current_category_id));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_MOVE, 'arrow-4', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $cInfo->categories_id)));
         break;
       case 'delete_product':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_PRODUCT . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_PRODUCT . '</strong>');
 
         $contents = array('form' => tep_draw_form('products', FILENAME_CATEGORIES, 'action=delete_product_confirm&cPath=' . $cPath) . tep_draw_hidden_field('products_id', $pInfo->products_id));
         $contents[] = array('text' => TEXT_DELETE_PRODUCT_INTRO);
-        $contents[] = array('text' => '<br><b>' . $pInfo->products_name . '</b>');
+        $contents[] = array('text' => '<br /><strong>' . $pInfo->products_name . '</strong>');
 
         $product_categories_string = '';
         $product_categories = tep_generate_category_path($pInfo->products_id, 'product');
@@ -942,31 +991,31 @@
             $category_path .= $product_categories[$i][$j]['text'] . '&nbsp;&gt;&nbsp;';
           }
           $category_path = substr($category_path, 0, -16);
-          $product_categories_string .= tep_draw_checkbox_field('product_categories[]', $product_categories[$i][sizeof($product_categories[$i])-1]['id'], true) . '&nbsp;' . $category_path . '<br>';
+          $product_categories_string .= tep_draw_checkbox_field('product_categories[]', $product_categories[$i][sizeof($product_categories[$i])-1]['id'], true) . '&nbsp;' . $category_path . '<br />';
         }
         $product_categories_string = substr($product_categories_string, 0, -4);
 
-        $contents[] = array('text' => '<br>' . $product_categories_string);
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . $product_categories_string);
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id)));
         break;
       case 'move_product':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_MOVE_PRODUCT . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_MOVE_PRODUCT . '</strong>');
 
         $contents = array('form' => tep_draw_form('products', FILENAME_CATEGORIES, 'action=move_product_confirm&cPath=' . $cPath) . tep_draw_hidden_field('products_id', $pInfo->products_id));
         $contents[] = array('text' => sprintf(TEXT_MOVE_PRODUCTS_INTRO, $pInfo->products_name));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENT_CATEGORIES . '<br><b>' . tep_output_generated_category_path($pInfo->products_id, 'product') . '</b>');
-        $contents[] = array('text' => '<br>' . sprintf(TEXT_MOVE, $pInfo->products_name) . '<br>' . tep_draw_pull_down_menu('move_to_category_id', tep_get_category_tree(), $current_category_id));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_move.gif', IMAGE_MOVE) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENT_CATEGORIES . '<br /><strong>' . tep_output_generated_category_path($pInfo->products_id, 'product') . '</strong>');
+        $contents[] = array('text' => '<br />' . sprintf(TEXT_MOVE, $pInfo->products_name) . '<br />' . tep_draw_pull_down_menu('move_to_category_id', tep_get_category_tree(), $current_category_id));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_MOVE, 'arrow-4', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id)));
         break;
       case 'copy_to':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_COPY_TO . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_COPY_TO . '</strong>');
 
         $contents = array('form' => tep_draw_form('copy_to', FILENAME_CATEGORIES, 'action=copy_to_confirm&cPath=' . $cPath) . tep_draw_hidden_field('products_id', $pInfo->products_id));
         $contents[] = array('text' => TEXT_INFO_COPY_TO_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENT_CATEGORIES . '<br><b>' . tep_output_generated_category_path($pInfo->products_id, 'product') . '</b>');
-        $contents[] = array('text' => '<br>' . TEXT_CATEGORIES . '<br>' . tep_draw_pull_down_menu('categories_id', tep_get_category_tree(), $current_category_id));
-        $contents[] = array('text' => '<br>' . TEXT_HOW_TO_COPY . '<br>' . tep_draw_radio_field('copy_as', 'link', true) . ' ' . TEXT_COPY_AS_LINK . '<br>' . tep_draw_radio_field('copy_as', 'duplicate') . ' ' . TEXT_COPY_AS_DUPLICATE);
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_copy.gif', IMAGE_COPY) . ' <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENT_CATEGORIES . '<br /><strong>' . tep_output_generated_category_path($pInfo->products_id, 'product') . '</strong>');
+        $contents[] = array('text' => '<br />' . TEXT_CATEGORIES . '<br />' . tep_draw_pull_down_menu('categories_id', tep_get_category_tree(), $current_category_id));
+        $contents[] = array('text' => '<br />' . TEXT_HOW_TO_COPY . '<br />' . tep_draw_radio_field('copy_as', 'link', true) . ' ' . TEXT_COPY_AS_LINK . '<br />' . tep_draw_radio_field('copy_as', 'duplicate') . ' ' . TEXT_COPY_AS_DUPLICATE);
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_COPY, 'copy', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id)));
         break;
       default:
         if ($rows > 0) {
@@ -978,26 +1027,26 @@
             }
             $category_path_string = substr($category_path_string, 0, -1);
 
-            $heading[] = array('text' => '<b>' . $cInfo->categories_name . '</b>');
+            $heading[] = array('text' => '<strong>' . $cInfo->categories_name . '</strong>');
 
-            $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=edit_category') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=delete_category') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a> <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=move_category') . '">' . tep_image_button('button_move.gif', IMAGE_MOVE) . '</a>');
-            $contents[] = array('text' => '<br>' . TEXT_DATE_ADDED . ' ' . tep_date_short($cInfo->date_added));
+            $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=edit_category')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=delete_category')) . tep_draw_button(IMAGE_MOVE, 'arrow-4', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $category_path_string . '&cID=' . $cInfo->categories_id . '&action=move_category')));
+            $contents[] = array('text' => '<br />' . TEXT_DATE_ADDED . ' ' . tep_date_short($cInfo->date_added));
             if (tep_not_null($cInfo->last_modified)) $contents[] = array('text' => TEXT_LAST_MODIFIED . ' ' . tep_date_short($cInfo->last_modified));
-            $contents[] = array('text' => '<br>' . tep_info_image($cInfo->categories_image, $cInfo->categories_name, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT) . '<br>' . $cInfo->categories_image);
-            $contents[] = array('text' => '<br>' . TEXT_SUBCATEGORIES . ' ' . $cInfo->childs_count . '<br>' . TEXT_PRODUCTS . ' ' . $cInfo->products_count);
+            $contents[] = array('text' => '<br />' . tep_info_image($cInfo->categories_image, $cInfo->categories_name, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT) . '<br />' . $cInfo->categories_image);
+            $contents[] = array('text' => '<br />' . TEXT_SUBCATEGORIES . ' ' . $cInfo->childs_count . '<br />' . TEXT_PRODUCTS . ' ' . $cInfo->products_count);
           } elseif (isset($pInfo) && is_object($pInfo)) { // product info box contents
-            $heading[] = array('text' => '<b>' . tep_get_products_name($pInfo->products_id, $languages_id) . '</b>');
+            $heading[] = array('text' => '<strong>' . tep_get_products_name($pInfo->products_id, $languages_id) . '</strong>');
 
-            $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=new_product') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=delete_product') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a> <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=move_product') . '">' . tep_image_button('button_move.gif', IMAGE_MOVE) . '</a> <a href="' . tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=copy_to') . '">' . tep_image_button('button_copy_to.gif', IMAGE_COPY_TO) . '</a>');
-            $contents[] = array('text' => '<br>' . TEXT_DATE_ADDED . ' ' . tep_date_short($pInfo->products_date_added));
+            $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=new_product')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=delete_product')) . tep_draw_button(IMAGE_MOVE, 'arrow-4', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=move_product')) . tep_draw_button(IMAGE_COPY_TO, 'copy', tep_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&pID=' . $pInfo->products_id . '&action=copy_to')));
+            $contents[] = array('text' => '<br />' . TEXT_DATE_ADDED . ' ' . tep_date_short($pInfo->products_date_added));
             if (tep_not_null($pInfo->products_last_modified)) $contents[] = array('text' => TEXT_LAST_MODIFIED . ' ' . tep_date_short($pInfo->products_last_modified));
             if (date('Y-m-d') < $pInfo->products_date_available) $contents[] = array('text' => TEXT_DATE_AVAILABLE . ' ' . tep_date_short($pInfo->products_date_available));
-            $contents[] = array('text' => '<br>' . tep_info_image($pInfo->products_image, $pInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '<br>' . $pInfo->products_image);
-            $contents[] = array('text' => '<br>' . TEXT_PRODUCTS_PRICE_INFO . ' ' . $currencies->format($pInfo->products_price) . '<br>' . TEXT_PRODUCTS_QUANTITY_INFO . ' ' . $pInfo->products_quantity);
-            $contents[] = array('text' => '<br>' . TEXT_PRODUCTS_AVERAGE_RATING . ' ' . number_format($pInfo->average_rating, 2) . '%');
+            $contents[] = array('text' => '<br />' . tep_info_image($pInfo->products_image, $pInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '<br />' . $pInfo->products_image);
+            $contents[] = array('text' => '<br />' . TEXT_PRODUCTS_PRICE_INFO . ' ' . $currencies->format($pInfo->products_price) . '<br />' . TEXT_PRODUCTS_QUANTITY_INFO . ' ' . $pInfo->products_quantity);
+            $contents[] = array('text' => '<br />' . TEXT_PRODUCTS_AVERAGE_RATING . ' ' . number_format($pInfo->average_rating, 2) . '%');
           }
         } else { // create category/product info
-          $heading[] = array('text' => '<b>' . EMPTY_CATEGORY . '</b>');
+          $heading[] = array('text' => '<strong>' . EMPTY_CATEGORY . '</strong>');
 
           $contents[] = array('text' => TEXT_NO_CHILD_CATEGORIES_OR_PRODUCTS);
         }
@@ -1019,17 +1068,7 @@
     </table>
 <?php
   }
+
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-    </td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/configuration.php 2.3.1.src/admin/configuration.php
--- 2.2rc2a.cp.src/admin/configuration.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/configuration.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: configuration.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -31,30 +31,11 @@
 
   $cfg_group_query = tep_db_query("select configuration_group_title from " . TABLE_CONFIGURATION_GROUP . " where configuration_group_id = '" . (int)$gID . "'");
   $cfg_group = tep_db_fetch_array($cfg_group_query);
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -77,7 +58,7 @@
   while ($configuration = tep_db_fetch_array($configuration_query)) {
     if (tep_not_null($configuration['use_function'])) {
       $use_function = $configuration['use_function'];
-      if (ereg('->', $use_function)) {
+      if (preg_match('/->/', $use_function)) {
         $class_method = explode('->', $use_function);
         if (!is_object(${$class_method[0]})) {
           include(DIR_WS_CLASSES . $class_method[0] . '.php');
@@ -119,7 +100,7 @@
 
   switch ($action) {
     case 'edit':
-      $heading[] = array('text' => '<b>' . $cInfo->configuration_title . '</b>');
+      $heading[] = array('text' => '<strong>' . $cInfo->configuration_title . '</strong>');
 
       if ($cInfo->set_function) {
         eval('$value_field = ' . $cInfo->set_function . '"' . htmlspecialchars($cInfo->configuration_value) . '");');
@@ -129,16 +110,16 @@
 
       $contents = array('form' => tep_draw_form('configuration', FILENAME_CONFIGURATION, 'gID=' . $HTTP_GET_VARS['gID'] . '&cID=' . $cInfo->configuration_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br><b>' . $cInfo->configuration_title . '</b><br>' . $cInfo->configuration_description . '<br>' . $value_field);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $HTTP_GET_VARS['gID'] . '&cID=' . $cInfo->configuration_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $cInfo->configuration_title . '</strong><br />' . $cInfo->configuration_description . '<br />' . $value_field);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $HTTP_GET_VARS['gID'] . '&cID=' . $cInfo->configuration_id)));
       break;
     default:
       if (isset($cInfo) && is_object($cInfo)) {
-        $heading[] = array('text' => '<b>' . $cInfo->configuration_title . '</b>');
+        $heading[] = array('text' => '<strong>' . $cInfo->configuration_title . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $HTTP_GET_VARS['gID'] . '&cID=' . $cInfo->configuration_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a>');
-        $contents[] = array('text' => '<br>' . $cInfo->configuration_description);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($cInfo->date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $HTTP_GET_VARS['gID'] . '&cID=' . $cInfo->configuration_id . '&action=edit')));
+        $contents[] = array('text' => '<br />' . $cInfo->configuration_description);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($cInfo->date_added));
         if (tep_not_null($cInfo->last_modified)) $contents[] = array('text' => TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($cInfo->last_modified));
       }
       break;
@@ -156,16 +137,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/countries.php 2.3.1.src/admin/countries.php
--- 2.2rc2a.cp.src/admin/countries.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/countries.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: countries.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -46,30 +46,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -120,7 +101,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_new_country.gif', IMAGE_NEW_COUNTRY) . '</a>'; ?></td>
+                    <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_NEW_COUNTRY, 'plus', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -134,44 +115,44 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_COUNTRY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_COUNTRY . '</strong>');
 
       $contents = array('form' => tep_draw_form('countries', FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . '<br>' . tep_draw_input_field('countries_name'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_2 . '<br>' . tep_draw_input_field('countries_iso_code_2'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_3 . '<br>' . tep_draw_input_field('countries_iso_code_3'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ADDRESS_FORMAT . '<br>' . tep_draw_pull_down_menu('address_format_id', tep_get_address_formats()));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . '&nbsp;<a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . '<br />' . tep_draw_input_field('countries_name'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_2 . '<br />' . tep_draw_input_field('countries_iso_code_2'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_3 . '<br />' . tep_draw_input_field('countries_iso_code_3'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ADDRESS_FORMAT . '<br />' . tep_draw_pull_down_menu('address_format_id', tep_get_address_formats()));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_COUNTRY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_COUNTRY . '</strong>');
 
       $contents = array('form' => tep_draw_form('countries', FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . '<br>' . tep_draw_input_field('countries_name', $cInfo->countries_name));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_2 . '<br>' . tep_draw_input_field('countries_iso_code_2', $cInfo->countries_iso_code_2));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_3 . '<br>' . tep_draw_input_field('countries_iso_code_3', $cInfo->countries_iso_code_3));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ADDRESS_FORMAT . '<br>' . tep_draw_pull_down_menu('address_format_id', tep_get_address_formats(), $cInfo->address_format_id));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . '<br />' . tep_draw_input_field('countries_name', $cInfo->countries_name));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_2 . '<br />' . tep_draw_input_field('countries_iso_code_2', $cInfo->countries_iso_code_2));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_3 . '<br />' . tep_draw_input_field('countries_iso_code_3', $cInfo->countries_iso_code_3));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ADDRESS_FORMAT . '<br />' . tep_draw_pull_down_menu('address_format_id', tep_get_address_formats(), $cInfo->address_format_id));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_COUNTRY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_COUNTRY . '</strong>');
 
       $contents = array('form' => tep_draw_form('countries', FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $cInfo->countries_name . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $cInfo->countries_name . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id)));
       break;
     default:
       if (is_object($cInfo)) {
-        $heading[] = array('text' => '<b>' . $cInfo->countries_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $cInfo->countries_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . '<br>' . $cInfo->countries_name);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_2 . ' ' . $cInfo->countries_iso_code_2);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_CODE_3 . ' ' . $cInfo->countries_iso_code_3);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ADDRESS_FORMAT . ' ' . $cInfo->address_format_id);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_COUNTRIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->countries_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . '<br />' . $cInfo->countries_name);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_2 . ' ' . $cInfo->countries_iso_code_2);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_CODE_3 . ' ' . $cInfo->countries_iso_code_3);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ADDRESS_FORMAT . ' ' . $cInfo->address_format_id);
       }
       break;
   }
@@ -188,16 +169,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/currencies.php 2.3.1.src/admin/currencies.php
--- 2.2rc2a.cp.src/admin/currencies.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -109,30 +109,68 @@
         break;
     }
   }
+
+  $currency_select = array('USD' => array('title' => 'U.S. Dollar', 'code' => 'USD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'EUR' => array('title' => 'Euro', 'code' => 'EUR', 'symbol_left' => '', 'symbol_right' => '€', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'JPY' => array('title' => 'Japanese Yen', 'code' => 'JPY', 'symbol_left' => '¥', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'GBP' => array('title' => 'Pounds Sterling', 'code' => 'GBP', 'symbol_left' => '£', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'CHF' => array('title' => 'Swiss Franc', 'code' => 'CHF', 'symbol_left' => '', 'symbol_right' => 'CHF', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'AUD' => array('title' => 'Australian Dollar', 'code' => 'AUD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'CAD' => array('title' => 'Canadian Dollar', 'code' => 'CAD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'SEK' => array('title' => 'Swedish Krona', 'code' => 'SEK', 'symbol_left' => '', 'symbol_right' => 'kr', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'HKD' => array('title' => 'Hong Kong Dollar', 'code' => 'HKD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'NOK' => array('title' => 'Norwegian Krone', 'code' => 'NOK', 'symbol_left' => 'kr', 'symbol_right' => '', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'NZD' => array('title' => 'New Zealand Dollar', 'code' => 'NZD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'MXN' => array('title' => 'Mexican Peso', 'code' => 'MXN', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'SGD' => array('title' => 'Singapore Dollar', 'code' => 'SGD', 'symbol_left' => '$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'BRL' => array('title' => 'Brazilian Real', 'code' => 'BRL', 'symbol_left' => 'R$', 'symbol_right' => '', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'CNY' => array('title' => 'Chinese RMB', 'code' => 'CNY', 'symbol_left' => '￥', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'CZK' => array('title' => 'Czech Koruna', 'code' => 'CZK', 'symbol_left' => '', 'symbol_right' => 'Kč', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'DKK' => array('title' => 'Danish Krone', 'code' => 'DKK', 'symbol_left' => '', 'symbol_right' => 'kr', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'HUF' => array('title' => 'Hungarian Forint', 'code' => 'HUF', 'symbol_left' => '', 'symbol_right' => 'Ft', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'ILS' => array('title' => 'Israeli New Shekel', 'code' => 'ILS', 'symbol_left' => '₪', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'INR' => array('title' => 'Indian Rupee', 'code' => 'INR', 'symbol_left' => 'Rs.', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'MYR' => array('title' => 'Malaysian Ringgit', 'code' => 'MYR', 'symbol_left' => 'RM', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'PHP' => array('title' => 'Philippine Peso', 'code' => 'PHP', 'symbol_left' => 'Php', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'PLN' => array('title' => 'Polish Zloty', 'code' => 'PLN', 'symbol_left' => '', 'symbol_right' => 'zł', 'decimal_point' => ',', 'thousands_point' => '.', 'decimal_places' => '2'),
+                           'THB' => array('title' => 'Thai Baht', 'code' => 'THB', 'symbol_left' => '', 'symbol_right' => '฿', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'),
+                           'TWD' => array('title' => 'Taiwan New Dollar', 'code' => 'TWD', 'symbol_left' => 'NT$', 'symbol_right' => '', 'decimal_point' => '.', 'thousands_point' => ',', 'decimal_places' => '2'));
+
+  $currency_select_array = array(array('id' => '', 'text' => TEXT_INFO_COMMON_CURRENCIES));
+  foreach ($currency_select as $cs) {
+    if (!isset($currencies->currencies[$cs['code']])) {
+      $currency_select_array[] = array('id' => $cs['code'], 'text' => '[' . $cs['code'] . '] ' . $cs['title']);
+    }
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+<script type="text/javascript">
+var currency_select = new Array();
+<?php
+  foreach ($currency_select_array as $cs) {
+    if (!empty($cs['id'])) {
+      echo 'currency_select["' . $cs['id'] . '"] = new Array("' . $currency_select[$cs['id']]['title'] . '", "' . $currency_select[$cs['id']]['symbol_left'] . '", "' . $currency_select[$cs['id']]['symbol_right'] . '", "' . $currency_select[$cs['id']]['decimal_point'] . '", "' . $currency_select[$cs['id']]['thousands_point'] . '", "' . $currency_select[$cs['id']]['decimal_places'] . '");' . "\n";
+    }
+  }
+?>
+
+function updateForm() {
+  var cs = document.forms["currencies"].cs[document.forms["currencies"].cs.selectedIndex].value;
+
+  document.forms["currencies"].title.value = currency_select[cs][0];
+  document.forms["currencies"].code.value = cs;
+  document.forms["currencies"].symbol_left.value = currency_select[cs][1];
+  document.forms["currencies"].symbol_right.value = currency_select[cs][2];
+  document.forms["currencies"].decimal_point.value = currency_select[cs][3];
+  document.forms["currencies"].thousands_point.value = currency_select[cs][4];
+  document.forms["currencies"].decimal_places.value = currency_select[cs][5];
+  document.forms["currencies"].value.value = 1;
+}
+</script>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -167,7 +205,7 @@
     }
 
     if (DEFAULT_CURRENCY == $currency['code']) {
-      echo '                <td class="dataTableContent"><b>' . $currency['title'] . ' (' . TEXT_DEFAULT . ')</b></td>' . "\n";
+      echo '                <td class="dataTableContent"><strong>' . $currency['title'] . ' (' . TEXT_DEFAULT . ')</strong></td>' . "\n";
     } else {
       echo '                <td class="dataTableContent">' . $currency['title'] . '</td>' . "\n";
     }
@@ -189,8 +227,8 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td><?php if (CURRENCY_SERVER_PRIMARY) { echo '<a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=update') . '">' . tep_image_button('button_update_currencies.gif', IMAGE_UPDATE_CURRENCIES) . '</a>'; } ?></td>
-                    <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=new') . '">' . tep_image_button('button_new_currency.gif', IMAGE_NEW_CURRENCY) . '</a>'; ?></td>
+                    <td class="smallText"><?php if (CURRENCY_SERVER_PRIMARY) { echo tep_draw_button(IMAGE_UPDATE_CURRENCIES, 'refresh', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=update')); } ?></td>
+                    <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_NEW_CURRENCY, 'plus', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -204,59 +242,60 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_CURRENCY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_CURRENCY . '</strong>');
 
       $contents = array('form' => tep_draw_form('currencies', FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . (isset($cInfo) ? '&cID=' . $cInfo->currencies_id : '') . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_TITLE . '<br>' . tep_draw_input_field('title'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_CODE . '<br>' . tep_draw_input_field('code'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . '<br>' . tep_draw_input_field('symbol_left'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_SYMBOL_RIGHT . '<br>' . tep_draw_input_field('symbol_right'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_DECIMAL_POINT . '<br>' . tep_draw_input_field('decimal_point'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_THOUSANDS_POINT . '<br>' . tep_draw_input_field('thousands_point'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_DECIMAL_PLACES . '<br>' . tep_draw_input_field('decimal_places'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_VALUE . '<br>' . tep_draw_input_field('value'));
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_INFO_SET_AS_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . ' <a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $HTTP_GET_VARS['cID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . tep_draw_pull_down_menu('cs', $currency_select_array, '', 'onchange="updateForm();"'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_TITLE . '<br />' . tep_draw_input_field('title'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_CODE . '<br />' . tep_draw_input_field('code'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . '<br />' . tep_draw_input_field('symbol_left'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_SYMBOL_RIGHT . '<br />' . tep_draw_input_field('symbol_right'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_DECIMAL_POINT . '<br />' . tep_draw_input_field('decimal_point'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_THOUSANDS_POINT . '<br />' . tep_draw_input_field('thousands_point'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_DECIMAL_PLACES . '<br />' . tep_draw_input_field('decimal_places'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_VALUE . '<br />' . tep_draw_input_field('value'));
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_INFO_SET_AS_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $HTTP_GET_VARS['cID'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_CURRENCY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_CURRENCY . '</strong>');
 
       $contents = array('form' => tep_draw_form('currencies', FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_TITLE . '<br>' . tep_draw_input_field('title', $cInfo->title));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_CODE . '<br>' . tep_draw_input_field('code', $cInfo->code));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . '<br>' . tep_draw_input_field('symbol_left', $cInfo->symbol_left));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_SYMBOL_RIGHT . '<br>' . tep_draw_input_field('symbol_right', $cInfo->symbol_right));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_DECIMAL_POINT . '<br>' . tep_draw_input_field('decimal_point', $cInfo->decimal_point));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_THOUSANDS_POINT . '<br>' . tep_draw_input_field('thousands_point', $cInfo->thousands_point));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_DECIMAL_PLACES . '<br>' . tep_draw_input_field('decimal_places', $cInfo->decimal_places));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_VALUE . '<br>' . tep_draw_input_field('value', $cInfo->value));
-      if (DEFAULT_CURRENCY != $cInfo->code) $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_INFO_SET_AS_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_TITLE . '<br />' . tep_draw_input_field('title', $cInfo->title));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_CODE . '<br />' . tep_draw_input_field('code', $cInfo->code));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . '<br />' . tep_draw_input_field('symbol_left', $cInfo->symbol_left));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_SYMBOL_RIGHT . '<br />' . tep_draw_input_field('symbol_right', $cInfo->symbol_right));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_DECIMAL_POINT . '<br />' . tep_draw_input_field('decimal_point', $cInfo->decimal_point));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_THOUSANDS_POINT . '<br />' . tep_draw_input_field('thousands_point', $cInfo->thousands_point));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_DECIMAL_PLACES . '<br />' . tep_draw_input_field('decimal_places', $cInfo->decimal_places));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_VALUE . '<br />' . tep_draw_input_field('value', $cInfo->value));
+      if (DEFAULT_CURRENCY != $cInfo->code) $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_INFO_SET_AS_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_CURRENCY . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_CURRENCY . '</strong>');
 
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $cInfo->title . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . (($remove_currency) ? '<a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=deleteconfirm') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>' : '') . ' <a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $cInfo->title . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . (($remove_currency) ? tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=deleteconfirm'), 'primary') : '') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id)));
       break;
     default:
       if (is_object($cInfo)) {
-        $heading[] = array('text' => '<b>' . $cInfo->title . '</b>');
+        $heading[] = array('text' => '<strong>' . $cInfo->title . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_TITLE . ' ' . $cInfo->title);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_CURRENCIES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->currencies_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_TITLE . ' ' . $cInfo->title);
         $contents[] = array('text' => TEXT_INFO_CURRENCY_CODE . ' ' . $cInfo->code);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . ' ' . $cInfo->symbol_left);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_SYMBOL_LEFT . ' ' . $cInfo->symbol_left);
         $contents[] = array('text' => TEXT_INFO_CURRENCY_SYMBOL_RIGHT . ' ' . $cInfo->symbol_right);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_DECIMAL_POINT . ' ' . $cInfo->decimal_point);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_DECIMAL_POINT . ' ' . $cInfo->decimal_point);
         $contents[] = array('text' => TEXT_INFO_CURRENCY_THOUSANDS_POINT . ' ' . $cInfo->thousands_point);
         $contents[] = array('text' => TEXT_INFO_CURRENCY_DECIMAL_PLACES . ' ' . $cInfo->decimal_places);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_LAST_UPDATED . ' ' . tep_date_short($cInfo->last_updated));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_LAST_UPDATED . ' ' . tep_date_short($cInfo->last_updated));
         $contents[] = array('text' => TEXT_INFO_CURRENCY_VALUE . ' ' . number_format($cInfo->value, 8));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CURRENCY_EXAMPLE . '<br>' . $currencies->format('30', false, DEFAULT_CURRENCY) . ' = ' . $currencies->format('30', true, $cInfo->code));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CURRENCY_EXAMPLE . '<br />' . $currencies->format('30', false, DEFAULT_CURRENCY) . ' = ' . $currencies->format('30', true, $cInfo->code));
       }
       break;
   }
@@ -273,16 +312,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/customers.php 2.3.1.src/admin/customers.php
--- 2.2rc2a.cp.src/admin/customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -226,18 +226,12 @@
         $cInfo = new objectInfo($customers);
     }
   }
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if ($action == 'edit' || $action == 'update') {
 ?>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 
 function check_form() {
   var error = 0;
@@ -334,22 +328,8 @@
 <?php
   }
 ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   if ($action == 'edit' || $action == 'update') {
     $newsletter_array = array(array('id' => '1', 'text' => ENTRY_NEWSLETTER_YES),
@@ -366,7 +346,7 @@
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
-      <tr><?php echo tep_draw_form('customers', FILENAME_CUSTOMERS, tep_get_all_get_params(array('action')) . 'action=update', 'post', 'onSubmit="return check_form();"') . tep_draw_hidden_field('default_address_id', $cInfo->customers_default_address_id); ?>
+      <tr><?php echo tep_draw_form('customers', FILENAME_CUSTOMERS, tep_get_all_get_params(array('action')) . 'action=update', 'post', 'onsubmit="return check_form();"') . tep_draw_hidden_field('default_address_id', $cInfo->customers_default_address_id); ?>
         <td class="formAreaTitle"><?php echo CATEGORY_PERSONAL; ?></td>
       </tr>
       <tr>
@@ -429,7 +409,6 @@
           <tr>
             <td class="main"><?php echo ENTRY_DATE_OF_BIRTH; ?></td>
             <td class="main">
-
 <?php
     if ($error == true) {
       if ($entry_date_of_birth_error == true) {
@@ -438,9 +417,11 @@
         echo $cInfo->customers_dob . tep_draw_hidden_field('customers_dob');
       }
     } else {
-      echo tep_draw_input_field('customers_dob', tep_date_short($cInfo->customers_dob), 'maxlength="10"', true);
+      echo tep_draw_input_field('customers_dob', tep_date_short($cInfo->customers_dob), 'maxlength="10" id="customers_dob"', true);
     }
-?></td>
+?>
+              <script type="text/javascript">$('#customers_dob').datepicker({dateFormat: '<?php echo JQUERY_DATEPICKER_FORMAT; ?>', changeMonth: true, changeYear: true, yearRange: '-100:+0'});</script>
+            </td>
           </tr>
 <?php
     }
@@ -482,11 +463,7 @@
             <td class="main">
 <?php
     if ($error == true) {
-      if ($entry_company_error == true) {
-        echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"') . '&nbsp;' . ENTRY_COMPANY_ERROR;
-      } else {
-        echo $cInfo->entry_company . tep_draw_hidden_field('entry_company');
-      }
+      echo $cInfo->entry_company . tep_draw_hidden_field('entry_company');
     } else {
       echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"');
     }
@@ -528,11 +505,7 @@
             <td class="main">
 <?php
     if ($error == true) {
-      if ($entry_suburb_error == true) {
-        echo tep_draw_input_field('suburb', $cInfo->entry_suburb, 'maxlength="32"') . '&nbsp;' . ENTRY_SUBURB_ERROR;
-      } else {
-        echo $cInfo->entry_suburb . tep_draw_hidden_field('entry_suburb');
-      }
+      echo $cInfo->entry_suburb . tep_draw_hidden_field('entry_suburb');
     } else {
       echo tep_draw_input_field('entry_suburb', $cInfo->entry_suburb, 'maxlength="32"');
     }
@@ -686,7 +659,7 @@
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td align="right" class="main"><?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('action'))) .'">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+        <td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('action')))); ?></td>
       </tr></form>
 <?php
   } else {
@@ -760,7 +733,7 @@
     if (isset($HTTP_GET_VARS['search']) && tep_not_null($HTTP_GET_VARS['search'])) {
 ?>
                   <tr>
-                    <td align="right" colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_CUSTOMERS) . '">' . tep_image_button('button_reset.gif', IMAGE_RESET) . '</a>'; ?></td>
+                    <td class="smallText" align="right" colspan="2"><?php echo tep_draw_button(IMAGE_RESET, 'arrowrefresh-1-w', tep_href_link(FILENAME_CUSTOMERS)); ?></td>
                   </tr>
 <?php
     }
@@ -774,24 +747,24 @@
 
   switch ($action) {
     case 'confirm':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_CUSTOMER . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_CUSTOMER . '</strong>');
 
       $contents = array('form' => tep_draw_form('customers', FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id . '&action=deleteconfirm'));
-      $contents[] = array('text' => TEXT_DELETE_INTRO . '<br><br><b>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</b>');
-      if (isset($cInfo->number_of_reviews) && ($cInfo->number_of_reviews) > 0) $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('delete_reviews', 'on', true) . ' ' . sprintf(TEXT_DELETE_REVIEWS, $cInfo->number_of_reviews));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => TEXT_DELETE_INTRO . '<br /><br /><strong>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</strong>');
+      if (isset($cInfo->number_of_reviews) && ($cInfo->number_of_reviews) > 0) $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('delete_reviews', 'on', true) . ' ' . sprintf(TEXT_DELETE_REVIEWS, $cInfo->number_of_reviews));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id)));
       break;
     default:
       if (isset($cInfo) && is_object($cInfo)) {
-        $heading[] = array('text' => '<b>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</b>');
+        $heading[] = array('text' => '<strong>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id . '&action=confirm') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS, 'cID=' . $cInfo->customers_id) . '">' . tep_image_button('button_orders.gif', IMAGE_ORDERS) . '</a> <a href="' . tep_href_link(FILENAME_MAIL, 'selected_box=tools&customer=' . $cInfo->customers_email_address) . '">' . tep_image_button('button_email.gif', IMAGE_EMAIL) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_DATE_ACCOUNT_CREATED . ' ' . tep_date_short($cInfo->date_account_created));
-        $contents[] = array('text' => '<br>' . TEXT_DATE_ACCOUNT_LAST_MODIFIED . ' ' . tep_date_short($cInfo->date_account_last_modified));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_LAST_LOGON . ' '  . tep_date_short($cInfo->date_last_logon));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_NUMBER_OF_LOGONS . ' ' . $cInfo->number_of_logons);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY . ' ' . $cInfo->countries_name);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_NUMBER_OF_REVIEWS . ' ' . $cInfo->number_of_reviews);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_CUSTOMERS, tep_get_all_get_params(array('cID', 'action')) . 'cID=' . $cInfo->customers_id . '&action=confirm')) . tep_draw_button(IMAGE_ORDERS, 'cart', tep_href_link(FILENAME_ORDERS, 'cID=' . $cInfo->customers_id)) . tep_draw_button(IMAGE_EMAIL, 'mail-closed', tep_href_link(FILENAME_MAIL, 'customer=' . $cInfo->customers_email_address)));
+        $contents[] = array('text' => '<br />' . TEXT_DATE_ACCOUNT_CREATED . ' ' . tep_date_short($cInfo->date_account_created));
+        $contents[] = array('text' => '<br />' . TEXT_DATE_ACCOUNT_LAST_MODIFIED . ' ' . tep_date_short($cInfo->date_account_last_modified));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_LAST_LOGON . ' '  . tep_date_short($cInfo->date_last_logon));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_NUMBER_OF_LOGONS . ' ' . $cInfo->number_of_logons);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY . ' ' . $cInfo->countries_name);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_NUMBER_OF_REVIEWS . ' ' . $cInfo->number_of_reviews);
       }
       break;
   }
@@ -811,16 +784,9 @@
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/define_language.php 2.3.1.src/admin/define_language.php
--- 2.2rc2a.cp.src/admin/define_language.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/define_language.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,49 +1,49 @@
 <?php
 /*
-  $Id: define_language.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
 
-  if (!isset($HTTP_GET_VARS['lngdir'])) $HTTP_GET_VARS['lngdir'] = $language;
+  function tep_opendir($path) {
+    $path = rtrim($path, '/') . '/';
 
-  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+    $exclude_array = array('.', '..', '.DS_Store', 'Thumbs.db');
 
-  if (tep_not_null($action)) {
-    switch ($action) {
-      case 'save':
-        if (isset($HTTP_GET_VARS['lngdir']) && isset($HTTP_GET_VARS['filename'])) {
-          if ($HTTP_GET_VARS['filename'] == $HTTP_GET_VARS['lngdir'] . '.php') {
-            $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['filename'];
-          } else {
-            $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['lngdir'] . '/' . $HTTP_GET_VARS['filename'];
-          }
+    $result = array();
 
-          if (file_exists($file)) {
-            if (file_exists('bak' . $file)) {
-              @unlink('bak' . $file);
-            }
+    if ($handle = opendir($path)) {
+      while (false !== ($filename = readdir($handle))) {
+        if (!in_array($filename, $exclude_array)) {
+          $file = array('name' => $path . $filename,
+                        'is_dir' => is_dir($path . $filename),
+                        'writable' => tep_is_writable($path . $filename),
+                        'size' => filesize($path . $filename),
+                        'last_modified' => strftime(DATE_TIME_FORMAT, filemtime($path . $filename)));
 
-            @rename($file, 'bak' . $file);
+          $result[] = $file;
 
-            $new_file = fopen($file, 'w');
-            $file_contents = stripslashes($HTTP_POST_VARS['file_contents']);
-            fwrite($new_file, $file_contents, strlen($file_contents));
-            fclose($new_file);
+          if ($file['is_dir'] == true) {
+            $result = array_merge($result, tep_opendir($path . $filename));
           }
-          tep_redirect(tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']));
         }
-        break;
+      }
+
+      closedir($handle);
     }
+
+    return $result;
   }
 
+  if (!isset($HTTP_GET_VARS['lngdir'])) $HTTP_GET_VARS['lngdir'] = $language;
+
   $languages_array = array();
   $languages = tep_get_languages();
   $lng_exists = false;
@@ -55,35 +55,46 @@
   }
 
   if (!$lng_exists) $HTTP_GET_VARS['lngdir'] = $language;
+
+  if (isset($HTTP_GET_VARS['filename'])) {
+    $file_edit = realpath(DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['filename']);
+
+    if (substr($file_edit, 0, strlen(DIR_FS_CATALOG_LANGUAGES)) != DIR_FS_CATALOG_LANGUAGES) {
+      tep_redirect(tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']));
+    }
+  }
+
+  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+
+  if (tep_not_null($action)) {
+    switch ($action) {
+      case 'save':
+        if (isset($HTTP_GET_VARS['lngdir']) && isset($HTTP_GET_VARS['filename'])) {
+          $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['filename'];
+
+          if (file_exists($file) && tep_is_writable($file)) {
+            $new_file = fopen($file, 'w');
+            $file_contents = stripslashes($HTTP_POST_VARS['file_contents']);
+            fwrite($new_file, $file_contents, strlen($file_contents));
+            fclose($new_file);
+          }
+
+          tep_redirect(tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']));
+        }
+        break;
+    }
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr><?php echo tep_draw_form('lng', FILENAME_DEFINE_LANGUAGE, '', 'get'); ?>
             <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
             <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('lngdir', $languages_array, $language, 'onChange="this.form.submit();"'); ?></td>
+            <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('lngdir', $languages_array, $language, 'onchange="this.form.submit();"'); ?></td>
           <?php echo tep_hide_session_id(); ?></form></tr>
         </table></td>
       </tr>
@@ -91,18 +102,14 @@
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   if (isset($HTTP_GET_VARS['lngdir']) && isset($HTTP_GET_VARS['filename'])) {
-    if ($HTTP_GET_VARS['filename'] == $HTTP_GET_VARS['lngdir'] . '.php') {
-      $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['filename'];
-    } else {
-      $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['lngdir'] . '/' . $HTTP_GET_VARS['filename'];
-    }
+    $file = DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['filename'];
 
     if (file_exists($file)) {
       $file_array = file($file);
       $contents = implode('', $file_array);
 
       $file_writeable = true;
-      if (!is_writeable($file)) {
+      if (!tep_is_writable($file)) {
         $file_writeable = false;
         $messageStack->reset();
         $messageStack->add(sprintf(ERROR_FILE_NOT_WRITEABLE, $file), 'error');
@@ -111,83 +118,81 @@
 
 ?>
           <tr><?php echo tep_draw_form('language', FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'] . '&filename=' . $HTTP_GET_VARS['filename'] . '&action=save'); ?>
-            <td><table border="0" cellspacing="0" cellpadding="2">
+            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
               <tr>
-                <td class="main"><b><?php echo $HTTP_GET_VARS['filename']; ?></b></td>
+                <td class="main"><strong><?php echo $HTTP_GET_VARS['filename']; ?></strong></td>
               </tr>
               <tr>
-                <td class="main"><?php echo tep_draw_textarea_field('file_contents', 'soft', '80', '20', $contents, (($file_writeable) ? '' : 'readonly')); ?></td>
+                <td class="main"><?php echo tep_draw_textarea_field('file_contents', 'soft', '80', '25', $contents, (($file_writeable) ? '' : 'readonly') . ' style="width: 100%;"'); ?></td>
               </tr>
               <tr>
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td align="right"><?php if ($file_writeable == true) { echo tep_image_submit('button_save.gif', IMAGE_SAVE) . '&nbsp;<a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; } else { echo '<a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; } ?></td>
+                <td class="smallText" align="right"><?php if ($file_writeable == true) { echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'])); } else { echo tep_draw_button(IMAGE_BACK, 'arrow-1-w', tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'])); } ?></td>
               </tr>
             </table></td>
           </form></tr>
+          <tr>
+            <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+          </tr>
+          <tr>
+            <td class="main"><?php echo TEXT_EDIT_NOTE; ?></td>
+          </tr>
 <?php
     } else {
 ?>
           <tr>
-            <td class="main"><b><?php echo TEXT_FILE_DOES_NOT_EXIST; ?></b></td>
+            <td class="main"><strong><?php echo TEXT_FILE_DOES_NOT_EXIST; ?></strong></td>
           </tr>
           <tr>
             <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
           </tr>
           <tr>
-            <td><?php echo '<a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+            <td><?php echo tep_draw_button(IMAGE_BACK, 'arrow-1-w', tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'])); ?></td>
           </tr>
 <?php
     }
   } else {
     $filename = $HTTP_GET_VARS['lngdir'] . '.php';
+    $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
 ?>
           <tr>
-            <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
-              <tr>
-                <td class="smallText"><a href="<?php echo tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'] . '&filename=' . $filename); ?>"><b><?php echo $filename; ?></b></a></td>
+            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+              <tr class="dataTableHeadingRow">
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_FILES; ?></td>
+                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_WRITABLE; ?></td>
+                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_LAST_MODIFIED; ?></td>
+              </tr>
+              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">
+                <td class="dataTableContent"><a href="<?php echo tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'] . '&filename=' . $filename); ?>"><strong><?php echo $filename; ?></strong></a></td>
+                <td class="dataTableContent" align="center"><?php echo tep_image(DIR_WS_IMAGES . 'icons/' . ((tep_is_writable(DIR_FS_CATALOG_LANGUAGES . $filename) == true) ? 'tick.gif' : 'cross.gif')); ?></td>
+                <td class="dataTableContent" align="right"><?php echo strftime(DATE_TIME_FORMAT, filemtime(DIR_FS_CATALOG_LANGUAGES . $filename)); ?></td>
+              </tr>
 <?php
-    $left = false;
-    if ($dir = dir(DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['lngdir'])) {
-      $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
-      while ($file = $dir->read()) {
-        if (substr($file, strrpos($file, '.')) == $file_extension) {
-          echo '                <td class="smallText"><a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'] . '&filename=' . $file) . '">' . $file . '</a></td>' . "\n";
-          if (!$left) {
-            echo '              </tr>' . "\n" .
-                 '              <tr>' . "\n";
-          }
-          $left = !$left;
-        }
+    foreach (tep_opendir(DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['lngdir']) as $file) {
+      if (substr($file['name'], strrpos($file['name'], '.')) == $file_extension) {
+        $filename = substr($file['name'], strlen(DIR_FS_CATALOG_LANGUAGES));
+
+        echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' .
+             '                <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $HTTP_GET_VARS['lngdir'] . '&filename=' . $filename) . '">' . substr($filename, strlen($HTTP_GET_VARS['lngdir'] . '/')) . '</a></td>' .
+             '                <td class="dataTableContent" align="center">' . tep_image(DIR_WS_IMAGES . 'icons/' . (($file['writable'] == true) ? 'tick.gif' : 'cross.gif')) . '</td>' .
+             '                <td class="dataTableContent" align="right">' . $file['last_modified'] . '</td>' .
+             '              </tr>';
       }
-      $dir->close();
     }
 ?>
               </tr>
             </table></td>
           </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
-          </tr>
-          <tr>
-            <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, 'current_path=' . DIR_FS_CATALOG_LANGUAGES . $HTTP_GET_VARS['lngdir']) . '">' . tep_image_button('button_file_manager.gif', IMAGE_FILE_MANAGER) . '</a>'; ?></td>
-          </tr>
 <?php
   }
 ?>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/ext/modules/payment/moneybookers/activation.php 2.3.1.src/admin/ext/modules/payment/moneybookers/activation.php
--- 2.2rc2a.cp.src/admin/ext/modules/payment/moneybookers/activation.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/ext/modules/payment/moneybookers/activation.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,152 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+  require('../includes/languages/' . $language . '/modules/payment/moneybookers.php');
+  require('../includes/modules/payment/moneybookers.php');
+
+  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+  $pass = false;
+
+  switch ($action) {
+    case 'verifyEmail':
+      $mb = new moneybookers();
+      $result = $mb->sendTransactionToGateway('https://www.moneybookers.com/app/email_check.pl', 'email=' . $HTTP_POST_VARS['mb_email'] . '&cust_id=2167348&password=281f2d9f44066eab75db5afb063952b1');
+      $result = explode(',', $result, 2);
+
+      if ( (sizeof($result) == 2) && ($result[0] == 'OK') ) {
+        $pass = true;
+
+        $email_body = 'Store Name: ' . STORE_NAME . ' (powered by osCommerce Online Merchant (' . $mb->signature . '))' . "\n" .
+                      'Merchant Name: ' . STORE_OWNER . "\n" .
+                      'Moneybookers E-Mail Address: ' . $HTTP_POST_VARS['mb_email'] . "\n" .
+                      'Moneybookers Customer ID: ' . $result[1] . "\n" .
+                      'Store URL: ' . tep_catalog_href_link() . "\n" .
+                      'Language: ' . $language . "\n";
+
+        tep_mail('', 'ecommerce@moneybookers.com', 'Quick Checkout Account Activation', $email_body, '', $HTTP_POST_VARS['mb_email']);
+      }
+
+      break;
+
+    case 'testSecretWord':
+      $mb = new moneybookers();
+      $result = $mb->sendTransactionToGateway('https://www.moneybookers.com/app/secret_word_check.pl', 'email=' . MODULE_PAYMENT_MONEYBOOKERS_PAY_TO . '&secret=' . md5('281f2d9f44066eab75db5afb063952b1' . md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD)) . '&cust_id=2167348');
+
+      if ($result == 'OK') {
+        $pass = true;
+      }
+
+      break;
+
+    case 'coreRequired':
+      break;
+
+    default:
+      $action = 'verifyEmail';
+      break;
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td class="pageHeading"><?php echo MB_ACTIVATION_TITLE; ?></td>
+            <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td class="main">
+<?php
+  if ($action == 'verifyEmail') {
+    if (isset($result)) {
+      if ($pass == true) {
+?>
+          <p><strong><u><?php echo MB_ACTIVATION_ACTIVATE_TITLE; ?></u></strong></p>
+          <p><?php echo MB_ACTIVATION_ACTIVATE_TEXT; ?></p>
+          <form name="activation" action="<?php echo tep_href_link(FILENAME_MODULES, 'set=payment&module=moneybookers&action=install&active=true&email=' . $HTTP_POST_VARS['mb_email'] . '&custid=' . $result[1]); ?>" method="post">
+            <p><input type="submit" value="<?php echo MB_ACTIVATION_CONTINUE_BUTTON; ?>"></p>
+          </form>
+<?php
+      } else {
+?>
+          <div style="padding: 5px; background-color: #ffcccc;">
+            <p><strong><u><?php echo MB_ACTIVATION_NONEXISTING_ACCOUNT_TITLE; ?></u></strong></p>
+            <p><?php echo MB_ACTIVATION_NONEXISTING_ACCOUNT_TEXT; ?></p>
+          </div>
+<?php
+      }
+    }
+
+    if (!isset($result) || ($pass == false)) {
+?>
+          <p><strong><u><?php echo MB_ACTIVATION_ACCOUNT_TITLE; ?></u></strong></p>
+          <p><?php echo MB_ACTIVATION_ACCOUNT_TEXT; ?></p>
+          <form name="activation" action="<?php echo tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=verifyEmail'); ?>" method="post">
+            <p><?php echo MB_ACTIVATION_EMAIL_ADDRESS . ' ' . tep_draw_input_field('mb_email', STORE_OWNER_EMAIL_ADDRESS); ?></p>
+            <p><input type="submit" value="<?php echo MB_ACTIVATION_VERIFY_ACCOUNT_BUTTON; ?>"></p>
+          </form>
+<?php
+    }
+  } elseif ($action == 'testSecretWord') {
+    if (isset($result) && ($pass == true)) {
+?>
+          <p><strong><u><?php echo MB_ACTIVATION_SECRET_WORD_TITLE; ?></u></strong></p>
+          <p><?php echo MB_ACTIVATION_SECRET_WORD_SUCCESS_TEXT; ?></p>
+          <form name="activation" action="<?php echo tep_href_link(FILENAME_MODULES, 'set=payment&module=moneybookers&action=edit'); ?>" method="post">
+            <p><input type="submit" value="<?php echo MB_ACTIVATION_CONTINUE_BUTTON; ?>"></p>
+          </form>
+<?php
+    } else {
+      if ($result == 'VELOCITY_CHECK_EXCEEDED') {
+?>
+          <div style="padding: 5px; background-color: #ff9999;">
+            <p><strong><u><?php echo MB_ACTIVATION_SECRET_WORD_ERROR_TITLE; ?></u></strong></p>
+            <p><?php echo MB_ACTIVATION_SECRET_WORD_ERROR_EXCEEDED; ?></p>
+          </div>
+<?php
+      }
+?>
+          <p><strong><u><?php echo MB_ACTIVATION_SECRET_WORD_TITLE; ?></u></strong></p>
+          <p><?php echo MB_ACTIVATION_SECRET_WORD_FAIL_TEXT; ?></p>
+          <form name="activation" action="<?php echo tep_href_link(FILENAME_MODULES, 'set=payment&module=moneybookers&action=edit'); ?>" method="post">
+            <p><input type="submit" value="<?php echo MB_ACTIVATION_CONTINUE_BUTTON; ?>"></p>
+          </form>
+<?php
+    }
+  } elseif ($action == 'coreRequired') {
+?>
+          <p><strong><u><?php echo MB_ACTIVATION_CORE_REQUIRED_TITLE; ?></u></strong></p>
+          <p><?php echo MB_ACTIVATION_CORE_REQUIRED_TEXT; ?></p>
+          <form name="activation" action="<?php echo tep_href_link('ext/modules/payment/moneybookers/activation.php'); ?>" method="post">
+            <p><input type="submit" value="<?php echo MB_ACTIVATION_CONTINUE_BUTTON; ?>"></p>
+          </form>
+<?php
+  }
+?>
+          <div style="padding: 5px; background-color: #ffcc99;">
+            <p><strong><u><?php echo MB_ACTIVATION_SUPPORT_TITLE; ?></u></strong></p>
+            <p><?php echo MB_ACTIVATION_SUPPORT_TEXT; ?></p>
+          </div>
+        </td>
+      </tr>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/ext/modules/payment/paypal/paypal_express.php 2.3.1.src/admin/ext/modules/payment/paypal/paypal_express.php
--- 2.2rc2a.cp.src/admin/ext/modules/payment/paypal/paypal_express.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/ext/modules/payment/paypal/paypal_express.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,51 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+  require('../includes/modules/payment/paypal_express.php');
+
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'test')) {
+    if (defined(MODULE_PAYMENT_PAYPAL_EXPRESS_STATUS)) {
+      $paypal_express = new paypal_express();
+
+      $params = array('CURRENCYCODE' => DEFAULT_CURRENCY,
+                      'AMT' => '1.00');
+
+      $response_array = $paypal_express->setExpressCheckout($params);
+
+      if (($response_array['ACK'] == 'Success') || ($response_array['ACK'] == 'SuccessWithWarning')) {
+        echo '<h1>Success!</h1>';
+
+        if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+          echo '<p>The PayPal Express Checkout credentials have been set up correctly for live production use.</p>';
+        } else {
+          echo '<p>The PayPal Express Checkout credentials have been set up correctly for the sandbox environment.</p>';
+        }
+      } else {
+        echo '<h1>Failure!</h1>';
+
+        if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+          echo '<p>The PayPal Express Checkout credentials are not set up correctly for live production use.</p>';
+        } else {
+          echo '<p>The PayPal Express Checkout credentials are not set up correctly for the sandbox environment.</p>';
+        }
+
+        echo '<pre>';
+        var_dump($response_array);
+        echo '</pre>';
+      }
+    } else {
+      echo '<p>The PayPal Express Checkout payment module is not yet installed. Please install it to verify your API credentials.</p>';
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/ext/modules/payment/sofortueberweisung/install.php 2.3.1.src/admin/ext/modules/payment/sofortueberweisung/install.php
--- 2.2rc2a.cp.src/admin/ext/modules/payment/sofortueberweisung/install.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/ext/modules/payment/sofortueberweisung/install.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: install.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -27,11 +27,11 @@
         $char = chr(tep_rand(0,255));
       }
       if ($type == 'mixed') {
-        if (eregi('^[a-z0-9]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[a-z0-9]$/i', $char)) $rand_value .= $char;
       } elseif ($type == 'chars') {
-        if (eregi('^[a-z]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[a-z]$/i', $char)) $rand_value .= $char;
       } elseif ($type == 'digits') {
-        if (ereg('^[0-9]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[0-9]$/i', $char)) $rand_value .= $char;
       }
     }
 
@@ -40,7 +40,7 @@
 
   // Module already installed
   if (defined('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS') && (MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS == 'True')) {
-    die('Modul bereits installiert<br><a href="' . tep_href_link(FILENAME_MODULES, 'set=payment&module=sofortueberweisung_direct', 'SSL') . '">zurck zum ShopAdmin</a>');
+    die('Modul bereits installiert<br /><a href="' . tep_href_link(FILENAME_MODULES, 'set=payment&module=sofortueberweisung_direct', 'SSL') . '">zur�ck zum ShopAdmin</a>');
   }
 
   $parameter = array();
@@ -159,7 +159,7 @@
 	wert = document.getElementById('sammel_input_email').value;
 	if(!is_error) if(wert == '') {alert('Bitte Email-Adresse eintragen'); is_error=true;}
 
-	//if(!is_error) if(document.getElementById('sammel_input_ustid').value == '' && document.getElementById('sammel_input_steuernummer').value == '') {alert('Bitte alle Pflichtfelder ausfllen'); is_error=true;}
+	//if(!is_error) if(document.getElementById('sammel_input_ustid').value == '' && document.getElementById('sammel_input_steuernummer').value == '') {alert('Bitte alle Pflichtfelder ausf�llen'); is_error=true;}
 
 	wert1 = document.getElementById('sammel_input_telefon').value;
 	wert2 = document.getElementById('sammel_input_mobil').value;
@@ -180,7 +180,7 @@
 select {Font-family:tahoma,arial,verdana; font-size:11px; color:#666666; background-color:#FFFFFF; border:1px solid #808080;}
 </style>
 </head>
-<body background="https://www.sofortueberweisung.de/cms/design/kachel.gif" leftmargin="0" topmargin="5" marginwidth="0" marginheight="0" onload="javascript:init()">
+<body background="https://www.sofortueberweisung.de/cms/design/kachel.gif" onload="javascript:init()">
 
 <form method="post" action="https://www.sofort-ueberweisung.de/createnew.php" id="form">
 
@@ -220,7 +220,7 @@
 	          <tr><td>Firma*</td><td><input id="sammel_input_firma" size="40" type="text" value="<?php echo STORE_NAME; ?>" onkeyup="javascript:giveValue(this.value,'user[firma]','user[r_firma]','project[firma]', '', '')"></td></tr>
 	          <tr><td>Rechtsform</td><td>
 				<select onchange="javascript:giveValue(this.value,'user[rechtsform]', '', '', '', '')">
-					<option value="">Bitte auswhlen...</option>
+					<option value="">Bitte ausw�hlen...</option>
 					<option value="AG" >AG</option>
 					<option value="AG & Co. OHG" >AG & Co. OHG</option>
 					<option value="ARGE" >ARGE</option>
@@ -234,7 +234,7 @@
 					<option value="KG" >KG</option>
 					<option value="KGaA" >KGaA</option>
 					<option value="OHG" >OHG</option>
-					<option value="Selbststndig" >Selbststndig</option>
+					<option value="Selbstst�ndig" >Selbstst�ndig</option>
 					<option value="VvAG" >VvAG</option>
 					<option value="Sonstige" >Sonstige</option>
 				</select>
@@ -246,23 +246,23 @@
 	          <tr><td>Mobil+</td><td><input id="sammel_input_mobil" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[anspr_mobil]', '', '', '', '')"></td></tr>
 	          <tr><td>Telefax</td><td><input size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[anspr_fax]','project[telefax]','user[telefax]', '', '')"></td></tr>
             <tr><td colspan="2"><hr /></td></tr>
-			      <tr><td colspan="2"><b>Konto auf welches die Zahlungseingnge gutgeschrieben werden:</b></td></tr>
+			      <tr><td colspan="2"><strong>Konto auf welches die Zahlungseing�nge gutgeschrieben werden:</strong></td></tr>
 	          <tr><td>Konto Inhaber*</td><td><input id="sammel_input_konto_inhaber" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[elv_konto_inhaber]', 'project[an_konto_inhaber]', '', '', '')"></td></tr>
 	          <tr><td>Kontonummer*</td><td><input maxlength="15"  id="sammel_input_kontonummer" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[elv_konto_nr]', 'project[an_konto_nr]', '', '', '')"></td></tr>
 	          <tr><td>Bankleitzahl*</td><td><input maxlength="8" id="sammel_input_blz" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[elv_konto_blz]', 'project[an_konto_blz]', '', '', '')"></td></tr>
 	          <tr><td>Name der Bank*</td><td><input id="sammel_input_bank" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[elv_konto_bank]', 'project[an_konto_bank]', '', '', '')"></td></tr>
-            <tr><td colspan="2"><b>Hiermit beauftrage ich Sie, die flligen <a href="https://www.sofortueberweisung.de/cms/index.php?plink=tarife&l=1&fs=" target="_blank">Betrge</a> per Lastschrift von meinem Konto einzuziehen.</b></td></tr>
+            <tr><td colspan="2"><strong>Hiermit beauftrage ich Sie, die f�lligen <a href="https://www.sofortueberweisung.de/cms/index.php?plink=tarife&l=1&fs=" target="_blank">Betr�ge</a> per Lastschrift von meinem Konto einzuziehen.</strong></td></tr>
 	          <tr><td>Ustid</td><td><input id="sammel_input_ustid" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[ustid]', '', '', '', '')"></td></tr>
 	          <tr><td>Steuernr</td><td><input id="sammel_input_steuernummer" size="40" type="text" onkeyup="javascript:giveValue(this.value,'user[steuernr]', '', '', '', '')"></td></tr>
             <tr><td colspan="2"><hr /></td></tr>
 	          <tr><td>Homepage*</td><td><input id="sammel_input_homepage" size="40" type="text" value="<?php echo tep_catalog_href_link() ;?>" onkeyup="javascript:giveValue(this.value,'project[homepage]','user[homepage]', '', '', '')"></td></tr>
 	          <tr><td>Email*</td><td><input id="sammel_input_email" size="40" type="text" value="<?php echo STORE_OWNER_EMAIL_ADDRESS; ?>" onkeyup="javascript:giveValue(this.value,'user[r_email]','user[anspr_email]','project[email]','user[email]','alert[alert_email_adresse]')"></td></tr>
-			      <tr><td>Email-Benachrichtigungen bei Zahlungseingngen aktivieren:</td>
+			      <tr><td>Email-Benachrichtigungen bei Zahlungseing�ngen aktivieren:</td>
 			        <td><input type="radio" name="sammel_input_email_flag" value="1" CHECKED onfocus="javascript:giveValue(this.value,'alert[alert_email_status]', '', '', '', '')"> Ja  <input type="radio" name="sammel_input_email_flag" value="0" onfocus="javascript:giveValue(this.value,'alert[alert_email_status]', '', '', '', '')"> Nein</td>
 			      </tr>
         	  <tr>
 	            <td colspan="2">
-	              <input type="button" name="Absenden" value="Absenden" onclick="javascript:submitForm()"><br><b>Nach der Registrierung des Projekts bei Sofortberweisung, unbedingt dem Link zurck zum Shop folgen!</b>
+	              <input type="button" name="Absenden" value="Absenden" onclick="javascript:submitForm()"><br /><strong>Nach der Registrierung des Projekts bei Sofort�berweisung, unbedingt dem Link zur�ck zum Shop folgen!</strong>
 		        </td>
 	          </tr>
 	        </table>
@@ -298,7 +298,7 @@
 		  </table>
 		</td>
 	  </tr>
-	  <tr><td style="padding-left: 20px;">* zeichnet Pflichtfelder aus<br />+ zeichnet Felder aus, bei denen mindestens eines gefllt sein muss<br />Alle Zahlen sind ohne Leerzeichen einzugeben</td></tr>
+	  <tr><td style="padding-left: 20px;">* zeichnet Pflichtfelder aus<br />+ zeichnet Felder aus, bei denen mindestens eines gef�llt sein muss<br />Alle Zahlen sind ohne Leerzeichen einzugeben</td></tr>
     </table>
   </td></tr>
   <tr>
@@ -334,7 +334,7 @@
   </table>
 
   <table border="1" id="table5" style="display:none;">
-  <tr><td colspan=3>Konto, von dem die Gebhren von Sofort-berweisung abgebucht werden:</td></tr>
+  <tr><td colspan=3>Konto, von dem die Geb�hren von Sofort-�berweisung abgebucht werden:</td></tr>
   <tr><td>Konto Inhaber</td><td><input type="text" name="user[elv_konto_inhaber]" value=""></td><td>*</td></tr>
   <tr><td>Kontonr</td><td><input type="text" name="user[elv_konto_nr]" value=""></td><td>*</td></tr>
   <tr><td>Konto BLZ</td><td><input type="text" name="user[elv_konto_blz]" value=""></td><td>*</td></tr>
@@ -404,4 +404,4 @@
 </form>
 
 </body>
-</html>
\ No newline at end of file
+</html>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/file_manager.php 2.3.1.src/admin/file_manager.php
--- 2.2rc2a.cp.src/admin/file_manager.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/file_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,354 +0,0 @@
-<?php
-/*
-  $Id: file_manager.php 1744 2007-12-21 02:22:21Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  require('includes/application_top.php');
-
-  if (!tep_session_is_registered('current_path')) {
-    $current_path = DIR_FS_DOCUMENT_ROOT;
-    tep_session_register('current_path');
-  }
-
-  if (isset($HTTP_GET_VARS['goto'])) {
-    $current_path = $HTTP_GET_VARS['goto'];
-    tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-  }
-
-  if (strstr($current_path, '..')) $current_path = DIR_FS_DOCUMENT_ROOT;
-
-  if (!is_dir($current_path)) $current_path = DIR_FS_DOCUMENT_ROOT;
-
-  if (!ereg('^' . DIR_FS_DOCUMENT_ROOT, $current_path)) $current_path = DIR_FS_DOCUMENT_ROOT;
-
-  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
-
-  if (tep_not_null($action)) {
-    switch ($action) {
-      case 'reset':
-        tep_session_unregister('current_path');
-        tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-        break;
-      case 'deleteconfirm':
-        if (strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-
-        tep_remove($current_path . '/' . $HTTP_GET_VARS['info']);
-        if (!$tep_remove_error) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-        break;
-      case 'insert':
-        if (isset($HTTP_POST_VARS['folder_name']) && tep_not_null(basename($HTTP_POST_VARS['folder_name'])) && mkdir($current_path . '/' . basename($HTTP_POST_VARS['folder_name']), 0777)) {
-          tep_redirect(tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($HTTP_POST_VARS['folder_name'])));
-        }
-        break;
-      case 'save':
-        if (isset($HTTP_POST_VARS['filename']) && tep_not_null(basename($HTTP_POST_VARS['filename']))) {
-          if (is_writeable($current_path) && ($fp = fopen($current_path . '/' . basename($HTTP_POST_VARS['filename']), 'w+'))) {
-            fputs($fp, stripslashes($HTTP_POST_VARS['file_contents']));
-            fclose($fp);
-            tep_redirect(tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode(basename($HTTP_POST_VARS['filename']))));
-          }
-        } else {
-          $action = 'new_file';
-          $directory_writeable = true;
-          $messageStack->add(ERROR_FILENAME_EMPTY, 'error');
-        }
-        break;
-      case 'processuploads':
-        for ($i=1; $i<6; $i++) {
-          if (is_uploaded_file($HTTP_POST_FILES['file_' . $i]['tmp_name'])) {
-            new upload('file_' . $i, $current_path);
-          }
-        }
-
-        tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-        break;
-      case 'download':
-        header('Content-type: application/x-octet-stream');
-        header('Content-disposition: attachment; filename=' . urldecode($HTTP_GET_VARS['filename']));
-        readfile($current_path . '/' . urldecode($HTTP_GET_VARS['filename']));
-        exit;
-        break;
-      case 'upload':
-      case 'new_folder':
-      case 'new_file':
-        $directory_writeable = true;
-        if (!is_writeable($current_path)) {
-          $directory_writeable = false;
-          $messageStack->add(sprintf(ERROR_DIRECTORY_NOT_WRITEABLE, $current_path), 'error');
-        }
-        break;
-      case 'edit':
-        if (strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-
-        $file_writeable = true;
-        if (!is_writeable($current_path . '/' . $HTTP_GET_VARS['info'])) {
-          $file_writeable = false;
-          $messageStack->add(sprintf(ERROR_FILE_NOT_WRITEABLE, $current_path . '/' . $HTTP_GET_VARS['info']), 'error');
-        }
-        break;
-      case 'delete':
-        if (strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-        break;
-    }
-  }
-
-  $in_directory = substr(substr(DIR_FS_DOCUMENT_ROOT, strrpos(DIR_FS_DOCUMENT_ROOT, '/')), 1);
-  $current_path_array = explode('/', $current_path);
-  $document_root_array = explode('/', DIR_FS_DOCUMENT_ROOT);
-  $goto_array = array(array('id' => DIR_FS_DOCUMENT_ROOT, 'text' => $in_directory));
-  for ($i=0, $n=sizeof($current_path_array); $i<$n; $i++) {
-    if ((isset($document_root_array[$i]) && ($current_path_array[$i] != $document_root_array[$i])) || !isset($document_root_array[$i])) {
-      $goto_array[] = array('id' => implode('/', array_slice($current_path_array, 0, $i+1)), 'text' => $current_path_array[$i]);
-    }
-  }
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-      <tr>
-        <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr><?php echo tep_draw_form('goto', FILENAME_FILE_MANAGER, '', 'get'); ?>
-            <td class="pageHeading"><?php echo HEADING_TITLE . '<br><span class="smallText">' . $current_path . '</span>'; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '1', HEADING_IMAGE_HEIGHT); ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_draw_pull_down_menu('goto', $goto_array, $current_path, 'onChange="this.form.submit();"'); ?></td>
-          <?php echo tep_hide_session_id(); ?></form></tr>
-        </table></td>
-      </tr>
-<?php
-  if ( (($action == 'new_file') && ($directory_writeable == true)) || ($action == 'edit') ) {
-    if (isset($HTTP_GET_VARS['info']) && strstr($HTTP_GET_VARS['info'], '..')) tep_redirect(tep_href_link(FILENAME_FILE_MANAGER));
-
-    if (!isset($file_writeable)) $file_writeable = true;
-    $file_contents = '';
-    if ($action == 'new_file') {
-      $filename_input_field = tep_draw_input_field('filename');
-    } elseif ($action == 'edit') {
-      if ($file_array = file($current_path . '/' . $HTTP_GET_VARS['info'])) {
-        $file_contents = implode('', $file_array);
-      }
-      $filename_input_field = $HTTP_GET_VARS['info'] . tep_draw_hidden_field('filename', $HTTP_GET_VARS['info']);
-    }
-?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
-      </tr>
-      <tr><?php echo tep_draw_form('new_file', FILENAME_FILE_MANAGER, 'action=save'); ?>
-        <td><table border="0" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><?php echo TEXT_FILE_NAME; ?></td>
-            <td class="main"><?php echo $filename_input_field; ?></td>
-          </tr>
-          <tr>
-            <td class="main" valign="top"><?php echo TEXT_FILE_CONTENTS; ?></td>
-            <td class="main"><?php echo tep_draw_textarea_field('file_contents', 'soft', '80', '20', $file_contents, (($file_writeable) ? '' : 'readonly')); ?></td>
-          </tr>
-          <tr>
-            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
-          </tr>
-          <tr>
-            <td align="right" class="main" colspan="2"><?php if ($file_writeable == true) echo tep_image_submit('button_save.gif', IMAGE_SAVE) . '&nbsp;'; echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
-          </tr>
-        </table></td>
-      </form></tr>
-<?php
-  } else {
-    $showuser = (function_exists('posix_getpwuid') ? true : false);
-    $contents = array();
-    $dir = dir($current_path);
-    while ($file = $dir->read()) {
-      if ( ($file != '.') && ($file != 'CVS') && ( ($file != '..') || ($current_path != DIR_FS_DOCUMENT_ROOT) ) ) {
-        $file_size = number_format(filesize($current_path . '/' . $file)) . ' bytes';
-
-        $permissions = tep_get_file_permissions(fileperms($current_path . '/' . $file));
-        if ($showuser) {
-          $user = @posix_getpwuid(fileowner($current_path . '/' . $file));
-          $group = @posix_getgrgid(filegroup($current_path . '/' . $file));
-        } else {
-          $user = $group = array();
-        }
-
-        $contents[] = array('name' => $file,
-                            'is_dir' => is_dir($current_path . '/' . $file),
-                            'last_modified' => strftime(DATE_TIME_FORMAT, filemtime($current_path . '/' . $file)),
-                            'size' => $file_size,
-                            'permissions' => $permissions,
-                            'user' => $user['name'],
-                            'group' => $group['name']);
-      }
-    }
-
-    function tep_cmp($a, $b) {
-      return strcmp( ($a['is_dir'] ? 'D' : 'F') . $a['name'], ($b['is_dir'] ? 'D' : 'F') . $b['name']);
-    }
-    usort($contents, 'tep_cmp');
-?>
-
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr class="dataTableHeadingRow">
-                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_FILENAME; ?></td>
-                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_SIZE; ?></td>
-                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_PERMISSIONS; ?></td>
-                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_USER; ?></td>
-                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_GROUP; ?></td>
-                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_LAST_MODIFIED; ?></td>
-                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
-              </tr>
-<?php
-  for ($i=0, $n=sizeof($contents); $i<$n; $i++) {
-    if ((!isset($HTTP_GET_VARS['info']) || (isset($HTTP_GET_VARS['info']) && ($HTTP_GET_VARS['info'] == $contents[$i]['name']))) && !isset($fInfo) && ($action != 'upload') && ($action != 'new_folder')) {
-      $fInfo = new objectInfo($contents[$i]);
-    }
-
-    if ($contents[$i]['name'] == '..') {
-      $goto_link = substr($current_path, 0, strrpos($current_path, '/'));
-    } else {
-      $goto_link = $current_path . '/' . $contents[$i]['name'];
-    }
-
-    if (isset($fInfo) && is_object($fInfo) && ($contents[$i]['name'] == $fInfo->name)) {
-      if ($fInfo->is_dir) {
-        echo '              <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' . "\n";
-        $onclick_link = 'goto=' . $goto_link;
-      } else {
-        echo '              <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' . "\n";
-        $onclick_link = 'info=' . urlencode($fInfo->name) . '&action=edit';
-      }
-    } else {
-      echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' . "\n";
-      $onclick_link = 'info=' . urlencode($contents[$i]['name']);
-    }
-
-    if ($contents[$i]['is_dir']) {
-      if ($contents[$i]['name'] == '..') {
-        $icon = tep_image(DIR_WS_ICONS . 'previous_level.gif', ICON_PREVIOUS_LEVEL);
-      } else {
-        $icon = (isset($fInfo) && is_object($fInfo) && ($contents[$i]['name'] == $fInfo->name) ? tep_image(DIR_WS_ICONS . 'current_folder.gif', ICON_CURRENT_FOLDER) : tep_image(DIR_WS_ICONS . 'folder.gif', ICON_FOLDER));
-      }
-      $link = tep_href_link(FILENAME_FILE_MANAGER, 'goto=' . $goto_link);
-    } else {
-      $icon = tep_image(DIR_WS_ICONS . 'file_download.gif', ICON_FILE_DOWNLOAD);
-      $link = tep_href_link(FILENAME_FILE_MANAGER, 'action=download&filename=' . urlencode($contents[$i]['name']));
-    }
-?>
-                <td class="dataTableContent" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><?php echo '<a href="' . $link . '">' . $icon . '</a>&nbsp;' . $contents[$i]['name']; ?></td>
-                <td class="dataTableContent" align="right" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><?php echo ($contents[$i]['is_dir'] ? '&nbsp;' : $contents[$i]['size']); ?></td>
-                <td class="dataTableContent" align="center" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><tt><?php echo $contents[$i]['permissions']; ?></tt></td>
-                <td class="dataTableContent" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><?php echo $contents[$i]['user']; ?></td>
-                <td class="dataTableContent" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><?php echo $contents[$i]['group']; ?></td>
-                <td class="dataTableContent" align="center" onclick="document.location.href='<?php echo tep_href_link(FILENAME_FILE_MANAGER, $onclick_link); ?>'"><?php echo $contents[$i]['last_modified']; ?></td>
-                <td class="dataTableContent" align="right"><?php if ($contents[$i]['name'] != '..') echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($contents[$i]['name']) . '&action=delete') . '">' . tep_image(DIR_WS_ICONS . 'delete.gif', ICON_DELETE) . '</a>&nbsp;'; if (isset($fInfo) && is_object($fInfo) && ($fInfo->name == $contents[$i]['name'])) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif'); } else { echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($contents[$i]['name'])) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
-              </tr>
-<?php
-  }
-?>
-              <tr>
-                <td colspan="7"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr valign="top">
-                    <td class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, 'action=reset') . '">' . tep_image_button('button_reset.gif', IMAGE_RESET) . '</a>'; ?></td>
-                    <td class="smallText" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) . '&' : '') . 'action=upload') . '">' . tep_image_button('button_upload.gif', IMAGE_UPLOAD) . '</a>&nbsp;<a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) . '&' : '') . 'action=new_file') . '">' . tep_image_button('button_new_file.gif', IMAGE_NEW_FILE) . '</a>&nbsp;<a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) . '&' : '') . 'action=new_folder') . '">' . tep_image_button('button_new_folder.gif', IMAGE_NEW_FOLDER) . '</a>'; ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-<?php
-    $heading = array();
-    $contents = array();
-
-    switch ($action) {
-      case 'delete':
-        $heading[] = array('text' => '<b>' . $fInfo->name . '</b>');
-
-        $contents = array('form' => tep_draw_form('file', FILENAME_FILE_MANAGER, 'info=' . urlencode($fInfo->name) . '&action=deleteconfirm'));
-        $contents[] = array('text' => TEXT_DELETE_INTRO);
-        $contents[] = array('text' => '<br><b>' . $fInfo->name . '</b>');
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_FILE_MANAGER, (tep_not_null($fInfo->name) ? 'info=' . urlencode($fInfo->name) : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
-        break;
-      case 'new_folder':
-        $heading[] = array('text' => '<b>' . TEXT_NEW_FOLDER . '</b>');
-
-        $contents = array('form' => tep_draw_form('folder', FILENAME_FILE_MANAGER, 'action=insert'));
-        $contents[] = array('text' => TEXT_NEW_FOLDER_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_FILE_NAME . '<br>' . tep_draw_input_field('folder_name'));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . (($directory_writeable == true) ? tep_image_submit('button_save.gif', IMAGE_SAVE) : '') . ' <a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
-        break;
-      case 'upload':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_UPLOAD . '</b>');
-
-        $contents = array('form' => tep_draw_form('file', FILENAME_FILE_MANAGER, 'action=processuploads', 'post', 'enctype="multipart/form-data"'));
-        $contents[] = array('text' => TEXT_UPLOAD_INTRO);
-
-        $file_upload = '';
-        for ($i=1; $i<6; $i++) $file_upload .= tep_draw_file_field('file_' . $i) . '<br>';
-
-        $contents[] = array('text' => '<br>' . $file_upload);
-        $contents[] = array('align' => 'center', 'text' => '<br>' . (($directory_writeable == true) ? tep_image_submit('button_upload.gif', IMAGE_UPLOAD) : '') . ' <a href="' . tep_href_link(FILENAME_FILE_MANAGER, (isset($HTTP_GET_VARS['info']) ? 'info=' . urlencode($HTTP_GET_VARS['info']) : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
-        break;
-      default:
-        if (isset($fInfo) && is_object($fInfo)) {
-          $heading[] = array('text' => '<b>' . $fInfo->name . '</b>');
-
-          if (!$fInfo->is_dir) $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_FILE_MANAGER, 'info=' . urlencode($fInfo->name) . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a>');
-          $contents[] = array('text' => '<br>' . TEXT_FILE_NAME . ' <b>' . $fInfo->name . '</b>');
-          if (!$fInfo->is_dir) $contents[] = array('text' => '<br>' . TEXT_FILE_SIZE . ' <b>' . $fInfo->size . '</b>');
-          $contents[] = array('text' => '<br>' . TEXT_LAST_MODIFIED . ' ' . $fInfo->last_modified);
-        }
-    }
-
-    if ( (tep_not_null($heading)) && (tep_not_null($contents)) ) {
-      echo '            <td width="25%" valign="top">' . "\n";
-
-      $box = new box;
-      echo $box->infoBox($heading, $contents);
-
-      echo '            </td>' . "\n";
-    }
-?>
-          </tr>
-        </table></td>
-      </tr>
-<?php
-  }
-?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/geo_zones.php 2.3.1.src/admin/geo_zones.php
--- 2.2rc2a.cp.src/admin/geo_zones.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/geo_zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: geo_zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -78,18 +78,12 @@
         break;
     }
   }
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if (isset($HTTP_GET_VARS['zID']) && (($saction == 'edit') || ($saction == 'new'))) {
 ?>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 function resetZoneSelected(theForm) {
   if (theForm.state.value != '') {
     theForm.zone_id.selectedIndex = '0';
@@ -117,26 +111,12 @@
 <?php
   }
 ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; if (isset($HTTP_GET_VARS['zone'])) echo '<br><span class="smallText">' . tep_get_geo_zone_name($HTTP_GET_VARS['zone']) . '</span>'; ?></td>
+            <td class="pageHeading"><?php echo HEADING_TITLE; if (isset($HTTP_GET_VARS['zone'])) echo '<br /><span class="smallText">' . tep_get_geo_zone_name($HTTP_GET_VARS['zone']) . '</span>'; ?></td>
             <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
           </tr>
         </table></td>
@@ -186,7 +166,7 @@
                 </table></td>
               </tr>
               <tr>
-                <td align="right" colspan="3"><?php if (empty($saction)) echo '<a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a> <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&' . (isset($sInfo) ? 'sID=' . $sInfo->association_id . '&' : '') . 'saction=new') . '">' . tep_image_button('button_insert.gif', IMAGE_INSERT) . '</a>'; ?></td>
+                <td class="smallText" align="right" colspan="3"><?php if (empty($saction)) echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'])) . tep_draw_button(IMAGE_INSERT, 'plus', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&' . (isset($sInfo) ? 'sID=' . $sInfo->association_id . '&' : '') . 'saction=new')); ?></td>
               </tr>
             </table>
 <?php
@@ -235,7 +215,7 @@
                 </table></td>
               </tr>
               <tr>
-                <td align="right" colspan="2"><?php if (!$action) echo '<a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=new_zone') . '">' . tep_image_button('button_insert.gif', IMAGE_INSERT) . '</a>'; ?></td>
+                <td class="smallText" align="right" colspan="2"><?php if (!$action) echo tep_draw_button(IMAGE_INSERT, 'plus', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=new_zone')); ?></td>
               </tr>
             </table>
 <?php
@@ -249,37 +229,37 @@
   if ($action == 'list') {
     switch ($saction) {
       case 'new':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_SUB_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_SUB_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&' . (isset($HTTP_GET_VARS['sID']) ? 'sID=' . $HTTP_GET_VARS['sID'] . '&' : '') . 'saction=insert_sub'));
         $contents[] = array('text' => TEXT_INFO_NEW_SUB_ZONE_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY . '<br>' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(TEXT_ALL_COUNTRIES), '', 'onChange="update_zone(this.form);"'));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_ZONE . '<br>' . tep_draw_pull_down_menu('zone_id', tep_prepare_country_zones_pull_down()));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&' . (isset($HTTP_GET_VARS['sID']) ? 'sID=' . $HTTP_GET_VARS['sID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY . '<br />' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(TEXT_ALL_COUNTRIES), '', 'onchange="update_zone(this.form);"'));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_ZONE . '<br />' . tep_draw_pull_down_menu('zone_id', tep_prepare_country_zones_pull_down()));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&' . (isset($HTTP_GET_VARS['sID']) ? 'sID=' . $HTTP_GET_VARS['sID'] : ''))));
         break;
       case 'edit':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_SUB_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_SUB_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=save_sub'));
         $contents[] = array('text' => TEXT_INFO_EDIT_SUB_ZONE_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY . '<br>' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(TEXT_ALL_COUNTRIES), $sInfo->zone_country_id, 'onChange="update_zone(this.form);"'));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_ZONE . '<br>' . tep_draw_pull_down_menu('zone_id', tep_prepare_country_zones_pull_down($sInfo->zone_country_id), $sInfo->zone_id));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY . '<br />' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(TEXT_ALL_COUNTRIES), $sInfo->zone_country_id, 'onchange="update_zone(this.form);"'));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_ZONE . '<br />' . tep_draw_pull_down_menu('zone_id', tep_prepare_country_zones_pull_down($sInfo->zone_country_id), $sInfo->zone_id));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id)));
         break;
       case 'delete':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_SUB_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_SUB_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=deleteconfirm_sub'));
         $contents[] = array('text' => TEXT_INFO_DELETE_SUB_ZONE_INTRO);
-        $contents[] = array('text' => '<br><b>' . $sInfo->countries_name . '</b>');
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br /><strong>' . $sInfo->countries_name . '</strong>');
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id)));
         break;
       default:
         if (isset($sInfo) && is_object($sInfo)) {
-          $heading[] = array('text' => '<b>' . $sInfo->countries_name . '</b>');
+          $heading[] = array('text' => '<strong>' . $sInfo->countries_name . '</strong>');
 
-          $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-          $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($sInfo->date_added));
+          $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=list&spage=' . $HTTP_GET_VARS['spage'] . '&sID=' . $sInfo->association_id . '&saction=delete')));
+          $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($sInfo->date_added));
           if (tep_not_null($sInfo->last_modified)) $contents[] = array('text' => TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($sInfo->last_modified));
         }
         break;
@@ -287,40 +267,40 @@
   } else {
     switch ($action) {
       case 'new_zone':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'] . '&action=insert_zone'));
         $contents[] = array('text' => TEXT_INFO_NEW_ZONE_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_NAME . '<br>' . tep_draw_input_field('geo_zone_name'));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_DESCRIPTION . '<br>' . tep_draw_input_field('geo_zone_description'));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_NAME . '<br />' . tep_draw_input_field('geo_zone_name'));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_DESCRIPTION . '<br />' . tep_draw_input_field('geo_zone_description'));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $HTTP_GET_VARS['zID'])));
         break;
       case 'edit_zone':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=save_zone'));
         $contents[] = array('text' => TEXT_INFO_EDIT_ZONE_INTRO);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_NAME . '<br>' . tep_draw_input_field('geo_zone_name', $zInfo->geo_zone_name));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_DESCRIPTION . '<br>' . tep_draw_input_field('geo_zone_description', $zInfo->geo_zone_description));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_NAME . '<br />' . tep_draw_input_field('geo_zone_name', $zInfo->geo_zone_name));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_DESCRIPTION . '<br />' . tep_draw_input_field('geo_zone_description', $zInfo->geo_zone_description));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id)));
         break;
       case 'delete_zone':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_ZONE . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_ZONE . '</strong>');
 
         $contents = array('form' => tep_draw_form('zones', FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=deleteconfirm_zone'));
         $contents[] = array('text' => TEXT_INFO_DELETE_ZONE_INTRO);
-        $contents[] = array('text' => '<br><b>' . $zInfo->geo_zone_name . '</b>');
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br /><strong>' . $zInfo->geo_zone_name . '</strong>');
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id)));
         break;
       default:
         if (isset($zInfo) && is_object($zInfo)) {
-          $heading[] = array('text' => '<b>' . $zInfo->geo_zone_name . '</b>');
+          $heading[] = array('text' => '<strong>' . $zInfo->geo_zone_name . '</strong>');
 
-          $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=edit_zone') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=delete_zone') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>' . ' <a href="' . tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=list') . '">' . tep_image_button('button_details.gif', IMAGE_DETAILS) . '</a>');
-          $contents[] = array('text' => '<br>' . TEXT_INFO_NUMBER_ZONES . ' ' . $zInfo->num_zones);
-          $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($zInfo->date_added));
+          $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=edit_zone')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=delete_zone')) . tep_draw_button(IMAGE_DETAILS, 'info', tep_href_link(FILENAME_GEO_ZONES, 'zpage=' . $HTTP_GET_VARS['zpage'] . '&zID=' . $zInfo->geo_zone_id . '&action=list')));
+          $contents[] = array('text' => '<br />' . TEXT_INFO_NUMBER_ZONES . ' ' . $zInfo->num_zones);
+          $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($zInfo->date_added));
           if (tep_not_null($zInfo->last_modified)) $contents[] = array('text' => TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($zInfo->last_modified));
-          $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_DESCRIPTION . '<br>' . $zInfo->geo_zone_description);
+          $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_DESCRIPTION . '<br />' . $zInfo->geo_zone_description);
         }
         break;
     }
@@ -338,16 +318,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/.htaccess 2.3.1.src/admin/.htaccess
--- 2.2rc2a.cp.src/admin/.htaccess	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -1,4 +1,4 @@
-# $Id: .htaccess 1739 2007-12-20 00:52:16Z hpdl $
+# $Id$
 #
 # This is used with Apache WebServers
 #
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/catalog.gif 2.3.1.src/admin/images/categories/catalog.gif
--- 2.2rc2a.cp.src/admin/images/categories/catalog.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/catalog.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,9 +0,0 @@
-GIF89a      &gʦࠐk`n?*ZgiNnr^vQLĴG*:̻W@h~g{c=?/A:.ų'|atܺha!     ,         !dihyt*"2ӥK"I4 @ GB`@Xf8z+2B"!!TcGQD$"S
-	V}~c)
-kW)I
-)p Cr)	j)~'c	


-
-$y

^6|gÃFV4(`A=_s@`&D($@4(`d\,8`Όha
-80]>ٰe{X@]wy
-@P ϟsFxH @6 `	* 'S	m$2[UZBZS`y(eaIs0l aQ+PvR00
--a@   ۞hpO~!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/configuration.gif 2.3.1.src/admin/images/categories/configuration.gif
--- 2.2rc2a.cp.src/admin/images/categories/configuration.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/configuration.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a      ONk76Jooo53i63-,,;ۭ҇熆`_xOL j>>Vݸ
$"V!     ,          dih走Pqx5
Ò+y(#Bi4:b31,  ġ8LNm2 HpC|6n  N-N L|&X
k#r
 %@dZ/#3
-k5 IaZkٶ NV&0`Àsֵ{ 3`  X0@&Pd߁~H 


- Vxq"0` qL\ 'Ȓ'S<СK
N|@:yPRAJZyzG*]$<lP N?	
- V:+fOxg\EP	XgД\>ͺװc ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/customers.gif 2.3.1.src/admin/images/categories/customers.gif
--- 2.2rc2a.cp.src/admin/images/categories/customers.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/customers.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a      ږ42t0(186WlhHSY=E30FCLix	RMIDClzVbF290u{zHwd]_^* $"V%!
-!t!     ,          dY~S)f떏1dpuOr3.5X,.&:c0-y-!a|BH x|%E
-x	x$  	g
- w~s\  Vw
w	sy,FxxE7	xLբ'(|P@@\I8"
X,!`[Mb#<h
x w)48O@
Tb

H@@Hp@
tVd(	 km !<j[S ,%4+"	8,*!`'`
d]<(P
;I 0:;VeAڄȜ	@L@|qm
- ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/localization.gif 2.3.1.src/admin/images/categories/localization.gif
--- 2.2rc2a.cp.src/admin/images/categories/localization.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/localization.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,9 +0,0 @@
-GIF89a      m"~fA_UJk\r	Xedؐ"(.M7Dh}>Mׯ@[o!)|

$)1kֿ=\IQ7!     ,           dih,I@@(xE~|"B)H$ 	b+r8&I8	3ӋZ8D`5FxВM<&#
^%		



^a H]
~OA|	ov
-Z; G
yYvN
-lo	WGH
-9^o
V	
-5PтSI=`K2D$ң@,% CE\R!{6(8	vȜ\xɋOn«$d  o P+ 
-B] G4hh`\ o>	fYM,I8x$x#ҙ   He֘H
-WܳK\ݔ$ӛRDB>͓&pt$"G
-=Bۍ
-U<b>F} -D ϽX'8Pడ|@12EA~ND	@4(  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/location.gif 2.3.1.src/admin/images/categories/location.gif
--- 2.2rc2a.cp.src/admin/images/categories/location.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/location.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a      VVliZjp쩑66E --m+#$4oRĪR9001 \BAГ 7ODE[i1"uRFЬ!     ,           dihD
+`N<rb2"#`M@0	0fFbLV!0.5F<,co
}ruc}@)acg~p+JUcq*	b*ak6Z'҉W'x	Q	N&eH' ?aF``!-
-|
1 @'aԸ%G	l
 ˖	K 
-'A{/_Bb"tB&",u&-|P
H*n-B⩩}09\@Ht4 Pewӫ h`BN.PAfe[A2tp09/m'2$F>W~(@a&XeP"`a% i9"0`oË? ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/modules.gif 2.3.1.src/admin/images/categories/modules.gif
--- 2.2rc2a.cp.src/admin/images/categories/modules.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/modules.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a      cgMJ?>irNqu2zR0,º(LgEKx&b[C:v52:Y>^! Xr!     ,          ׍dYnQlYA,xb A#0Ho\DcOh0-a@x*9&˷M>xos`Yn1|&vz3
-
-Ij#x
^°


 а ?	l<
-4a]p
-:(LCjk ?a>d
-	xȑʕ.aؙ1FPMΝ	Tpѫ203ZG[A(5VUje45(/-\%RB  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/reports.gif 2.3.1.src/admin/images/categories/reports.gif
--- 2.2rc2a.cp.src/admin/images/categories/reports.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/reports.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a      WWK$$d`c^OOg33(-X)Мdb6Ct1+9+
xxUOQ£@Q*yz:>T"-E+'"$!     ,         di#/$A.\zހCxJgAE`(Ϣr
(>0b*(/	ck
-DP-)	
-tv&~]ug%f-fxx lcD	JKq	?	aA
	Ǉ!瀃4~
haX5	s! Z  "2jG C	R!O svγ糩%hc
-I0д6yqts5!xPh={F0@_	8S#B.et``C==rxp4(1@BZc/ļpmrk4F5qibxpAp?>n.8ŗSÃ8hƋ KO  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/categories/tools.gif 2.3.1.src/admin/images/categories/tools.gif
--- 2.2rc2a.cp.src/admin/images/categories/tools.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/categories/tools.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89a      S^.bh6XbP]o&7v^%J"
-Fq
-<ѽ=e^6'cr0EJ*
G#Q!     ,         !dihlp/]\" !]dx~FcA:f[1fqxΞbp  M%#|%(
-	:$
- 	"Zqrrc
-
-u_		Gpqry}`	lp[ zp
			|ap	

-
-g`__	zCA_ m8eKc(NA}dyC:h G|4fQ	m@[ (@ϧ(<Ҁ
-xx	C ME!F? yҲ2@>`ԩ<_i|Z @?243*b!3k̹!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/header_administration.gif 2.3.1.src/admin/images/header_administration.gif
--- 2.2rc2a.cp.src/admin/images/header_administration.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/header_administration.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89a2 2  HI\^jlSTnpgiqsrtpruvnpces56wy{}y{=?aQS|wxZj.*-eWb~}~woOO`\_jlwy57IdjAD\mo}s{kr;?UUZzPTkegt榵詷쌘ʰڶ#su~慇w|\`dXYZORSp|}luukoodeeͲ;BA nZ[L5,+uAǥ;v7bWֲ#|eRݹ`Hobvxw786z{xcdUШssrN{WR@|P=9:4sk&fɎmtrkIHEp9w2DƏXDͻ݊o饏ųȷ|4tkój`aYɛ{rҤkTN鸫署pkmihl]J84ġäypݭidǿľ{heyw\@=bIFÊyYV½}յ}rq~C@j[ZپT$$¶𛓓ǽNNN!   ,    2 2   	H*\ȰÇ#JH9lth/NE6'gD>l1̇_}c*۷q1N6Ag*oIraB"DhQ	Q2Y&N:L^di"&,(L,aڗ(Wh
epБ#
-^
-ʓL8UNШV-ePb6#LZpn+=r)7_'ΥPT&K>y%il+Wr`.0PWm$J8$8ټ2K.(ʂ0FA3,K7 pQF`8AO0+(K+FAt#0M;`|p1ArN
$4b..d ̖dL1U>O3ӏlcb.3A@0\s0 )
!G4,++ D3[Ȇ!/6٨G+K0W"9dp
3s1a$JBXS2X?a
-,貌,FBc8 L1 sJ	$2B/T>%80̂M()
壍6P@A64
4J.ܱG$lk>3dB\EYdÍ68c2 RHd`6P+88P@4$DaBVpJf>iuhs4l
A@E	w#VPMTH6d5x7ݜ 7D94Ph l+_q
-Ts%CP
-\@IU@9^N9΍2(بS ,3
h+>EFF4@(P	_х<tc:L@:?-=t@D@PALA(BbЂa9A
-&(4xˀ   ap!Z ) Ov@p	M`  	4?p4 8 @
y bpDqu`C	xы>A|@/>!	9
<D@ 0  u# 
] GXFl@~!$m`4ЀL a7~Et,'!<"W	$ce$q @X@Dva oX p
-QBzh'>xVLH&PƑ C*C٘.h@	@B
RL36 CL
2 bR@,AJAT؁"k0zz	N=h)0}T|,V4HX&`BjP!XԋQH
"@@TcIq
-w+0<EF!!8TH# "Rըv0	@3a`E56	h; vPT
@"uP IxTy,Ah֧QJ|#dA*d80fn=D`P0ԃ(
(<>`L`&0 v<C!⑇D"~0 Ȱ-LY2  =xBnfF"l@AC!GlP( SB
-*(@r7cC!*<;D$C2 ЀIpr H q
x@DEQ}H0;nc D 7@D\hN6#fL:xFH@  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/header_checkout.gif 2.3.1.src/admin/images/header_checkout.gif
--- 2.2rc2a.cp.src/admin/images/header_checkout.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/header_checkout.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-GIF89a2 2  
-3/8B?Osn42?IGZfc{! +WUinl+*7^]sꦦݕOOa~~<<I{{궶vvøҢCCJ99=rrwggjJJLgiq%E
-8
-%9e/Q$=!3Vd
.Gl_:X2L|QzjYp&LnlyobdfAZrkTi{%8Gw	)?O&@hy{7T\GRU$7;(+6\b`/QRmӒ44)HHvSGvvWeep}}q! Apm0/:hd'CA 
-   &&SS0効znnJ
//!duΙaaHס||`@@4yyu<<:mmj&&%cca}}}{uus򃃁SSRLLKPOMNKH543987 )%$1((nhh.,,YVVHFFCBBzyyqppihh_^^̨ۼvvvnnnkkkfffZZZMMMIII@@@###			   !   ,    2 2   	H*\ȰÇ#*Lw4q$j,X.
i 98hCL%!"{&A5rވy!_;aǌfl0=jqm9r`Ct!*nxc 7&4Ǥ'IL-BcT0]mPڦHÍƫ!NCwAm,AAMܳwELc
/^MвkcWakK)RX͉$G$UM[p]m4{ԕӵiϗ.t.HG	r$IRp&aN8$AAxiP4]P!!08"~dH;ظC;- :C:3N=ҐM_HO\3lb Y4QxH" 
3+A AƤ?tC4ePAULQ쑉Zp]H'TL:31sD0$32XE~!qPaEXDD0	Ec<L0@G:H]lŜ[AF#,a[lQ!c@3>+`C0BL]xS/]hO_@!`dq.w,2G!y 
--ͬ8i.Yp]Dn"pr
-0
PÐj8eZ|!F(|AT
-G\ 
-x#
;EXsE 
,@B
-"lP܂"XP	&t.*7.A  PC_ ڌO0N
j0CИ:x#84S7		<G#sHOW L<AÎ;! Atx'<a n4R0RB
4,O0`s<l@hkp9$C 	; E@$+  5* miŠKBI { b܂\ ,
|RU	P.  @&i	`
 \	V>b 
(@HAwm ?Hapv` 2N0n.
(DWP6Pȳmp@@ ܀,Vh0 ( 67
zw",la@01-jd_t0zaxXE6|| v0!}i! x<J^0y`4
zA\Qr40ȠA+b1Y0~Xz2x=x<_A<p W )-qPy7 4(OmC@`EPg
-WGA7 $=4]x*h!#W@
-f 6(B>UKBUQъdc1D 
-@UcV
m !#˰K:1]/Q7\{c8hdMnq ;4`>bWGu`x1dWшp0lր
- Q{<{.+^cB^b8QEqP%/1`l!> %?Ag;1pX7"q(7dp\T4]I8F?`kZH*ZcZ:z@`p8/$>ڲ6		 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/header_support.gif 2.3.1.src/admin/images/header_support.gif
--- 2.2rc2a.cp.src/admin/images/header_support.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/header_support.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89a2 2  -.UVkl   

-
-	**l'l	??66JJBBw/wh*h\&\R"R<d+d==Kt5t44--<[+[""x9xIm4mTYe3eXTf¼cS,St?tjpʳcVnH(HsvѼjj<jsn©a]Lrp~z|xwvuzͲjtEtt=%=V^<^}Q}%%nInT8TiTixex
-	
-~z(#,    
	"5	
&H 0g8P(<y)O8Ud7PKmV|['=9HkRyOu`d(5P\]_DcniOpXdyz	gqlejHWojow	
马686Ҝ-.-溽ԴWhQ菑IXAx}uj%M*?AmmR֪YoD##!332IIHйiihQεhgepomڍ  ð_ x? qYU+7 ɽC82;*!k[UXLHyTSSåaaaAAA>>>   !   ,    2 2   	H*\ȰÇ#JHŋ3jȱdٲ!bT&VIMB+^&tJ=O'BgDɑX53(YbT>"8|&1k{@^^{tPa8
-[T+bX` .뗲
+8#Aʫ1+XQ˄(f$9$TFQ?Vq2E*$)£fȑL+Q6t`jLoBweSXDe)3Pɔ&\ 
EԐ)2@46?~1W&@!t
7TF<t0jD?D)q8`4@)h@Rd oAHq t0&-E(J<`OJD@@,- 	XO'3<9#!$<#Q\@n+pPPA!$RDr@
-/B
-"J1j	%k#uX3&|>[ИB6ĀQ\qjAޔ!rFxH$b;lӌBpdB
-CT?p "yFk! u,6x=@1D 4a>q}|
4܃8C
^	JMXO?e1aoeN8hSBcr (ܰT@:ԠF+I02! WL`ZbPi!h!v%p3
9倳M5	5]$pB!t	9pC:]tc-̟J/
lBEH1	:HѝA
-	~4*%N9	/ K<@F 60-AG G$ƃ9H K-tG?D	Oxb@4B:cDF8q  &t\APd2H>NC!pw>ȡAj`"/ER (3a}G,bxWdCF22x#=|]p Hb^6p_ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/.htaccess 2.3.1.src/admin/images/.htaccess
--- 2.2rc2a.cp.src/admin/images/.htaccess	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,10 @@
+# $Id$
+#
+# This is used to restrict access to this folder to anything other
+# than images
+
+# Prevents any script files from being accessed from the images folder
+<FilesMatch "\.(php([0-9]|s)?|s?p?html|cgi|pl|exe)$">
+   Order Deny,Allow
+   Deny from all
+</FilesMatch>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/icon_facebook.png 2.3.1.src/admin/images/icon_facebook.png
--- 2.2rc2a.cp.src/admin/images/icon_facebook.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/icon_facebook.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         a   bKGD      	pHYs   H   H Fk>   IDAT8c`02000$V4)0oadb``` U3b3ty2r30000D̈́1c ft@L.8,+%x
x+`|]fa@@dcP#H[ξq] #p% 5J  'T)b_"    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/icon_newsletter.png 2.3.1.src/admin/images/icon_newsletter.png
--- 2.2rc2a.cp.src/admin/images/icon_newsletter.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/icon_newsletter.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         a   	pHYs        gAMA  |Q    cHRM  z%        u0  `  :  o_F  *IDATxb@  QPPp/?2<yo~?_@/oL&L @,0X=e`bdǠ-F&߿0010p
+2@  ??103ee`ggF$/ qLN  a ,rK"bas|>`fq#Bm$_ynA0333dۏ?6@Е0 @pxxxXXX
+@F8rH  0 	6߿pC~
v	+++  ߿0E M @o߾
;`%X=@ 
 9a at...p؀  FA{dHx  ܀W^Ah+ȩ޽d8H'O02@ 
 i0ȿRRRx JD_~VJƅ 7@@@ l( X܃ Ȁ#k@p1]jK LX  :?x3d    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/icon_rss.png 2.3.1.src/admin/images/icon_rss.png
--- 2.2rc2a.cp.src/admin/images/icon_rss.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/icon_rss.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,6 @@
+PNG
+
+   
IHDR         a   gAMA  OX2   tEXtSoftware Adobe ImageReadyqe<  yIDATxTOHTQ֘PhIFj#MAѦvBr!DD 7EҬUPih8O.p޹| m:a\UUƕkC6OcFE[ pG^TYoby%'cǻGz\HXSJ@(c
AI] "ns
t	8WsJ+jlP#.=-#Ⱦ%lmؑ\,B^Q }a+c?am6u@o05*6bJ+ 76Oup=
+&]!)PWy7|M
p<z|7_&,Hxն_F
kR{'Lf`EEc~2`P%EyƯ	;d;E93K@ݐZdCD^J{RĒҧfA_ZԅRJnnW-G$mY{+!ƻ
+ 0Uwq͆K?8}qVτaXV6#*aۈg[67#FkԱۈMfU6lKx
+\6'Ģ%hH/7;K2{\84`T_So`PE' o,#    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/icon_twitter.png 2.3.1.src/admin/images/icon_twitter.png
--- 2.2rc2a.cp.src/admin/images/icon_twitter.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/icon_twitter.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         a    cHRM  m  m      m      m      mGK
  IDAT8uOk\e?1365C?@.Z U]Ѕԥ.D4XAcRmBdr̼MP<,9+/|Rū1%pR
+y";Gߺt}ҹO&UETk1A ʗo=j$I((hdΓTT3n/殼fGG*L33ĔXv؝g*֌{!Ԯ 9GyRr$I<3$݇cj^̒]McW9
!P<dʎ]Va1v1ƐPŀ
QT!
+xg%	Ѓ+]$$&_;L#$	3е^h:e"`-!,a 8\6iG/l2*,#!H8>09J7B 77[[G),'ň=! |y2T݅ov3XPOS "
Ru-keY2ǰ01""dƄPPU.?X ?{1@^4P5+W׆'zgtGYVwZ4cleSVU
iIi^|u۟v֊~1J9&L&%%i7    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_error_bg.png 2.3.1.src/admin/images/ms_error_bg.png
--- 2.2rc2a.cp.src/admin/images/ms_error_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_error_bg.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      (       tEXtSoftware Adobe ImageReadyqe<   'IDATxb	L!0>>66:;50@ NC,M    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_error.png 2.3.1.src/admin/images/ms_error.png
--- 2.2rc2a.cp.src/admin/images/ms_error.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_error.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+PNG
+
+   
IHDR           szz   	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-    cHRM  z%        u0  `  :  o_F  IDATxė]lguA"(ڴ ʳ(yABBj_m+%*(R"5Q,78XiK556&g̽}]{6)G:;gvs9\~>	fKZ8 `E_Yv?={hټ	4]m;4)BkZB'~=tH,Ѻ./r/zz<8jX
G{hغu5z~͢ЮWH Zc߻ُ?)wWdPຠZclVdKJ)u?5N:A/,,7R@¿y?ܶAy^Wߕ+nHTxW<rK/ffGF2}9߇|_c<bzjwXuNTi':_nB!`Y-+֎<~2 ⋘qTUui:08BaS(=<<Ww]S)(\8x$bw[aH޾ƿq#
+oʆ.R|"q02Bg_Ɩwe@kx){Q
Ν;	g2lvɳ784.˅Q_~	@U'&=uYgD&'peoY&'10\7b1ҳmVg<Ft>_qЮ5vFݵMk~>Y5x77zb}<t1Ns2b_moG
b`su*BONff?mt>r`k賶6beaȹ9*KURUc$R =q@B(ץ,}
+!M!%Bej
+)}`@ru("^B'nݪ1hU֭oazQ$|>l(2\){Qd$°m|^
ghjy!D4kr!Xx"EZy)+߿86,X,0&rO>Y7Ʌa "XiY|1>}w}?>=8FSӊ ƛ8+3$XȆ+.sz,$JT3S&8ƍ6 c1D(ĪXƍ8&3Sz#ٱt:,z0~.烓<U. 썍p3ӧc+ɼi}hyuP<4hyhBSq8e!a6\ffNt[olĚ w;c|q7lX$T)4W(W\buOf\j  l6ϨWw.
>q-r&Hizya,7=Ek!8@ wll[BBXB
+E?1^,^u`dKzԪWI dD    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_info_bg.png 2.3.1.src/admin/images/ms_info_bg.png
--- 2.2rc2a.cp.src/admin/images/ms_info_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_info_bg.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      (       tEXtSoftware Adobe ImageReadyqe<   5IDATxbzӿL0?%"?PHHS (ZZ>    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_info.png 2.3.1.src/admin/images/ms_info.png
--- 2.2rc2a.cp.src/admin/images/ms_info.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_info.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,22 @@
+PNG
+
+   
IHDR           szz   	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-    cHRM  z%        u0  `  :  o_F  ^IDATxė[l}{:$
+n	I/Ĕ	Dj 	(U/6BUEJ*Ԩ}qD^Jy*Q%Q#r6	KY]î6N_87߷sfgfΜ9Z<4@{*4@
+x8E_p/-[_aq5$J)(z>O?R%J[YǖT%\2"ϡ͡S.{W5.񃧞3ia܋ h		-YT]kʕqhk{vΛ_m~pM7}dِ c-Vm,%6XPuo:o|?Z(O=m #S42
`|N,Pp0OYe
Dƴ|p= ^wla2!=BbcKc;ͯ9 ~S|/䁱@.9џ;lY}W*sZ>|̹^dbO=)7<P'K߽o,3}#=TkqW
+MaUsW
+?M/MәxX߀CPۇ|BQC_\l!PRݏ}y5]#~)0`-t^,4_LҸMd&ʇ{Uψa[Ж)L?|qXMy3w-|K_ay2.l-X@`*2Ӹ?f-LOBH@C}z{0;|c-|X| a24dCC60
7"C.xqAo6qu ͕9S	HD/MaUr3|ޔ+n_-4J 'وXcBì-z+ޤ I
+ʷǢ	L&ޭ H%P$(x*Ez1ãJ@e!j8@;R2/
+{ʫ^QJ s#}B'$RK97ݴ9\PF Wh>N2Qzn11BYc' pvpIܤM)+Z $7Q&LǆrR+pS
+7):Ey<^z˒H)ܴFpTa3 鷸Κikv%nZH)b/ȹ3 Ļzڎܶ4R
+/&-<{tx)IE"ɡ#XlT+e^n;F"Hj5'%Q@9H(PII5T&Vt#;8l
l-]q (0QR8iDqծM*܄DIÅ>۵ot֛W^<ݾU5:::EUtVS}JF&8n7>mW,EywSדJJf ˪Rs8޽coEq [(ަg{5V/n\F͒%8$RkLz١!F{.srdđo?yAwY|`k;M뚆V4Ew4ġ\41]u F3v
 zpa8W(    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_success_bg.png 2.3.1.src/admin/images/ms_success_bg.png
--- 2.2rc2a.cp.src/admin/images/ms_success_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_success_bg.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      (       tEXtSoftware Adobe ImageReadyqe<   5IDATxbLl̇ՠ3  _/ߌy    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_success.png 2.3.1.src/admin/images/ms_success.png
--- 2.2rc2a.cp.src/admin/images/ms_success.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_success.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,20 @@
+PNG
+
+   
IHDR           szz   	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-    cHRM  z%        u0  `  :  o_F  IDATxė]lTwf
8(I)
TP`>V壭Z}k6J5j_M*H	F">8IKp
{1^ޏ^^:{gs̹;i;l
+`ͯ5Sr`@hM3	ǡknaP%|f%f#",}[mNVkxN)w_ݚ-$* c2\agj>D+.^mzTbɅYQ|#!F`A
+'TzsHzUԭ}U7v_l5P[SWrisD&Xc
3Z8{sWl}:Ny/gJ`㵛|'1#]:_Ld)R$ӝig@^`AON)QJoܿl?Jl経1L'<+)QjgT/{6si[ŎҚxJ~CejH8ji"u<Os%ϖ?@J/~x:g@BN";q][NvL
+mDƧcߪx)صδ<ayh
+qfk1`Y)Μ"2>܀P8sYQ8 YJ`Ӳ⪾L>-fa@׮M>gNv p>16D[c(h l*%q}Ȟbd6':'M<j
)c,!Ɔz3̯XJ`*jL0YL)z<NB]	-;yyjh__%йxI,p: 4>h
94;{by?h]\hK私GN d`A)o(_1Lm&'ݗ=UH?tPBq>KhS%R8ӂsϹi=Au+u%3 p1C<pDI|g㚛;\7ԕR)E K	ĕzM#k˂7Y;mnK'%c>RCqJPEJNqẛ. 
c#KuIeM`oj-]Iuop)mr:MB)%DYIwt-eN<!I*R|r	k^@;^nk"\$R
+pnۥxJ\*=|.L 7:
cN<2KPV
+WH#f쮐$ʭ`.cw6uP*Tx̪H*ׄpKIAR)fUx̩tckP˵d[/yozA<HB3e3eʥB)u8:Gk7jL6疑|̭Nt=6c('RFF́׆]{n+ͯ
H-USP!5wp~2Z ZʼNӕ:맟>sg-^x72dE)Atu
DWoQvݰ2Q}8س"}ղFN#p!4Fu_7lIoF! 17}5 iƓ1,    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_warning_bg.png 2.3.1.src/admin/images/ms_warning_bg.png
--- 2.2rc2a.cp.src/admin/images/ms_warning_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_warning_bg.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      (       tEXtSoftware Adobe ImageReadyqe<   .IDATxbLPdb?Lo@650@ P!l    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/ms_warning.png 2.3.1.src/admin/images/ms_warning.png
--- 2.2rc2a.cp.src/admin/images/ms_warning.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/images/ms_warning.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,28 @@
+PNG
+
+   
IHDR           szz   	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-    cHRM  z%        u0  `  :  o_F  IDATxė]l\G3ûw:Iܺ(!VhIRԤATP
+jK
+T'@BBHD!FQipH8ێ^޽vMdsܙsϙsΜf<fb~n
ɓaʊͩ[q7{j>jd=vx'fnNzSIdZ4Rhi=cx<A?FuUY`֗8bν4=
+`pFv۾hAv^ӓW8dtdmoc'jTq̡0:BZ'A);ж?}7@ ?ǷnA4?N䏢UZoc,5Bڸt{/Wtmiut\CG"c4q8Rtְ*&g3I4vҹgͱ-~*{w{-%΍?.UĨ":0ei~CkE>[qUȲp#Mv|/qdE g{_m&q~ F^Ш MU2
;̔I1*O~s/OeI/`=ִi7E
+*1qW
+smYӋ|%-#uֹc 8<>}Pݤؒ0'*m1X.*0oZy"}}@
+ިmތ.LlԺlFSAH<wy	@nRiܱ)	!:E-P]N
+ި Po_@0iY4UIR_M^P_Y{0:9R[*°u(xelcPyctD0y$3}(F_ΖK=QuT H[Ŕ  tT,e\:0s
_0q -I[T [hSN
n-E1[~'ґ`rB
+ `d,b"gV@X˕hF
+ 9U]K'j*%_$]ƬQ^Zı"* ̨0
+^	F*Gq? Z^	 NGX%G/~kbeh_њXymUe#]|.Lp"*BvN:X	H%Vz;z?C,'HBv_%ު p?<pbzJ8I˵DH,u>U vLc=<ҖXUp9p@]xa4\,E6 ={t0w=hż%ҵd033[ 9Pן;wz;!,Hat?1t
+Gp:J)i[\?7IѻՊC'FL`'$N:Y2c#,J$%cc']t7N&h
+{JmP矕#[ں!]Act0ZY̱ DҵVEXs|0J7Wu}0:{
+Qp=TէMSU­p3IjTi>M#
+zв\S|n>ތU
ƀT0[|0;|z;|헵ޣ?7w\|e#2MZ۵D+MyIщȜl{S˟f"ѷ~@;]{n4W>%"cBlE7ݩsל>S@,G :CTL    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/images/oscommerce.png 2.3.1.src/admin/images/oscommerce.png
--- 2.2rc2a.cp.src/admin/images/oscommerce.png	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/images/oscommerce.png	2010-11-15 03:42:36.000000000 -0600
@@ -1,37 +1,21 @@
 PNG
 
-   
IHDR      2   !   tEXtSoftware Adobe ImageReadyqe<  IDATx]	XSW>C6 	}
Z[bݶvcڽ>ik[[un*(. Ȧ
-,쁰%!&ci'ߓrwOsnb͎Tؑjؑj;Rb1RʮK5%G"zxX
f7]#Z{
-v[W<''֘U& v7D*..<Ŗρ|hwj˵]~3zwwvH).e0htDAD"R[*(*7@w@𛃵6V7y6mw@](ٵ'ob&IGJJq	q''XW2]/
-xct*oÎz`pܘاy掙3@jzzŢ?S׳M\D"&Z5aU^{Jy<wdֶj2<iڴ Gc]m3g;vbB׈}}99'.\BCB&N8fء)POO"gEys~WW			&a,EENNNq<eJM
!|EvV'.cEjߟs'jLFpHɓ9qL>V|Z۸xX<H
]5R>t
-h5쭭yyyy?=nZJVQ[SsyxjD6n7f5=@I"{[b'WBר1G9yE{2m3 ~]h4>FNu%Xo[N7讼ӧgL&XlOup`\]Z@]]&huVyxAÁO?r0VuFO/#Gp4->̌I3h2k"VPY'NN$:\V-L{9O74-;;pJ ?;q1Tgp9AnWWY-[ƌEk菀@)FGoۺd@?Mp_hy~8B!zMHgH5E%~>jVzU]MӸ"%*諧LtWY}?5j-={
/OIJ3o..ToĄm;v\Y_z`~OO+WLC_(~eKҴyO?}aa=Νt:?wf1ϙ{9`Ygu]V"Dg.زukaa{pcNN_n˷%L#~˖-bJeGjJ*@	rwβ4+WM-g̘3wD*?͎bq4(ᇯ2\<oI'#dkCŒkkutoeQQ/= }67^'oS%wTT?ݷx=^	9Uzҧ8--Sn$zFJKzUJ$yA_d>:69^xRMM
.?[GRĉ%%ￏwLMڵg$>&Uݠ/w
-yDHhmm$
-RturIش	ز3MG??[$õ:.^L7FDA>#32btm͵`ȹ9>oN=DBk֭
--@YtH`7b[g'>eH-GN\^JzO8c绾pI![tue
-fu}a4^PW&>_~, pY'leߞY-X`5Q=ӫ|||ģɤ ZdVu@-\wޱD;2G'O<a
-]ow<jU+W[}]dgg'p~OOsL 
-ـ6%>l 7^ǧ!Xr-MѭsH"D3ti``P[1	ICg
lGgEXcwG;^ܹʎv$V{egg<xgΜA01H9rq*}xElc,[f5?qww=5AG]]S&$&ZYr]sNb-]-LF,'eŪUdef\).)//1kp^l)ݻ5k!}p)~pp=tCS775!}OrU?yᆭ
/[G+3Ӱa:>6ǈ"dI
-"s#Y!_﫩.CI;(=z4%%1wުyjj*0z%P<ڵYG
[+Ŭ9
gI$LLtpp?rSNp__F>B耥5G3]fin36r,LK;j>oGD 744OQQQa?lxPpy2dA!r*Hq1-lrsTN
-7҄^#U|L704UO"p$N"$tsVG*2+bd;J]K˹ʄ \ksrr222P!=gN@
A~ڊrJHoLh6=<=]ZB9h|#@147,PQ@|8GB y(	B[3ey1}|NhSl*#mZל]\F	
غVZVj<o+LËT=A#la2HX%R8U:[ZZbcciv	r={6u;vXs9ӻjQh;B @,Qh޴0B=NDؾ޾k='K0tq(H|tz.!t0R<%egn ftpT4#?hޛFj#[֬i; L6a:0ƘϔOb144W?uџ"4.sFz%wT(Xr9x:"B232WNiQWp?m^-QG
--wp$,Iti977M;E@4bWՇn߮n >a		SLRchpA`؏DLvK}m%i"WĠ*̦VwoTY~xyy!t͐ۼ7ݙ+ozJKA
-_G^<`2RTuz<#iFep	Ox"V({s/
-\1f欍λ?_LnVFQ!8RkD+vwwS"ݷ&5552l%0o-((0Y/
&yyUeՉ?'.>&ͪj1Wq NDk.[i7ҠU4*F9PK 7`
-Èԟ2s<<<n;5_hp\l`5Fl_X0ʎHPڊSRU9dJ"w|'"5rY+ ~:GL#mkwO7n\FFƁ<==_oJQ?GH=M pJxDK\pus2fP ;u8Fk߯6!z<6	&acuЁ8;SH,j8QkcDn:À,Ñ49}1jom
-/innnJJKpp/8+7L<IOwK>~SFkJr̟ajB5
-y-iSMnz#q4k3tI;JmdјE'E:|EE!!!v,?1TVYqɸ:	Ŧ&Ot=rGĸ!<>Tf a	ݬnkd4Р0;wv1BCCϞ=+..2555xeySx4ەo'RU}Z[Ll
-j:"C)+fx<b Rșr`=bpt=m>'N/vxBFat*L|ez;*Ӆ
-ZMmkka,|>fPQZZ I&ҁmQfJaŅ뫉iku o>2G*m'ʖނgbr;=ӥ&~ܢizA;B@%6<cpgIIPH$H3Ζ-)+k7Zkok_zy';;;o{2`P]mBFQ6
-9bU)BGC@ƏhZHObK"ѪVViıhh}G 8Y>.&5BZjU&
-&Miu2P3 rS(EE<->4,⥡,9rT*Oo܏hEظ8X\UYiKj+JoR=ţd7b֘ z(I4H4Df<!vyO4)224h*%|WWR*T#~Ɉte]1:$qQQnn}{Z-r6(8ٳ23o<{R8ԩۃT',9Rc
-E3uVmQw6jW4Azs)ыÂ&$N
.`hh?@}R(-7Q8ON?}Nt <xɒl96Vڑ#F/ﭮƍCna2.[yuÆtuvYg=n8hc11yS5${LFr c2UuCW"gp\|܄	AV _//,mȜsQ	51;;ے!_=.^$
-j޵ ?/3gEX숃<*˛zޓJ_|Rڧ#¿+Vdge`a?8ag~z3K-s9٧&'߷%\[SwϞӦŋgΚx}Rjkk[[ZpmۦOi4!w-WUE ӫt2W˸B(mbIZCJ}}}G	'$$8p Xdr1m;8qbzz}@ 
schƺ\RSR`p3>셒!`
*\oR:7J^A&H,XttWUj̾A"٭9itx䞞tz蘷LPϯZ۷n; @;MM[=4RڒASOݳw.2'
--4
y~>Oegql[ݯ2FWT,clذ,>{@tf/]fƁgju<Ƙ_M/zãƏ3ftd62E~	&FQÈǏ[ɢ0RSD,N5gi@Г3CHD#ۋ85xuI;zܸDP0/*2K:ModGԆqtRapX02W9aYc3Ɛ/Խn|/4'/rɓosaL&K٩9e^~/
. ֩j|>P~glqu[7tunO92rӦ%m'n8EM
-s|ޠ@KnSirpȆ
*S=rM 33_955	/xG
-81!&&]RqdRUݾoRln72nThat9/:{Abd$]rr5O0"v5A:%Wݥ&=zԦ+C%9ՏUBcfA qRiQ4uCVI(#6
-߮ӡLXG%kEקBٌv5F!FYcgA9M &OWT7{5u4=1\K:#.Tv"ǎua@A
-yyyo|*WΝ;%Krɓ'G-NHH]]]GaL>nfKKKFF(9s&RD333a?Xg '侸=,,,--
Z{{ܹsC'Ш'[,qtqohinR5J8Xf|
$KЖ-[Hoo﨨(j[hwmeeeW\UhZO_t	DCƙj=TRRB! #""@1OƐ0
-7Z\\|}Y`hh(5kllFJKKy᫳H-X mb8f3!W>w3f@|p#p޽gPeb__豉'L9ui3fOq1T^^^̥#LPvp˗0@aPpdPBhl܌K'N%	\K bxƂ|>a U,u\\\Ǝ?16pdo6A8 f*PĀCL/|-^ۂ>(yXQ0(q#lKr9,$xT]ܴ=K 6X'?>-W( hz(=shrI(
- a C좢
JLvB@40.^`x1Z<kyy9xĴkbg'- c3)08m v	`709Nn;LoY xQ) Z
-#j$0JPE\DԩSg͚EՉmD$E MM  & J^SC`)㢔JTh@ǐb{ZWthbX.Âh޽0c`[vAK,5 :99C	.5(  P+aJ0vuZUU
a2Tq~u6'*  ͕n+. ~Aځ
-:c*%$ D)'h#
-W] F #!	2>~EJ1 
t8\MWb`'h~'ni [N`#*PSgsazX1L4kFnG2?C#HCHvvo` 8i    IENDB`
\ No newline at end of file
+   
IHDR      2   Q   tEXtSoftware Adobe ImageReadyqe<  "iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:3A078D0FB38511DF94B9E85B68D0D3C5" xmpMM:DocumentID="xmp.did:3A078D10B38511DF94B9E85B68D0D3C5"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:3A078D0DB38511DF94B9E85B68D0D3C5" stRef:documentID="xmp.did:3A078D0EB38511DF94B9E85B68D0D3C5"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>
+  oIDATx\	|T?wLɾ@X  @\ZV_}>_ӾZK]k}*>Ҫh+"HBB&=d}zw2}߽W	Bd)Dy	L1) 1 bSLb^l(GtR0<$T,|{fռ5UjMͦ	I|^/M>l4mO8aZBevǘdEv`V'`}զI5D$Œ}+*2VU,Xҳ/y<|MK06EPcXτi
$_$s
+Q+g`Co2kUϞw(!ygc*mmWڃ߲X:== ʺU"3p
+F)bݍgu.kǬO5WzwI-IC:Y+8bvp:ֿAik6#Oç6NND4g}u	w' s+½bDﳎ=:wP^DA;#9|Y3/)T:c)˗)3M.{Ʈ?>cD$!!_V~znHk-@;u O+'z@02t^#^&a}FHNueMյMY/g}$;Y/a?0N1XOoǁ¡tpFgg^yэsadwPWTa}Z<c>Kt{k9H*Ԅą!BaUtRR+vų\D'n
"*Fo:?p.c @\0{Y4	poehD^KYKѶs8Ɇ~8' 7X)^83bvhc{\b# :EWgq8=B?Yxzͻ`}|8]F ctb@}N,Qk Qe4%/Kh=OEh;ݟp_Sw$"UrU*Yr.)x_~֟c	^Q5}00] Lv
+ڂ(7@Q?G&o._-5iczrws_9/5вp~`]s?jz !"c>Szy`6GO7GU(uu<-Zwiѣ#?I xV&ڃ̣1ԓ]y+oٳ+ρwTn0c|-55&L@~_#q *FqhaMȃF#Zmv<(pq2n9;A){Yo1ů0|?u6+6Dӣu.zź<84T97|*Fup 
+[_ܕRMptڞOJr&=!lJLɧe4{l2UN*9gٟmٕPN[%~
+R^H<2x
+${XpN<i{B`$		@4"Gy[JD Ht::bݍ(0=Dϥq\g"o} |	iܐ?_X(iO5<	Arx8>4T'+t3pZ<eoɖ(6 9j.}oֵHf~>
+Hy#Cgă-=#z| 6vR#Tecsr"Dw ܀y}fD3Oy1PbԐsڞRw{=/zJ	ۖGPߝO;3,`̄lp\3.|6\o Т2C[P	C\T3+z{{+Բ,GV]9q:r(fF=qPE zW!o}_gcĞJ%g}Yӷgz`ґ!{J)ITtt7i˨RPɾ;gqP~TQ,-2@aYr)[s&jW]ԒE $A1`.@(hdAļbag6C匊Zg.}	=-l`%eZ)ÑOVF{(}̭}_Әaāg)8K&< #@GHSI,&%rw+3yM92PvxiLIIM52GG'
 bGաFre:hBd>(CK֟=J+LOr5͚VH.Bv&%I=	MAk hU" *ǧ^:n O4o~eJ$1NE(G}>ʤ>Χ߸iL1hO)SHI(Qm)/Mm?|VXFMݧQBz6y{$>7)"ISzQ!փH֢5Y4ةo2Э9zѨMqu"̂)4\"HpҌ3UđFES蒀'5B:֫&+,lr2TjG/
+W'g#
;vR^F.J5)⏝>TnXHrE(^A[>(NUv ŊhT1ly_P@VAa
+d((Yy l!_ETbI:T9ki׻k)j3\T]-IA:P<Nx"F999NGg4Co|"*b_1JetɐmfќyshpT3$IUO!B ǀzNdGN
8 W9TwS&ώnOC,	edd-"kW^:m̐J_WPh|Qg02dJqQ>9N{jQ"QHDrnZ˜ݼLvZJ+.J
؂|V
+3_?emFUCZaaPiʆ5YOIEq.T-d;BW0k(N/E$ы-̽nFl&
+YU8Q'a$+'+n_+u5تd
+4vz_n^U2xY1/P>KKd?SIqɈBj!F: )-m>|ҀxP7cZz0*@<m<iD;{%g$YWsII:i#$
Jg@?֣&?ʂ4j(JfvqiuU1@^nnnn7X(l8q ًǠOOlE~aK{8C64HW݇j0*qo!٩QDb30mbmdeSespZ>
+tKC\Y*Hu1%[eәwGQŊ$4'lN5	 {{N~"$#ׇⲦoE"sg]g=nz)<-QMJc 8hM4I.~;'<[hrMySbmWV@,BdV)"qG%̸aTdɸe\;ɹ8 y@6ADqn!@(H ǔaQ{I"}97IwW\D/IyEkxQ]"aix;^FsfbY
Yp:/FcԞ&/ܜEiROmO=#QOP|+V
u8<e6痭0/ʛ<Wq	TaATl Yt!O`kW%YFܯy^a⵫,OZU~Xnoy8ktneӫ<&6$y"n]{h[!v);ͥj|fiH7KU,o_BS bCN8Ogb5u/?@WmBn g|%LƸVX:xup__{M"DYhΫ fHG_)Ɋ]m5Tnxvve{}	9z  ryRhzYlzJ-*RFMMKGOTkP@--Po)/0>2@Ҍc6"ӻ^CcP<T\eKʋO焍(h|HuYfUj"D
7иq.輕x1SMڨ(7/O<I?wVڛ<@)(8g.Rp@`A["/#)/i+hx͙7O]Znծ[$yyj}{=-f=9p+.׹C>5+ly:A1؏
c5:=?/s]OZ/Yȟ|l6ؕL}뎺\ǟ%4rFjX3DNV1./Gg'Q@ n1 |ih#H`lne]F,:  rPռ!n{U bTEM;nz]5UlQb94y߂arPG^n+j}eZ:?ěͪN_T|j1k^^|,;ή.dm];v[@J'iԩys]ƴh沎OȠ6_'ys;5Ր^BhT/r^qjJpx@K*yx٨J@% JLN'OVW ňsi)'O7{lMv%ƌKͺki#i*phy-q۩ Y얐V1yde`gsvl%<͛6'j雜S'[HJJI*2G|q
+wѹjYc]"	 ^LQvF~ђ_3<oiy_5GG0)bN;tcUd_Pn1@'AbA>>F@'/Ҙ]U޺>pr` hEFsx<~Tsqvݴk.c'_"s\e|XǿJan5r3885hhUJn; m_S\̷)IIsrr oÎ`]SJptR}fUF$D>Td[54EPe媁HR)|#їSh9q4QAP7QF .QK\޸_8Kwe_Lx4pT?cP	k@eZvF$Ѳ๕k)
+
+ZuU[D9De6P&*ZUm&_ƹ0l $@fҖmXc^uXkDpA!))^s	1p_+:I{/kC׃c)|p&Rmo%*
a`IQIbpHJCG!_G#h~v_Rz)q%0||E}Ǘb`ndmD2/kU8c<`ɢ IA! eaX9c3MG1W
5R>&yMbZC}~{A[yBt98[&9jD.m#ъNĮN־d-QU=@3<h C)" NiK%hO7O-״RjߴC ↁJtIYC_|ǘ T%-oC &e#e`K_iAA{zi:K[m
ϩȷSc>7`0T^0Jpa'N
+rQ+ڊAn@;q;L)Si{ҶK>3	-X u${.$.x>F}[}1¹d{J	o9F"|-]d
*"E[-#K};Ā?IHڽ.<|ȅl[uKuv86s($c^eځ9/|`<O}--+s}SY2 bSLb	SL1b)_  kG>6    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/application_bottom.php 2.3.1.src/admin/includes/application_bottom.php
--- 2.2rc2a.cp.src/admin/includes/application_bottom.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/application_bottom.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: application_bottom.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/application_top.php 2.3.1.src/admin/includes/application_top.php
--- 2.2rc2a.cp.src/admin/includes/application_top.php	2009-12-03 16:11:23.000000000 -0600
+++ 2.3.1.src/admin/includes/application_top.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: application_top.php 1833 2008-01-30 22:03:30Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,37 +14,34 @@
   define('PAGE_PARSE_START_TIME', microtime());
 
 // Set the level of error reporting
-if (defined('E_DEPRECATED') and defined('E_USER_DEPRECATED')) {
-  error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_DEPRECATED);
-} else { 
   error_reporting(E_ALL & ~E_NOTICE);
-} 
 
 // check support for register_globals
   if (function_exists('ini_get') && (ini_get('register_globals') == false) && (PHP_VERSION < 4.3) ) {
     exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory. Please use PHP 4.3+ if register_globals cannot be enabled on the server.');
   }
 
-// Set the local configuration parameters - mainly for developers
-  if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');
-
-// Include application configuration parameters
-  require('includes/configure.php');
+// load server configuration parameters
+  if (file_exists('includes/local/configure.php')) { // for developers
+    include('includes/local/configure.php');
+  } else {
+    include('includes/configure.php');
+  }
 
-// Define the project version
-  define('PROJECT_VERSION', 'osCommerce Online Merchant v2.2 RC2a');
+// Define the project version --- obsolete, now retrieved with tep_get_version()
+  define('PROJECT_VERSION', 'osCommerce Online Merchant v2.3');
 
 // some code to solve compatibility issues
   require(DIR_WS_FUNCTIONS . 'compatibility.php');
 
 // set php_self in the local scope
-  $PHP_SELF = (isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']);
+  $PHP_SELF = (((strlen(ini_get('cgi.fix_pathinfo')) > 0) && ((bool)ini_get('cgi.fix_pathinfo') == false)) || !isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) ? basename($HTTP_SERVER_VARS['PHP_SELF']) : basename($HTTP_SERVER_VARS['SCRIPT_NAME']);
 
 // Used in the "Backup Manager" to compress backups
-  define('LOCAL_EXE_GZIP', '/usr/bin/gzip');
-  define('LOCAL_EXE_GUNZIP', '/usr/bin/gunzip');
-  define('LOCAL_EXE_ZIP', '/usr/local/bin/zip');
-  define('LOCAL_EXE_UNZIP', '/usr/local/bin/unzip');
+  define('LOCAL_EXE_GZIP', 'gzip');
+  define('LOCAL_EXE_GUNZIP', 'gunzip');
+  define('LOCAL_EXE_ZIP', 'zip');
+  define('LOCAL_EXE_UNZIP', 'unzip');
 
 // include the list of project filenames
   require(DIR_WS_INCLUDES . 'filenames.php');
@@ -52,9 +49,6 @@
 // include the list of project database tables
   require(DIR_WS_INCLUDES . 'database_tables.php');
 
-// customization for the design layout
-  define('BOX_WIDTH', 125); // how wide the boxes should be in pixels (default: 125)
-
 // Define how do we update currency exchange rates
 // Possible values are 'oanda' 'xe' or ''
   define('CURRENCY_SERVER_PRIMARY', 'oanda');
@@ -82,15 +76,6 @@
 // include shopping cart class
   require(DIR_WS_CLASSES . 'shopping_cart.php');
 
-// check to see if php implemented session management functions - if not, include php3/php4 compatible session class
-  if (!function_exists('session_start')) {
-    define('PHP_SESSION_NAME', 'osCAdminID');
-    define('PHP_SESSION_PATH', '/');
-    define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);
-
-    include(DIR_WS_CLASSES . 'sessions.php');
-  }
-
 // define how the session functions will be used
   require(DIR_WS_FUNCTIONS . 'sessions.php');
 
@@ -106,6 +91,8 @@
     ini_set('session.cookie_path', DIR_WS_ADMIN);
   }
 
+  @ini_set('session.use_only_cookies', (SESSION_FORCE_COOKIE_USE == 'True') ? 1 : 0);
+
 // lets start our session
   tep_session_start();
 
@@ -139,6 +126,13 @@
 
     $current_page = basename($PHP_SELF);
 
+// if the first page request is to the login page, set the current page to the index page
+// so the redirection on a successful login is not made to the login page again
+    if ( ($current_page == FILENAME_LOGIN) && !tep_session_is_registered('redirect_origin') ) {
+      $current_page = FILENAME_DEFAULT;
+      $HTTP_GET_VARS = array();
+    }
+
     if ($current_page != FILENAME_LOGIN) {
       if (!tep_session_is_registered('redirect_origin')) {
         tep_session_register('redirect_origin');
@@ -147,11 +141,23 @@
                                  'get' => $HTTP_GET_VARS);
       }
 
+// try to automatically login with the HTTP Authentication values if it exists
+      if (!tep_session_is_registered('auth_ignore')) {
+        if (isset($HTTP_SERVER_VARS['PHP_AUTH_USER']) && !empty($HTTP_SERVER_VARS['PHP_AUTH_USER']) && isset($HTTP_SERVER_VARS['PHP_AUTH_PW']) && !empty($HTTP_SERVER_VARS['PHP_AUTH_PW'])) {
+          $redirect_origin['auth_user'] = $HTTP_SERVER_VARS['PHP_AUTH_USER'];
+          $redirect_origin['auth_pw'] = $HTTP_SERVER_VARS['PHP_AUTH_PW'];
+        }
+      }
+
+      $redirect = true;
+    }
+
+    if (!isset($login_request) || isset($HTTP_GET_VARS['login_request']) || isset($HTTP_POST_VARS['login_request']) || isset($HTTP_COOKIE_VARS['login_request']) || isset($HTTP_SESSION_VARS['login_request']) || isset($HTTP_POST_FILES['login_request']) || isset($HTTP_SERVER_VARS['login_request'])) {
       $redirect = true;
     }
 
     if ($redirect == true) {
-      tep_redirect(tep_href_link(FILENAME_LOGIN));
+      tep_redirect(tep_href_link(FILENAME_LOGIN, (isset($redirect_origin['auth_user']) ? 'action=process' : '')));
     }
 
     unset($redirect);
@@ -191,6 +197,9 @@
 // file uploading class
   require(DIR_WS_CLASSES . 'upload.php');
 
+// action recorder
+  require(DIR_WS_CLASSES . 'action_recorder.php');
+
 // calculate category path
   if (isset($HTTP_GET_VARS['cPath'])) {
     $cPath = $HTTP_GET_VARS['cPath'];
@@ -206,15 +215,9 @@
     $current_category_id = 0;
   }
 
-// default open navigation box
-  if (!tep_session_is_registered('selected_box')) {
-    tep_session_register('selected_box');
-    $selected_box = 'configuration';
-  }
-
-  if (isset($HTTP_GET_VARS['selected_box'])) {
-    $selected_box = $HTTP_GET_VARS['selected_box'];
-  }
+// initialize configuration modules
+  require(DIR_WS_CLASSES . 'cfg_modules.php');
+  $cfgModules = new cfg_modules();
 
 // the following cache blocks are used in the Tools->Cache section
 // ('language' in the filename is automatically replaced by available languages)
@@ -222,18 +225,4 @@
                         array('title' => TEXT_CACHE_MANUFACTURERS, 'code' => 'manufacturers', 'file' => 'manufacturers_box-language.cache', 'multiple' => true),
                         array('title' => TEXT_CACHE_ALSO_PURCHASED, 'code' => 'also_purchased', 'file' => 'also_purchased-language.cache', 'multiple' => true)
                        );
-
-// check if a default currency is set
-  if (!defined('DEFAULT_CURRENCY')) {
-    $messageStack->add(ERROR_NO_DEFAULT_CURRENCY_DEFINED, 'error');
-  }
-
-// check if a default language is set
-  if (!defined('DEFAULT_LANGUAGE')) {
-    $messageStack->add(ERROR_NO_DEFAULT_LANGUAGE_DEFINED, 'error');
-  }
-
-  if (function_exists('ini_get') && ((bool)ini_get('file_uploads') == false) ) {
-    $messageStack->add(WARNING_FILE_UPLOADS_DISABLED, 'warning');
-  }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/catalog.php 2.3.1.src/admin/includes/boxes/catalog.php
--- 2.2rc2a.cp.src/admin/includes/boxes/catalog.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/catalog.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,37 +1,48 @@
 <?php
 /*
-  $Id: catalog.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- catalog //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_CATALOG,
-                     'link'  => tep_href_link(FILENAME_CATEGORIES, 'selected_box=catalog'));
-
-  if ($selected_box == 'catalog') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_CATEGORIES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_CATEGORIES_PRODUCTS . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_CATEGORIES_PRODUCTS_ATTRIBUTES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_MANUFACTURERS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_MANUFACTURERS . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_REVIEWS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_REVIEWS . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_SPECIALS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_SPECIALS . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_PRODUCTS_EXPECTED, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CATALOG_PRODUCTS_EXPECTED . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_CATALOG,
+    'apps' => array(
+      array(
+        'code' => FILENAME_CATEGORIES,
+        'title' => BOX_CATALOG_CATEGORIES_PRODUCTS,
+        'link' => tep_href_link(FILENAME_CATEGORIES)
+      ),
+      array(
+        'code' => FILENAME_PRODUCTS_ATTRIBUTES,
+        'title' => BOX_CATALOG_CATEGORIES_PRODUCTS_ATTRIBUTES,
+        'link' => tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES)
+      ),
+      array(
+        'code' => FILENAME_MANUFACTURERS,
+        'title' => BOX_CATALOG_MANUFACTURERS,
+        'link' => tep_href_link(FILENAME_MANUFACTURERS)
+      ),
+      array(
+        'code' => FILENAME_REVIEWS,
+        'title' => BOX_CATALOG_REVIEWS,
+        'link' => tep_href_link(FILENAME_REVIEWS)
+      ),
+      array(
+        'code' => FILENAME_SPECIALS,
+        'title' => BOX_CATALOG_SPECIALS,
+        'link' => tep_href_link(FILENAME_SPECIALS)
+      ),
+      array(
+        'code' => FILENAME_PRODUCTS_EXPECTED,
+        'title' => BOX_CATALOG_PRODUCTS_EXPECTED,
+        'link' => tep_href_link(FILENAME_PRODUCTS_EXPECTED)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- catalog_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/configuration.php 2.3.1.src/admin/includes/boxes/configuration.php
--- 2.2rc2a.cp.src/admin/includes/boxes/configuration.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/configuration.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,38 +1,37 @@
 <?php
 /*
-  $Id: configuration.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- configuration //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_CONFIGURATION,
-                     'link'  => tep_href_link(FILENAME_CONFIGURATION, 'gID=1&selected_box=configuration'));
 
-  if ($selected_box == 'configuration') {
-    $cfg_groups = '<a href="' . tep_href_link(FILENAME_ADMINISTRATORS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CONFIGURATION_ADMINISTRATORS . '</a><br>';
-    $configuration_groups_query = tep_db_query("select configuration_group_id as cgID, configuration_group_title as cgTitle from " . TABLE_CONFIGURATION_GROUP . " where visible = '1' order by sort_order");
-    while ($configuration_groups = tep_db_fetch_array($configuration_groups_query)) {
-      $cfg_groups .= '<a href="' . tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $configuration_groups['cgID'], 'NONSSL') . '" class="menuBoxContentLink">' . $configuration_groups['cgTitle'] . '</a><br>';
-    }
-
-    $contents[] = array('text'  => $cfg_groups);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_CONFIGURATION,
+    'apps' => array(
+      array(
+        'code' => FILENAME_ADMINISTRATORS,
+        'title' => BOX_CONFIGURATION_ADMINISTRATORS,
+        'link' => tep_href_link(FILENAME_ADMINISTRATORS)
+      ),
+      array(
+        'code' => FILENAME_STORE_LOGO,
+        'title' => BOX_CONFIGURATION_STORE_LOGO,
+        'link' => tep_href_link(FILENAME_STORE_LOGO)
+      )
+    )
+  );
+
+  $configuration_groups_query = tep_db_query("select configuration_group_id as cgID, configuration_group_title as cgTitle from " . TABLE_CONFIGURATION_GROUP . " where visible = '1' order by sort_order");
+  while ($configuration_groups = tep_db_fetch_array($configuration_groups_query)) {
+    $cl_box_groups[sizeof($cl_box_groups)-1]['apps'][] = array(
+      'code' => FILENAME_CONFIGURATION,
+      'title' => $configuration_groups['cgTitle'],
+      'link' => tep_href_link(FILENAME_CONFIGURATION, 'gID=' . $configuration_groups['cgID'])
+    );
   }
-
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
 ?>
-            </td>
-          </tr>
-<!-- configuration_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/customers.php 2.3.1.src/admin/includes/boxes/customers.php
--- 2.2rc2a.cp.src/admin/includes/boxes/customers.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,33 +1,28 @@
 <?php
 /*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- customers //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_CUSTOMERS,
-                     'link'  => tep_href_link(FILENAME_CUSTOMERS, 'selected_box=customers'));
-
-  if ($selected_box == 'customers') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_CUSTOMERS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CUSTOMERS_CUSTOMERS . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_ORDERS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CUSTOMERS_ORDERS . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_CUSTOMERS,
+    'apps' => array(
+      array(
+        'code' => FILENAME_CUSTOMERS,
+        'title' => BOX_CUSTOMERS_CUSTOMERS,
+        'link' => tep_href_link(FILENAME_CUSTOMERS)
+      ),
+      array(
+        'code' => FILENAME_ORDERS,
+        'title' => BOX_CUSTOMERS_ORDERS,
+        'link' => tep_href_link(FILENAME_ORDERS)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- customers_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/localization.php 2.3.1.src/admin/includes/boxes/localization.php
--- 2.2rc2a.cp.src/admin/includes/boxes/localization.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/localization.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,34 +1,33 @@
 <?php
 /*
-  $Id: localization.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- localization //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_LOCALIZATION,
-                     'link'  => tep_href_link(FILENAME_CURRENCIES, 'selected_box=localization'));
-
-  if ($selected_box == 'localization') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_CURRENCIES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_LOCALIZATION_CURRENCIES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_LANGUAGES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_LOCALIZATION_LANGUAGES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_ORDERS_STATUS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_LOCALIZATION_ORDERS_STATUS . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_LOCALIZATION,
+    'apps' => array(
+      array(
+        'code' => FILENAME_CURRENCIES,
+        'title' => BOX_LOCALIZATION_CURRENCIES,
+        'link' => tep_href_link(FILENAME_CURRENCIES)
+      ),
+      array(
+        'code' => FILENAME_LANGUAGES,
+        'title' => BOX_LOCALIZATION_LANGUAGES,
+        'link' => tep_href_link(FILENAME_LANGUAGES)
+      ),
+      array(
+        'code' => FILENAME_ORDERS_STATUS,
+        'title' => BOX_LOCALIZATION_ORDERS_STATUS,
+        'link' => tep_href_link(FILENAME_ORDERS_STATUS)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- localization_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/modules.php 2.3.1.src/admin/includes/boxes/modules.php
--- 2.2rc2a.cp.src/admin/includes/boxes/modules.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/modules.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,34 +1,23 @@
 <?php
 /*
-  $Id: modules.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- modules //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
 
-  $heading[] = array('text'  => BOX_HEADING_MODULES,
-                     'link'  => tep_href_link(FILENAME_MODULES, 'set=payment&selected_box=modules'));
-
-  if ($selected_box == 'modules') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_MODULES, 'set=payment', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_MODULES_PAYMENT . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_MODULES, 'set=shipping', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_MODULES_SHIPPING . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_MODULES, 'set=ordertotal', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_MODULES_ORDER_TOTAL . '</a>');
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_MODULES,
+    'apps' => array()
+  );
+
+  foreach ($cfgModules->getAll() as $m) {
+    $cl_box_groups[sizeof($cl_box_groups)-1]['apps'][] = array('code' => FILENAME_MODULES,
+                                                               'title' => $m['title'],
+                                                               'link' => tep_href_link(FILENAME_MODULES, 'set=' . $m['code']));
   }
-
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
 ?>
-            </td>
-          </tr>
-<!-- modules_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/reports.php 2.3.1.src/admin/includes/boxes/reports.php
--- 2.2rc2a.cp.src/admin/includes/boxes/reports.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/reports.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,34 +1,33 @@
 <?php
 /*
-  $Id: reports.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- reports //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_REPORTS,
-                     'link'  => tep_href_link(FILENAME_STATS_PRODUCTS_VIEWED, 'selected_box=reports'));
-
-  if ($selected_box == 'reports') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_STATS_PRODUCTS_VIEWED, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_REPORTS_PRODUCTS_VIEWED . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_STATS_PRODUCTS_PURCHASED, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_REPORTS_PRODUCTS_PURCHASED . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_STATS_CUSTOMERS, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_REPORTS_ORDERS_TOTAL . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_REPORTS,
+    'apps' => array(
+      array(
+        'code' => FILENAME_STATS_PRODUCTS_VIEWED,
+        'title' => BOX_REPORTS_PRODUCTS_VIEWED,
+        'link' => tep_href_link(FILENAME_STATS_PRODUCTS_VIEWED)
+      ),
+      array(
+        'code' => FILENAME_STATS_PRODUCTS_PURCHASED,
+        'title' => BOX_REPORTS_PRODUCTS_PURCHASED,
+        'link' => tep_href_link(FILENAME_STATS_PRODUCTS_PURCHASED)
+      ),
+      array(
+        'code' => FILENAME_STATS_CUSTOMERS,
+        'title' => BOX_REPORTS_ORDERS_TOTAL,
+        'link' => tep_href_link(FILENAME_STATS_CUSTOMERS)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- reports_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/taxes.php 2.3.1.src/admin/includes/boxes/taxes.php
--- 2.2rc2a.cp.src/admin/includes/boxes/taxes.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/taxes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,36 +1,43 @@
 <?php
 /*
-  $Id: taxes.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- taxes //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_LOCATION_AND_TAXES,
-                     'link'  => tep_href_link(FILENAME_COUNTRIES, 'selected_box=taxes'));
-
-  if ($selected_box == 'taxes') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_COUNTRIES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_TAXES_COUNTRIES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_ZONES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_TAXES_ZONES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_GEO_ZONES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_TAXES_GEO_ZONES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_TAX_CLASSES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_TAXES_TAX_CLASSES . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_TAX_RATES, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_TAXES_TAX_RATES . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_LOCATION_AND_TAXES,
+    'apps' => array(
+      array(
+        'code' => FILENAME_COUNTRIES,
+        'title' => BOX_TAXES_COUNTRIES,
+        'link' => tep_href_link(FILENAME_COUNTRIES)
+      ),
+      array(
+        'code' => FILENAME_ZONES,
+        'title' => BOX_TAXES_ZONES,
+        'link' => tep_href_link(FILENAME_ZONES)
+      ),
+      array(
+        'code' => FILENAME_GEO_ZONES,
+        'title' => BOX_TAXES_GEO_ZONES,
+        'link' => tep_href_link(FILENAME_GEO_ZONES)
+      ),
+      array(
+        'code' => FILENAME_TAX_CLASSES,
+        'title' => BOX_TAXES_TAX_CLASSES,
+        'link' => tep_href_link(FILENAME_TAX_CLASSES)
+      ),
+      array(
+        'code' => FILENAME_TAX_RATES,
+        'title' => BOX_TAXES_TAX_RATES,
+        'link' => tep_href_link(FILENAME_TAX_RATES)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- taxes_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/boxes/tools.php 2.3.1.src/admin/includes/boxes/tools.php
--- 2.2rc2a.cp.src/admin/includes/boxes/tools.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/boxes/tools.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,40 +1,73 @@
 <?php
 /*
-  $Id: tools.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- tools //-->
-          <tr>
-            <td>
-<?php
-  $heading = array();
-  $contents = array();
-
-  $heading[] = array('text'  => BOX_HEADING_TOOLS,
-                     'link'  => tep_href_link(FILENAME_BACKUP, 'selected_box=tools'));
-
-  if ($selected_box == 'tools') {
-    $contents[] = array('text'  => '<a href="' . tep_href_link(FILENAME_BACKUP) . '" class="menuBoxContentLink">' . BOX_TOOLS_BACKUP . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_BANNER_MANAGER) . '" class="menuBoxContentLink">' . BOX_TOOLS_BANNER_MANAGER . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_CACHE) . '" class="menuBoxContentLink">' . BOX_TOOLS_CACHE . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE) . '" class="menuBoxContentLink">' . BOX_TOOLS_DEFINE_LANGUAGE . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_FILE_MANAGER) . '" class="menuBoxContentLink">' . BOX_TOOLS_FILE_MANAGER . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_MAIL) . '" class="menuBoxContentLink">' . BOX_TOOLS_MAIL . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_NEWSLETTERS) . '" class="menuBoxContentLink">' . BOX_TOOLS_NEWSLETTER_MANAGER . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_SERVER_INFO) . '" class="menuBoxContentLink">' . BOX_TOOLS_SERVER_INFO . '</a><br>' .
-                                   '<a href="' . tep_href_link(FILENAME_WHOS_ONLINE) . '" class="menuBoxContentLink">' . BOX_TOOLS_WHOS_ONLINE . '</a>');
-  }
 
-  $box = new box;
-  echo $box->menuBox($heading, $contents);
+  $cl_box_groups[] = array(
+    'heading' => BOX_HEADING_TOOLS,
+    'apps' => array(
+      array(
+        'code' => FILENAME_ACTION_RECORDER,
+        'title' => BOX_TOOLS_ACTION_RECORDER,
+        'link' => tep_href_link(FILENAME_ACTION_RECORDER)
+      ),
+      array(
+        'code' => FILENAME_BACKUP,
+        'title' => BOX_TOOLS_BACKUP,
+        'link' => tep_href_link(FILENAME_BACKUP)
+      ),
+      array(
+        'code' => FILENAME_BANNER_MANAGER,
+        'title' => BOX_TOOLS_BANNER_MANAGER,
+        'link' => tep_href_link(FILENAME_BANNER_MANAGER)
+      ),
+      array(
+        'code' => FILENAME_CACHE,
+        'title' => BOX_TOOLS_CACHE,
+        'link' => tep_href_link(FILENAME_CACHE)
+      ),
+      array(
+        'code' => FILENAME_DEFINE_LANGUAGE,
+        'title' => BOX_TOOLS_DEFINE_LANGUAGE,
+        'link' => tep_href_link(FILENAME_DEFINE_LANGUAGE)
+      ),
+      array(
+        'code' => FILENAME_MAIL,
+        'title' => BOX_TOOLS_MAIL,
+        'link' => tep_href_link(FILENAME_MAIL)
+      ),
+      array(
+        'code' => FILENAME_NEWSLETTERS,
+        'title' => BOX_TOOLS_NEWSLETTER_MANAGER,
+        'link' => tep_href_link(FILENAME_NEWSLETTERS)
+      ),
+      array(
+        'code' => FILENAME_SEC_DIR_PERMISSIONS,
+        'title' => BOX_TOOLS_SEC_DIR_PERMISSIONS,
+        'link' => tep_href_link(FILENAME_SEC_DIR_PERMISSIONS)
+      ),
+      array(
+        'code' => FILENAME_SERVER_INFO,
+        'title' => BOX_TOOLS_SERVER_INFO,
+        'link' => tep_href_link(FILENAME_SERVER_INFO)
+      ),
+      array(
+        'code' => FILENAME_VERSION_CHECK,
+        'title' => BOX_TOOLS_VERSION_CHECK,
+        'link' => tep_href_link(FILENAME_VERSION_CHECK)
+      ),
+      array(
+        'code' => FILENAME_WHOS_ONLINE,
+        'title' => BOX_TOOLS_WHOS_ONLINE,
+        'link' => tep_href_link(FILENAME_WHOS_ONLINE)
+      )
+    )
+  );
 ?>
-            </td>
-          </tr>
-<!-- tools_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/action_recorder.php 2.3.1.src/admin/includes/classes/action_recorder.php
--- 2.2rc2a.cp.src/admin/includes/classes/action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,52 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  require(DIR_FS_CATALOG . 'includes/classes/action_recorder.php');
+
+  class actionRecorderAdmin extends actionRecorder {
+    function actionRecorderAdmin($module, $user_id = null, $user_name = null) {
+      global $language, $PHP_SELF;
+
+      $module = tep_sanitize_string(str_replace(' ', '', $module));
+
+      if (defined('MODULE_ACTION_RECORDER_INSTALLED') && tep_not_null(MODULE_ACTION_RECORDER_INSTALLED)) {
+        if (tep_not_null($module) && in_array($module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)), explode(';', MODULE_ACTION_RECORDER_INSTALLED))) {
+          if (!class_exists($module)) {
+            if (file_exists(DIR_FS_CATALOG . 'includes/modules/action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)))) {
+              include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)));
+              include(DIR_FS_CATALOG . 'includes/modules/action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)));
+            } else {
+              return false;
+            }
+          }
+        } else {
+          return false;
+        }
+      } else {
+        return false;
+      }
+
+      $this->_module = $module;
+
+      if (!empty($user_id) && is_numeric($user_id)) {
+        $this->_user_id = $user_id;
+      }
+
+      if (!empty($user_name)) {
+        $this->_user_name = $user_name;
+      }
+
+      $GLOBALS[$this->_module] = new $module();
+      $GLOBALS[$this->_module]->setIdentifier();
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/box.php 2.3.1.src/admin/includes/classes/box.php
--- 2.2rc2a.cp.src/admin/includes/classes/box.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/box.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: box.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,7 +14,7 @@
   $heading = array();
   $heading[] = array('params' => 'class="menuBoxHeading"',
                      'text'  => BOX_HEADING_TOOLS,
-                     'link'  => tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('selected_box')) . 'selected_box=tools'));
+                     'link'  => tep_href_link(basename($PHP_SELF));
 
   $contents = array();
   $contents[] = array('text'  => SOME_TEXT);
@@ -52,7 +52,7 @@
       $this->heading = $this->tableBlock($heading);
 
       $this->table_data_parameters = 'class="menuBoxContent"';
-      $this->contents = $this->tableBlock($contents);
+      $this->contents = (!empty($contents) ? $this->tableBlock($contents) : '');
 
       return $this->heading . $this->contents;
     }
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/cfg_modules.php 2.3.1.src/admin/includes/classes/cfg_modules.php
--- 2.2rc2a.cp.src/admin/includes/classes/cfg_modules.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/cfg_modules.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfg_modules {
+    var $_modules = array();
+
+    function cfg_modules() {
+      global $PHP_SELF, $language;
+
+      $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
+      $directory = DIR_WS_MODULES . 'cfg_modules';
+
+      if ($dir = @dir($directory)) {
+        while ($file = $dir->read()) {
+          if (!is_dir($directory . $file)) {
+            if (substr($file, strrpos($file, '.')) == $file_extension) {
+              $class = substr($file, 0, strrpos($file, '.'));
+
+              include(DIR_WS_LANGUAGES . $language . '/modules/cfg_modules/' . $file);
+              include(DIR_WS_MODULES . 'cfg_modules/' . $class . '.php');
+
+              $m = new $class();
+
+              $this->_modules[] = array('code' => $m->code,
+                                        'directory' => $m->directory,
+                                        'language_directory' => $m->language_directory,
+                                        'key' => $m->key,
+                                        'title' => $m->title,
+                                        'template_integration' => $m->template_integration);
+            }
+          }
+        }
+      }
+    }
+
+    function getAll() {
+      return $this->_modules;
+    }
+
+    function get($code, $key) {
+      foreach ($this->_modules as $m) {
+        if ($m['code'] == $code) {
+          return $m[$key];
+        }
+      }
+    }
+
+    function exists($code) {
+      foreach ($this->_modules as $m) {
+        if ($m['code'] == $code) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/currencies.php 2.3.1.src/admin/includes/classes/currencies.php
--- 2.2rc2a.cp.src/admin/includes/classes/currencies.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/email.php 2.3.1.src/admin/includes/classes/email.php
--- 2.2rc2a.cp.src/admin/includes/classes/email.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/email.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: email.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -156,7 +156,7 @@
  */
 
     function add_html($html, $text = NULL, $images_dir = NULL) {
-      $this->html = tep_convert_linefeeds(array("\r\n", "\n", "\r"), '<br>', $html);
+      $this->html = tep_convert_linefeeds(array("\r\n", "\n", "\r"), '<br />', $html);
       $this->html_text = tep_convert_linefeeds(array("\r\n", "\n", "\r"), $this->lf, $text);
 
       if (isset($images_dir)) $this->find_html_images($images_dir);
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/language.php 2.3.1.src/admin/includes/classes/language.php
--- 2.2rc2a.cp.src/admin/includes/classes/language.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/language.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: language.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -84,7 +84,7 @@
       for ($i=0, $n=sizeof($this->browser_languages); $i<$n; $i++) {
         reset($this->languages);
         while (list($key, $value) = each($this->languages)) {
-          if (eregi('^(' . $value . ')(;q=[0-9]\\.[0-9])?$', $this->browser_languages[$i]) && isset($this->catalog_languages[$key])) {
+          if (preg_match('/^(' . $value . ')(;q=[0-9]\\.[0-9])?$/i', $this->browser_languages[$i]) && isset($this->catalog_languages[$key])) {
             $this->language = $this->catalog_languages[$key];
             break 2;
           }
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/logger.php 2.3.1.src/admin/includes/classes/logger.php
--- 2.2rc2a.cp.src/admin/includes/classes/logger.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/logger.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: logger.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/message_stack.php 2.3.1.src/admin/includes/classes/message_stack.php
--- 2.2rc2a.cp.src/admin/includes/classes/message_stack.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/message_stack.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: message_stack.php 1740 2007-12-20 14:57:13Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/mime.php 2.3.1.src/admin/includes/classes/mime.php
--- 2.2rc2a.cp.src/admin/includes/classes/mime.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/mime.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: mime.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/object_info.php 2.3.1.src/admin/includes/classes/object_info.php
--- 2.2rc2a.cp.src/admin/includes/classes/object_info.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/object_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: object_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/order.php 2.3.1.src/admin/includes/classes/order.php
--- 2.2rc2a.cp.src/admin/includes/classes/order.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/order.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: order.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/passwordhash.php 2.3.1.src/admin/includes/classes/passwordhash.php
--- 2.2rc2a.cp.src/admin/includes/classes/passwordhash.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/passwordhash.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,254 @@
+<?php
+#
+# Portable PHP password hashing framework.
+#
+# Version 0.3 / genuine.
+# Version 0.3 / osCommerce (silenced @is_readable('/dev/urandom'))
+#
+# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
+# the public domain.  Revised in subsequent years, still public domain.
+#
+# There's absolutely no warranty.
+#
+# The homepage URL for this framework is:
+#
+#	http://www.openwall.com/phpass/
+#
+# Please be sure to update the Version line if you edit this file in any way.
+# It is suggested that you leave the main version number intact, but indicate
+# your project name (after the slash) and add your own revision information.
+#
+# Please do not change the "private" password hashing method implemented in
+# here, thereby making your hashes incompatible.  However, if you must, please
+# change the hash type identifier (the "$P$") to something different.
+#
+# Obviously, since this code is in the public domain, the above are not
+# requirements (there can be none), but merely suggestions.
+#
+class PasswordHash {
+	var $itoa64;
+	var $iteration_count_log2;
+	var $portable_hashes;
+	var $random_state;
+
+	function PasswordHash($iteration_count_log2, $portable_hashes)
+	{
+		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
+			$iteration_count_log2 = 8;
+		$this->iteration_count_log2 = $iteration_count_log2;
+
+		$this->portable_hashes = $portable_hashes;
+
+		$this->random_state = microtime();
+		if (function_exists('getmypid'))
+			$this->random_state .= getmypid();
+	}
+
+	function get_random_bytes($count)
+	{
+		$output = '';
+		if (@is_readable('/dev/urandom') &&
+		    ($fh = @fopen('/dev/urandom', 'rb'))) {
+			$output = fread($fh, $count);
+			fclose($fh);
+		}
+
+		if (strlen($output) < $count) {
+			$output = '';
+			for ($i = 0; $i < $count; $i += 16) {
+				$this->random_state =
+				    md5(microtime() . $this->random_state);
+				$output .=
+				    pack('H*', md5($this->random_state));
+			}
+			$output = substr($output, 0, $count);
+		}
+
+		return $output;
+	}
+
+	function encode64($input, $count)
+	{
+		$output = '';
+		$i = 0;
+		do {
+			$value = ord($input[$i++]);
+			$output .= $this->itoa64[$value & 0x3f];
+			if ($i < $count)
+				$value |= ord($input[$i]) << 8;
+			$output .= $this->itoa64[($value >> 6) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			if ($i < $count)
+				$value |= ord($input[$i]) << 16;
+			$output .= $this->itoa64[($value >> 12) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			$output .= $this->itoa64[($value >> 18) & 0x3f];
+		} while ($i < $count);
+
+		return $output;
+	}
+
+	function gensalt_private($input)
+	{
+		$output = '$P$';
+		$output .= $this->itoa64[min($this->iteration_count_log2 +
+			((PHP_VERSION >= '5') ? 5 : 3), 30)];
+		$output .= $this->encode64($input, 6);
+
+		return $output;
+	}
+
+	function crypt_private($password, $setting)
+	{
+		$output = '*0';
+		if (substr($setting, 0, 2) == $output)
+			$output = '*1';
+
+		$id = substr($setting, 0, 3);
+		# We use "$P$", phpBB3 uses "$H$" for the same thing
+		if ($id != '$P$' && $id != '$H$')
+			return $output;
+
+		$count_log2 = strpos($this->itoa64, $setting[3]);
+		if ($count_log2 < 7 || $count_log2 > 30)
+			return $output;
+
+		$count = 1 << $count_log2;
+
+		$salt = substr($setting, 4, 8);
+		if (strlen($salt) != 8)
+			return $output;
+
+		# We're kind of forced to use MD5 here since it's the only
+		# cryptographic primitive available in all versions of PHP
+		# currently in use.  To implement our own low-level crypto
+		# in PHP would result in much worse performance and
+		# consequently in lower iteration counts and hashes that are
+		# quicker to crack (by non-PHP code).
+		if (PHP_VERSION >= '5') {
+			$hash = md5($salt . $password, TRUE);
+			do {
+				$hash = md5($hash . $password, TRUE);
+			} while (--$count);
+		} else {
+			$hash = pack('H*', md5($salt . $password));
+			do {
+				$hash = pack('H*', md5($hash . $password));
+			} while (--$count);
+		}
+
+		$output = substr($setting, 0, 12);
+		$output .= $this->encode64($hash, 16);
+
+		return $output;
+	}
+
+	function gensalt_extended($input)
+	{
+		$count_log2 = min($this->iteration_count_log2 + 8, 24);
+		# This should be odd to not reveal weak DES keys, and the
+		# maximum valid value is (2**24 - 1) which is odd anyway.
+		$count = (1 << $count_log2) - 1;
+
+		$output = '_';
+		$output .= $this->itoa64[$count & 0x3f];
+		$output .= $this->itoa64[($count >> 6) & 0x3f];
+		$output .= $this->itoa64[($count >> 12) & 0x3f];
+		$output .= $this->itoa64[($count >> 18) & 0x3f];
+
+		$output .= $this->encode64($input, 3);
+
+		return $output;
+	}
+
+	function gensalt_blowfish($input)
+	{
+		# This one needs to use a different order of characters and a
+		# different encoding scheme from the one in encode64() above.
+		# We care because the last character in our encoded string will
+		# only represent 2 bits.  While two known implementations of
+		# bcrypt will happily accept and correct a salt string which
+		# has the 4 unused bits set to non-zero, we do not want to take
+		# chances and we also do not want to waste an additional byte
+		# of entropy.
+		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+		$output = '$2a$';
+		$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
+		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
+		$output .= '$';
+
+		$i = 0;
+		do {
+			$c1 = ord($input[$i++]);
+			$output .= $itoa64[$c1 >> 2];
+			$c1 = ($c1 & 0x03) << 4;
+			if ($i >= 16) {
+				$output .= $itoa64[$c1];
+				break;
+			}
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 4;
+			$output .= $itoa64[$c1];
+			$c1 = ($c2 & 0x0f) << 2;
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 6;
+			$output .= $itoa64[$c1];
+			$output .= $itoa64[$c2 & 0x3f];
+		} while (1);
+
+		return $output;
+	}
+
+	function HashPassword($password)
+	{
+		$random = '';
+
+		if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
+			$random = $this->get_random_bytes(16);
+			$hash =
+			    crypt($password, $this->gensalt_blowfish($random));
+			if (strlen($hash) == 60)
+				return $hash;
+		}
+
+		if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
+			if (strlen($random) < 3)
+				$random = $this->get_random_bytes(3);
+			$hash =
+			    crypt($password, $this->gensalt_extended($random));
+			if (strlen($hash) == 20)
+				return $hash;
+		}
+
+		if (strlen($random) < 6)
+			$random = $this->get_random_bytes(6);
+		$hash =
+		    $this->crypt_private($password,
+		    $this->gensalt_private($random));
+		if (strlen($hash) == 34)
+			return $hash;
+
+		# Returning '*' on error is safe here, but would _not_ be safe
+		# in a crypt(3)-like function used _both_ for generating new
+		# hashes and for validating passwords against existing hashes.
+		return '*';
+	}
+
+	function CheckPassword($password, $stored_hash)
+	{
+		$hash = $this->crypt_private($password, $stored_hash);
+		if ($hash[0] == '*')
+			$hash = crypt($password, $stored_hash);
+
+		return $hash == $stored_hash;
+	}
+}
+
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/phplot.php 2.3.1.src/admin/includes/classes/phplot.php
--- 2.2rc2a.cp.src/admin/includes/classes/phplot.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/phplot.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: phplot.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -517,7 +517,7 @@
 
 				break;
 			default:
-				$this->PrintError('Please select an image type!<br>');
+				$this->PrintError('Please select an image type!<br />');
 				break;
 		}
 		ImageDestroy($this->img);
@@ -672,12 +672,12 @@
 				$which_xpos, $which_ypos, $which_color, $which_font, $which_text); 
 		} else { 
 			if ($which_valign == 'top') { 
-				$which_ypos = $which_ypos - ImageFontHeight($which_font);
+				$which_ypos = $which_ypos - ImageFontHeight((int)$which_font);
 			}
-			$which_text = ereg_replace("\r","",$which_text);
-			$str = split("\n",$which_text); //multiple lines submitted by Remi Ricard
-			$height = ImageFontHeight($which_font);
-			$width = ImageFontWidth($which_font);
+			$which_text = preg_replace("/\r/","",$which_text);
+			$str = explode("\n",$which_text); //multiple lines submitted by Remi Ricard
+			$height = ImageFontHeight((int)$which_font);
+			$width = ImageFontWidth((int)$which_font);
 			if ($which_angle == 90) {  //Vertical Code Submitted by Marlin Viss
 				for($i=0;$i<count($str);$i++) { 
 					ImageStringUp($this->img, $which_font, ($i*$height + $which_xpos), $which_ypos, $str[$i], $which_color);
@@ -686,9 +686,9 @@
 				for($i=0;$i<count($str);$i++) { 
 					if ($which_halign == 'center') { 
                     	$xpos = $which_xpos - strlen($str[$i]) * $width/2;
- 						ImageString($this->img, $which_font, $xpos, ($i*$height + $which_ypos), $str[$i], $which_color);
+ 						ImageString($this->img, (int)$which_font, $xpos, ($i*$height + $which_ypos), $str[$i], $which_color);
 					} else { 
-						ImageString($this->img, $which_font, $which_xpos, ($i*$height + $which_ypos), $str[$i], $which_color); 
+						ImageString($this->img, (int)$which_font, $which_xpos, ($i*$height + $which_ypos), $str[$i], $which_color);
 					}
 				} 
 			}
@@ -779,7 +779,7 @@
 	function SetPlotType($which_pt) {
 		$accepted = "bars,lines,linepoints,area,points,pie,thinbarline";
 		$asked = trim($which_pt);
-		if (eregi($asked, $accepted)) {
+		if (preg_match('/' . $asked .'/i', $accepted)) {
 			$this->plot_type = $which_pt;
 			return true;
 		} else {
@@ -936,7 +936,7 @@
 		// It thus depends on the current character size, set by SetCharacterHeight().
 		/////////////////////////////////////////////////////////////////
 
-		$str = split("\n",$this->title_txt); 
+		$str = explode("\n",$this->title_txt);
 		$nbLines = count($str); 
 
 		if ($this->use_ttf == 1) {
@@ -1077,7 +1077,7 @@
 
 	function PrintError($error_message) {
 	// prints the error message to stdout and die
-		echo "<p><b>Fatal error</b>: $error_message<p>";
+		echo "<p><strong>Fatal error</strong>: $error_message<p>";
 		die;
 	}
 
@@ -1165,7 +1165,7 @@
 		}
 
 		$this->y_label_width = $size[0] * 2;
-//echo "SYLW: $this->y_label_width<br>";
+//echo "SYLW: $this->y_label_width<br />";
 //exit;
 
 		$this->SetMargins();
@@ -1949,7 +1949,7 @@
 			$i = 0;
 
 			while (list($key, $val) = each($row)) {
-//echo "$key, $i, $val<br>";
+//echo "$key, $i, $val<br />";
 				if ($key == 0) {
 					$lab = $val;
 				} elseif ($key == 1) {
@@ -1968,7 +1968,7 @@
 					$barcol = $this->ndx_data_color[$color_index];
 					$error_barcol = $this->ndx_error_bar_color[$color_index];
 
-//echo "start = $start_lines<br>";
+//echo "start = $start_lines<br />";
 					if ($start_lines == 1) {
 						for ($width = 0; $width < $this->line_width; $width++) {
 							ImageLine($this->img, $x_now_pixels, $y_now_pixels + $width,
@@ -2214,7 +2214,7 @@
 		while (list(, $row) = each($posarr)) {
 			if ($color_index >= count($this->ndx_data_color)) $color_index=0;
 			$barcol = $this->ndx_data_color[$color_index];
-//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol<br>";
+//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol<br />";
 			ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol);
 			$color_index++;
 		}
@@ -2266,7 +2266,7 @@
 		while (list(, $row) = each($posarr)) {
 			if ($color_index >= count($this->ndx_data_color)) $color_index=0;
 			$barcol = $this->ndx_data_color[$color_index];
-//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol<br>";
+//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol<br />";
 			ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol);
 			$color_index++;
 		}
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/rss.php 2.3.1.src/admin/includes/classes/rss.php
--- 2.2rc2a.cp.src/admin/includes/classes/rss.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/rss.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,233 @@
+<?php
+/* 
+ ======================================================================
+ lastRSS 0.9.1
+
+ Simple yet powerfull PHP class to parse RSS files.
+
+ by Vojtech Semecky, webmaster @ oslab . net
+
+ Latest version, features, manual and examples:
+     http://lastrss.oslab.net/
+
+ ----------------------------------------------------------------------
+ LICENSE
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License (GPL)
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ To read the license please visit http://www.gnu.org/copyleft/gpl.html
+ ======================================================================
+*/
+
+/**
+* lastRSS
+* Simple yet powerfull PHP class to parse RSS files.
+*/
+class lastRSS {
+    // -------------------------------------------------------------------
+    // Public properties
+    // -------------------------------------------------------------------
+    var $default_cp = 'UTF-8';
+    var $CDATA = 'strip';
+    var $cp = '';
+    var $items_limit = 0;
+    var $stripHTML = False;
+    var $date_format = '';
+
+    // -------------------------------------------------------------------
+    // Private variables
+    // -------------------------------------------------------------------
+    var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs');
+    var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');
+    var $imagetags = array('title', 'url', 'link', 'width', 'height');
+    var $textinputtags = array('title', 'description', 'name', 'link');
+
+    // -------------------------------------------------------------------
+    // Parse RSS file and returns associative array.
+    // -------------------------------------------------------------------
+    function Get ($rss_url) {
+        // If CACHE ENABLED
+        if ($this->cache_dir != '') {
+            $cache_file = $this->cache_dir . '/rss_' . md5($rss_url) . '.cache';
+            $timedif = @(time() - filemtime($cache_file));
+            if ($timedif < $this->cache_time) {
+                // cached file is fresh enough, return cached array
+                $result = unserialize(join('', file($cache_file)));
+                // set 'cached' to 1 only if cached file is correct
+                if ($result) $result['cached'] = 1;
+            } else {
+                // cached file is too old, create new
+                $result = $this->Parse($rss_url);
+                $serialized = serialize($result);
+                if ($f = @fopen($cache_file, 'w')) {
+                    fwrite ($f, $serialized, strlen($serialized));
+                    fclose($f);
+                }
+                if ($result) $result['cached'] = 0;
+            }
+        }
+        // If CACHE DISABLED >> load and parse the file directly
+        else {
+            $result = $this->Parse($rss_url);
+            if ($result) $result['cached'] = 0;
+        }
+        // return result
+        return $result;
+    }
+
+    // -------------------------------------------------------------------
+    // Modification of preg_match(); return trimed field with index 1
+    // from 'classic' preg_match() array output
+    // -------------------------------------------------------------------
+    function my_preg_match ($pattern, $subject) {
+        // start regullar expression
+        preg_match($pattern, $subject, $out);
+        // if there is some result... process it and return it
+        if(isset($out[1])) {
+            // Process CDATA (if present)
+            if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag)
+                $out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
+            } elseif ($this->CDATA == 'strip') { // Strip CDATA
+                $out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
+            }
+
+            // If code page is set convert character encoding to required
+            if ($this->cp != '')
+                //$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
+                $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);
+            // Return result
+            return trim($out[1]);
+        } else {
+        // if there is NO result, return empty string
+            return '';
+        }
+    }
+
+    // -------------------------------------------------------------------
+    // Replace HTML entities &something; by real characters
+    // -------------------------------------------------------------------
+    function unhtmlentities ($string) {
+        // Get HTML entities table
+        $trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
+        // Flip keys<==>values
+        $trans_tbl = array_flip ($trans_tbl);
+        // Add support for &apos; entity (missing in HTML_ENTITIES)
+        $trans_tbl += array('&apos;' => "'");
+        // Replace entities by values
+        return strtr ($string, $trans_tbl);
+    }
+
+    // -------------------------------------------------------------------
+    // Parse() is private method used by Get() to load and parse RSS file.
+    // Don't use Parse() in your scripts - use Get($rss_file) instead.
+    // -------------------------------------------------------------------
+    function Parse ($rss_url) {
+        $rss_content = '';
+
+        // Open and load RSS file
+        if (function_exists('curl_init')) {
+          $curl = curl_init($rss_url);
+          curl_setopt($curl, CURLOPT_HEADER, 0);
+          curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+          curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+
+          $rss_content = curl_exec($curl);
+
+          curl_close($curl);
+        } else {
+          if ($f = @fopen($rss_url, 'r')) {
+            while (!feof($f)) {
+                $rss_content .= fgets($f, 4096);
+            }
+            fclose($f);
+          }
+        }
+
+        if (!empty($rss_content)) {
+            // Parse document encoding
+            $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);
+            // if document codepage is specified, use it
+            if ($result['encoding'] != '')
+                { $this->rsscp = $result['encoding']; } // This is used in my_preg_match()
+            // otherwise use the default codepage
+            else
+                { $this->rsscp = $this->default_cp; } // This is used in my_preg_match()
+
+            // Parse CHANNEL info
+            preg_match("'<channel.*?>(.*?)</channel>'si", $rss_content, $out_channel);
+            foreach($this->channeltags as $channeltag)
+            {
+                $temp = $this->my_preg_match("'<$channeltag.*?>(.*?)</$channeltag>'si", $out_channel[1]);
+                if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty
+            }
+            // If date_format is specified and lastBuildDate is valid
+            if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {
+                        // convert lastBuildDate to specified date format
+                        $result['lastBuildDate'] = date($this->date_format, $timestamp);
+            }
+
+            // Parse TEXTINPUT info
+            preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);
+                // This a little strange regexp means:
+                // Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it's not beggining tag)
+            if (isset($out_textinfo[2])) {
+                foreach($this->textinputtags as $textinputtag) {
+                    $temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)</$textinputtag>'si", $out_textinfo[2]);
+                    if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
+                }
+            }
+            // Parse IMAGE info
+            preg_match("'<image.*?>(.*?)</image>'si", $rss_content, $out_imageinfo);
+            if (isset($out_imageinfo[1])) {
+                foreach($this->imagetags as $imagetag) {
+                    $temp = $this->my_preg_match("'<$imagetag.*?>(.*?)</$imagetag>'si", $out_imageinfo[1]);
+                    if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty
+                }
+            }
+            // Parse ITEMS
+            preg_match_all("'<item(| .*?)>(.*?)</item>'si", $rss_content, $items);
+            $rss_items = $items[2];
+            $i = 0;
+            $result['items'] = array(); // create array even if there are no items
+            foreach($rss_items as $rss_item) {
+                // If number of items is lower then limit: Parse one item
+                if ($i < $this->items_limit || $this->items_limit == 0) {
+                    foreach($this->itemtags as $itemtag) {
+                        $temp = $this->my_preg_match("'<$itemtag.*?>(.*?)</$itemtag>'si", $rss_item);
+                        if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty
+                    }
+                    // Strip HTML tags and other bullshit from DESCRIPTION
+                    if ($this->stripHTML && $result['items'][$i]['description'])
+                        $result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
+                    // Strip HTML tags and other bullshit from TITLE
+                    if ($this->stripHTML && $result['items'][$i]['title'])
+                        $result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));
+                    // If date_format is specified and pubDate is valid
+                    if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {
+                        // convert pubDate to specified date format
+                        $result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);
+                    }
+                    // Item counter
+                    $i++;
+                }
+            }
+
+            $result['items_count'] = $i;
+            return $result;
+        }
+        else // Error in opening return False
+        {
+            return False;
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/sessions.php 2.3.1.src/admin/includes/classes/sessions.php
--- 2.2rc2a.cp.src/admin/includes/classes/sessions.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/sessions.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,512 +0,0 @@
-<?php
-/*
-  $Id: sessions.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-
-  Original source from Web Application Development with PHP (Tobias Ratschiller, Till Gerken)
-  Copyright (c) 2000, New Riders Publishing
-*/
-
-  $SID = '';
-
-  class php3session {
-    var $name = PHP_SESSION_NAME;
-    var $auto_start = false;
-    var $referer_check = false;
-
-    var $save_path = PHP_SESSION_SAVE_PATH;
-    var $save_handler = 'php3session_files';
-
-    var $lifetime = 0;
-
-    var $cache_limiter = 'nocache';
-    var $cache_expire = 180;
-
-    var $use_cookies = true;
-    var $cookie_lifetime = 0;
-    var $cookie_path = substr(DIR_WS_ADMIN, 0, -1);
-    var $cookie_domain = '';
-
-    var $gc_probability = 1;
-    var $gc_maxlifetime = 0;
-
-    var $serialize_handler = 'php';
-    var $ID;
-
-    var $nr_open_sessions = 0;
-    var $mod_name = '';
-    var $id;
-    var $delimiter = "\n";
-    var $delimiter_value = '[==]';
-
-    function php3session() {
-      $this->mod_name = $this->save_handler;
-    }
-  }
-
-  class php3session_user {
-    var $open_func, $close_func, $read_func, $write_func, $destroy_func, $gc_func;
-
-    function open($save_path, $sess_name) {
-      $func = $this->open_func;
-      if (function_exists($func)) {
-        return $func($save_path, $sess_name);
-      }
-
-      return true;
-    }
-
-    function close($save_path, $sess_name) {
-      $func = $this->close_func;
-      if (function_exists($func)) {
-        return $func();
-      }
-
-      return true;
-    }
-
-    function read($sess_id) {
-      $func = $this->read_func;
-
-      return $func($sess_id);
-    }
-
-    function write($sess_id, $val) {
-      $func = $this->write_func;
-
-      return $func($sess_id, $val);
-    }
-
-    function destroy($sess_id) {
-      $func = $this->destroy_func;
-      if (function_exists($func)) {
-        return $func($sess_id);
-      }
-
-      return true;
-    }
-
-    function gc($max_lifetime) {
-      $func = $this->gc_func;
-      if (function_exists($func)) {
-        return $func($max_lifetime);
-      }
-
-      return true;
-    }
-  }
-
-  class php3session_files {
-    function open($save_path, $sess_name) {
-      return true;
-    }
-
-    function close() {
-      return true;
-    }
-
-    function read($sess_id) {
-      global $session;
-
-// Open, read in, close file with session data
-      $file = $session->save_path . '/sess_' . $sess_id;
-      if (!file_exists($file)) {
-// Create it
-        touch($file);
-      }
-      $fp = fopen($file, 'r') or die('Could not open session file (' . $file . ').');
-      $val = fread($fp, filesize($file));
-      fclose($fp);
-
-      return $val;
-    }
-
-    function write($sess_id, $val) {
-      global $session;
-
-// Open, write to, close file with session data
-      $file = $session->save_path . '/sess_' . $sess_id;
-      $fp = fopen($file, 'w') or die('Could not write session file (' . $file . ')');
-      $val = fputs($fp, $val);
-      fclose($fp);
-
-      return true;
-    }
-
-    function destroy($sess_id) {
-      global $session;
-
-      $file = $session->save_path . '/sess_' . $sess_id;
-      unlink($file);
-
-      return true;
-    }
-
-    function gc($max_lifetime) {
-// We return true, since all cleanup should be handled by
-// an external entity (i.e. find -ctime x | xargs rm)
-      return true;
-    }
-  }
-
-  function _session_create_id() {
-    return md5(uniqid(microtime()));
-  }
-
-  function _session_cache_limiter() {
-    global $session;
-
-    switch ($session->cache_limiter) {
-      case 'nocache':
-                      header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
-                      header('Cache-Control: no-cache');
-                      header('Pragma: no-cache');
-                      break;
-      case 'private':
-                      header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
-                      header(sprintf('Cache-Control: private, max-age=%s', $session->cache_expire * 60));
-                      header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime(basename($GLOBALS['PHP_SELF']))) . ' GMT');
-                      break;
-      case 'public':
-                      $now = time();
-                      $now += $session->cache_expire * 60;
-                      $now = gmdate('D, d M Y H:i:s', $now) . ' GMT';
-                      header('Expires: ' . $now);
-                      header(sprintf('Cache-Control: public, max-age=%s', $session->cache_expire * 60));
-                      header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime(basename($GLOBALS['PHP_SELF']))) . ' GMT');
-                      break;
-      default:
-                      die('Caching method ' . $session->cache_limiter . ' not implemented.');
-    }
-  }
-
-  function _php_encode() {
-    global $session;
-
-    $ret = '';
-// Create a string containing the serialized variables
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      $ret .= $session->vars[$i] . $session->delimiter_value . serialize($GLOBALS[$session->vars[$i]]) . $session->delimiter;
-    }
-
-    return $ret;
-  }
-
-  function _php_decode($data) {
-    global $session;
-
-    $data = trim($data);
-    $vars = explode($session->delimiter, $data);
-
-// Add the variables to the global namespace
-    for (reset($vars); list($i)=each($vars);) {
-      $tmp = explode($session->delimiter_value, $vars[$i]);
-      $name = trim($tmp[0]);
-      $value = trim($tmp[1]);
-      $GLOBALS[$name] = unserialize($value);
-      $session->vars[] = trim($name);
-    }
-  }
-
-  function _wddx_encode($data) {
-    global $session;
-
-    $ret = wddx_serialize_vars($session->vars);
-
-    return $ret;
-  }
-
-  function _wddx_decode($data) {
-    return wddx_deserialize($data);
-  }
-
-  function session_name($name = '') {
-    global $session;
-
-    if (empty($name)) {
-      return $session->name;
-    }
-
-    $session->name = $name;
-  }
-
-  function session_set_save_handler($open, $close, $read, $write, $destroy, $gc) {
-    global $session, $php3session_user;
-
-    $php3session_user = new php3session_user;
-    $php3session_user->open_func = $open;
-    $php3session_user->close_func = $close;
-    $php3session_user->read_func = $read;
-    $php3session_user->write_func = $write;
-    $php3session_user->destroy_func = $destroy;
-    $php3session_user->gc_func = $gc;
-    $session->mod_name = 'php3session_user';
-  }
-
-  function session_module_name($name = '') {
-    global $session;
-
-    if (empty($name)) {
-      return $session->mod_name;
-    }
-
-    $session->mod_name = $name;
-  }
-
-  function session_save_path($path = '') {
-    global $session;
-
-    if(empty($path)) {
-      return $session->save_path;
-    }
-
-    $session->save_path = $path;
-  }
-
-  function session_id($id = '') {
-    global $session;
-
-    if(empty($id)) {
-      return $session->id;
-    }
-
-    $session->id = $id;
-  }
-
-  function session_register($var) {
-    global $session;
-
-    if ($session->nr_open_sessions == 0) {
-      session_start();
-    }
-
-    $session->vars[] = trim($var);
-  }
-
-  function session_unregister($var) {
-    global $session;
-
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      if ($session->vars[$i] == trim($var)) {
-        unset($session->vars[$i]);
-        break;
-      }
-    }
-  }
-
-  function session_is_registered($var) {
-    global $session;
-
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      if ($session->vars[$i] == trim($var)) {
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  function session_encode() {
-    global $session;
-
-    $serializer = '_' . $session->serialize_handler . '_encode';
-    $ret = $serializer();
-
-    return $ret;
-  }
-
-  function session_decode($data) {
-    global $session;
-
-    $serializer = '_' . $session->serialize_handler . '_decode';
-    $ret = $serializer($data);
-
-    return $ret;
-  }
-
-  function session_start() {
-    global $session, $SID, $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS;
-
-// Define the global variable $SID?
-    $define_sid = true;
-
-// Send the session cookie?
-    $send_cookie = true;
-
-// Is track_vars enabled?
-    $track_vars = ( (isset($HTTP_COOKIE_VARS)) || (isset($HTTP_GET_VARS)) || (isset($HTTP_POST_VARS)) ) ? true : false;
-
-// Check if session_start() has been called once already
-    if ($session->nr_open_sessions != 0) {
-      return false;
-    }
-
-// If our only resource is the global symbol_table, then check it.
-// If track_vars are enabled, we prefer these, because they are more
-// reliable, and we always know whether the user has accepted the 
-// cookie.
-    if ( (isset($GLOBALS[$session->name])) && (!empty($GLOBALS[$session->name])) && (!$track_vars) ) {
-      $session->id = $GLOBALS[$session->name];
-      $send_cookie = false;
-    }
-
-// Now check the track_vars. Cookies are preferred, because initially
-// cookie and get variables will be available. 
-    if ( (empty($session->id)) && ($track_vars) ) {
-      if (isset($HTTP_COOKIE_VARS[$session->name])) {
-        $session->id = $HTTP_COOKIE_VARS[$session->name];
-        $define_sid = false;
-        $send_cookie = false;
-      }
-
-      if (isset($HTTP_GET_VARS[$session->name])) {
-        $session->id = $HTTP_GET_VARS[$session->name];
-      }
-
-      if (isset($HTTP_POST_VARS[$session->name])) {
-        $session->id = $HTTP_POST_VARS[$session->name];
-      }
-    }
-
-/*
-// Check the REQUEST_URI symbol for a string of the form
-// '<session-name>=<session-id>' to allow URLs of the form
-// http://yoursite/<session-name>=<session-id>/script.php 
-    if (empty($session->id)) {
-      eregi($session->name . '=([^/]+)', $GLOBALS['REQUEST_URI'], $regs);
-      $regs[1] = trim($regs[1]);
-      if (!empty($regs[1])) {
-        $session->id = $regs[1];
-      }
-    }
-*/
-
-// Check whether the current request was referred to by
-// an external site which invalidates the previously found ID
-    if ( (!empty($session->id)) && ($session->referer_check) ) {
-      $url = parse_url($GLOBALS['HTTP_REFERER']);
-      if (trim($url['host']) != $GLOBALS['SERVER_NAME']) {
-        unset($session->id);
-        $send_cookie = true;
-        $define_sid = true;
-      }
-    }
-
-// Do we have an existing session ID?
-    if (empty($session->id)) {
-// Create new session ID
-      $session->id = _session_create_id();
-    }
-
-// Is use_cookies set to false?
-    if ( (!$session->use_cookies) && ($send_cookie) ) {
-      $define_sid = true;
-      $send_cookie = false;
-    }
-
-// Should we send a cookie?
-    if ($send_cookie) {
-      setcookie($session->name, $session->id, $session->cookie_lifetime, $session->cookie_path, $session->cookie_domain);
-    }
-
-// Should we define the SID?
-    if($define_sid) {
-      $SID = $session->name . '=' . $session->id;
-    }
-
-    $session->nr_open_sessions++;
-
-// Send caching headers
-
-// Start session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->open($session->save_path, $session->name)) {
-      die('Failed to initialize session module.');
-    }
-
-// Read session data
-    if ($val = $mod->read($session->id)) {
-// Decode session data
-      session_decode($val);
-    }
-
-// Send HTTP cache headers
-    _session_cache_limiter();
-
-// Check if we should clean up (call the garbage collection routines)
-    if ($session->gc_probability > 0) {
-      $randmax = getrandmax();
-      $nrand = (int)(100 * tep_rand() / $randmax);
-      if ($nrand < $session->gc_probability) {
-        $mod->gc($session->gc_maxlifetime);
-      }
-    }
-
-    if ($define_sid) {
-      define('SID', $SID);
-    } else {
-      define('SID', '');
-    }
-
-    return true;
-  }
-
-  function session_destroy() {
-    global $session;
-
-    if ($session->nr_open_sessions == 0) {
-      return false;
-    }
-
-// Destroy session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->destroy($session->id)) {
-      return false;
-    }
-    unset($session);
-    $session = new php3session;
-
-    return true;
-  }
-
-  function session_close() {
-    global $session, $SID;
-
-    if ($session->nr_open_sessions == 0) {
-      return false;
-    }
-// Encode session
-    $val = session_encode();
-    $len = strlen($val);
-
-// Save session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->write($session->id, $val)) {
-      die('Session could not be saved.');
-    }
-// Close session
-    if ( (function_exists($session->mod_name . '->close')) && (!$mod->close()) ) {
-      die('Session could not be closed.');
-    }
-    $SID = '';
-    $session->nr_open_sessions--;
-
-    return true;
-  }
-
-  $session = new php3session;
-  $mod = $session->save_handler;
-  $$mod = new $mod;
-
-  if ($session->auto_start) {
-    $ret = session_start() or die('Session could not be started.');
-  }
-
-  register_shutdown_function('session_close');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/shopping_cart.php 2.3.1.src/admin/includes/classes/shopping_cart.php
--- 2.2rc2a.cp.src/admin/includes/classes/shopping_cart.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/split_page_results.php 2.3.1.src/admin/includes/classes/split_page_results.php
--- 2.2rc2a.cp.src/admin/includes/classes/split_page_results.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/split_page_results.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: split_page_results.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -60,7 +60,7 @@
           $display_links .= PREVNEXT_BUTTON_PREV . '&nbsp;&nbsp;';
         }
 
-        $display_links .= sprintf(TEXT_RESULT_PAGE, tep_draw_pull_down_menu($page_name, $pages_array, $current_page_number, 'onChange="this.form.submit();"'), $num_pages);
+        $display_links .= sprintf(TEXT_RESULT_PAGE, tep_draw_pull_down_menu($page_name, $pages_array, $current_page_number, 'onchange="this.form.submit();"'), $num_pages);
 
         if (($current_page_number < $num_pages) && ($num_pages != 1)) {
           $display_links .= '&nbsp;&nbsp;<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $page_name . '=' . ($current_page_number + 1), 'NONSSL') . '" class="splitPageLink">' . PREVNEXT_BUTTON_NEXT . '</a>';
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/table_block.php 2.3.1.src/admin/includes/classes/table_block.php
--- 2.2rc2a.cp.src/admin/includes/classes/table_block.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/table_block.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: table_block.php 1745 2007-12-21 02:29:49Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/classes/upload.php 2.3.1.src/admin/includes/classes/upload.php
--- 2.2rc2a.cp.src/admin/includes/classes/upload.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/classes/upload.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: upload.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -139,7 +139,7 @@
     function check_destination() {
       global $messageStack;
 
-      if (!is_writeable($this->destination)) {
+      if (!tep_is_writable($this->destination)) {
         if (is_dir($this->destination)) {
           if ($this->message_location == 'direct') {
             $messageStack->add(sprintf(ERROR_DESTINATION_NOT_WRITEABLE, $this->destination), 'error');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/column_left.php 2.3.1.src/admin/includes/column_left.php
--- 2.2rc2a.cp.src/admin/includes/column_left.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/column_left.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,21 +1,70 @@
 <?php
 /*
-  $Id: column_left.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
-  require(DIR_WS_BOXES . 'configuration.php');
-  require(DIR_WS_BOXES . 'catalog.php');
-  require(DIR_WS_BOXES . 'modules.php');
-  require(DIR_WS_BOXES . 'customers.php');
-  require(DIR_WS_BOXES . 'taxes.php');
-  require(DIR_WS_BOXES . 'localization.php');
-  require(DIR_WS_BOXES . 'reports.php');
-  require(DIR_WS_BOXES . 'tools.php');
+  if (tep_session_is_registered('admin')) {
+    $cl_box_groups = array();
+
+    include(DIR_WS_BOXES . 'configuration.php');
+    include(DIR_WS_BOXES . 'catalog.php');
+    include(DIR_WS_BOXES . 'modules.php');
+    include(DIR_WS_BOXES . 'customers.php');
+    include(DIR_WS_BOXES . 'taxes.php');
+    include(DIR_WS_BOXES . 'localization.php');
+    include(DIR_WS_BOXES . 'reports.php');
+    include(DIR_WS_BOXES . 'tools.php');
+?>
+
+<div id="adminAppMenu">
+
+<?php
+    foreach ($cl_box_groups as $groups) {
+      echo '<h3><a href="#">' . $groups['heading'] . '</a></h3>' .
+           '<div><ul>';
+
+      foreach ($groups['apps'] as $app) {
+        echo '<li><a href="' . $app['link'] . '">' . $app['title'] . '</a></li>';
+      }
+
+      echo '</ul></div>';
+    }
+?>
+
+</div>
+
+<script type="text/javascript">
+$('#adminAppMenu').accordion({
+  autoHeight: false,
+  icons: {
+    'header': 'ui-icon-plus',
+    'headerSelected': 'ui-icon-minus'
+  }
+
+<?php
+    $counter = 0;
+    foreach ($cl_box_groups as $groups) {
+      foreach ($groups['apps'] as $app) {
+        if ($app['code'] == $PHP_SELF) {
+          echo ',active: ' . $counter;
+          break;
+        }
+      }
+
+      $counter++;
+    }
+?>
+
+});
+</script>
+
+<?php
+  }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/configure.php 2.3.1.src/admin/includes/configure.php
--- 2.2rc2a.cp.src/admin/includes/configure.php	2009-03-10 07:07:01.000000000 -0500
+++ 2.3.1.src/admin/includes/configure.php	2010-12-01 13:16:35.000000000 -0600
@@ -22,6 +22,8 @@
   define('DIR_FS_CATALOG_IMAGES', DIR_FS_CATALOG . 'images/');
   define('DIR_FS_CATALOG_MODULES', DIR_FS_CATALOG . 'includes/modules/');
   define('DIR_FS_BACKUP', DIR_FS_ADMIN . 'backups/');
+  define('DIR_FS_DOWNLOAD', DIR_FS_CATALOG . 'download/');
+  define('DIR_FS_DOWNLOAD_PUBLIC', DIR_FS_CATALOG . 'pub/');
 
   define('DB_SERVER', '[% mysql.osc.sqlhost %]');
   define('DB_SERVER_USERNAME', '[% mysql_user %]');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/database_tables.php 2.3.1.src/admin/includes/database_tables.php
--- 2.2rc2a.cp.src/admin/includes/database_tables.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/database_tables.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: database_tables.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,7 @@
 */
 
 // define the database table names used in the project
+  define('TABLE_ACTION_RECORDER', 'action_recorder');
   define('TABLE_ADDRESS_BOOK', 'address_book');
   define('TABLE_ADDRESS_FORMAT', 'address_format');
   define('TABLE_ADMINISTRATORS', 'administrators');
@@ -41,6 +42,7 @@
   define('TABLE_PRODUCTS_ATTRIBUTES', 'products_attributes');
   define('TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD', 'products_attributes_download');
   define('TABLE_PRODUCTS_DESCRIPTION', 'products_description');
+  define('TABLE_PRODUCTS_IMAGES', 'products_images');
   define('TABLE_PRODUCTS_NOTIFICATIONS', 'products_notifications');
   define('TABLE_PRODUCTS_OPTIONS', 'products_options');
   define('TABLE_PRODUCTS_OPTIONS_VALUES', 'products_options_values');
@@ -48,6 +50,7 @@
   define('TABLE_PRODUCTS_TO_CATEGORIES', 'products_to_categories');
   define('TABLE_REVIEWS', 'reviews');
   define('TABLE_REVIEWS_DESCRIPTION', 'reviews_description');
+  define('TABLE_SEC_DIRECTORY_WHITELIST', 'sec_directory_whitelist');
   define('TABLE_SESSIONS', 'sessions');
   define('TABLE_SPECIALS', 'specials');
   define('TABLE_TAX_CLASS', 'tax_class');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/filenames.php 2.3.1.src/admin/includes/filenames.php
--- 2.2rc2a.cp.src/admin/includes/filenames.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/filenames.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: filenames.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,7 @@
 */
 
 // define the filenames used in the project
+  define('FILENAME_ACTION_RECORDER', 'action_recorder.php');
   define('FILENAME_ADMINISTRATORS', 'administrators.php');
   define('FILENAME_BACKUP', 'backup.php');
   define('FILENAME_BANNER_MANAGER', 'banner_manager.php');
@@ -24,7 +25,6 @@
   define('FILENAME_CUSTOMERS', 'customers.php');
   define('FILENAME_DEFAULT', 'index.php');
   define('FILENAME_DEFINE_LANGUAGE', 'define_language.php');
-  define('FILENAME_FILE_MANAGER', 'file_manager.php');
   define('FILENAME_GEO_ZONES', 'geo_zones.php');
   define('FILENAME_LANGUAGES', 'languages.php');
   define('FILENAME_LOGIN', 'login.php');
@@ -40,14 +40,17 @@
   define('FILENAME_PRODUCTS_ATTRIBUTES', 'products_attributes.php');
   define('FILENAME_PRODUCTS_EXPECTED', 'products_expected.php');
   define('FILENAME_REVIEWS', 'reviews.php');
+  define('FILENAME_SEC_DIR_PERMISSIONS', 'sec_dir_permissions.php');
   define('FILENAME_SERVER_INFO', 'server_info.php');
   define('FILENAME_SHIPPING_MODULES', 'shipping_modules.php');
   define('FILENAME_SPECIALS', 'specials.php');
   define('FILENAME_STATS_CUSTOMERS', 'stats_customers.php');
   define('FILENAME_STATS_PRODUCTS_PURCHASED', 'stats_products_purchased.php');
   define('FILENAME_STATS_PRODUCTS_VIEWED', 'stats_products_viewed.php');
+  define('FILENAME_STORE_LOGO', 'store_logo.php');
   define('FILENAME_TAX_CLASSES', 'tax_classes.php');
   define('FILENAME_TAX_RATES', 'tax_rates.php');
+  define('FILENAME_VERSION_CHECK', 'version_check.php');
   define('FILENAME_WHOS_ONLINE', 'whos_online.php');
   define('FILENAME_ZONES', 'zones.php');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/footer.php 2.3.1.src/admin/includes/footer.php
--- 2.2rc2a.cp.src/admin/includes/footer.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/footer.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: footer.php 1785 2008-01-10 15:07:07Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -10,7 +10,7 @@
   Released under the GNU General Public License
 */
 ?>
-<br>
+<br />
 <table border="0" width="100%" cellspacing="0" cellpadding="2">
   <tr>
     <td align="center" class="smallText">
@@ -30,7 +30,7 @@
   copyright announcement.
 */
 ?>
-osCommerce Online Merchant Copyright &copy; 2008 <a href="http://www.oscommerce.com" target="_blank">osCommerce</a><br>
+osCommerce Online Merchant Copyright &copy; 2010 <a href="http://www.oscommerce.com" target="_blank">osCommerce</a><br />
 osCommerce provides no warranty and is redistributable under the <a href="http://www.fsf.org/licenses/gpl.txt" target="_blank">GNU General Public License</a>
     </td>
   </tr>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/compatibility.php 2.3.1.src/admin/includes/functions/compatibility.php
--- 2.2rc2a.cp.src/admin/includes/functions/compatibility.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/compatibility.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: compatibility.php 1829 2008-01-29 22:44:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2009 osCommerce
 
   Released under the GNU General Public License
 */
@@ -49,40 +49,17 @@
     do_magic_quotes_gpc($HTTP_COOKIE_VARS);
   }
 
-  if (!function_exists('is_numeric')) {
-    function is_numeric($param) {
-      return ereg("^[0-9]{1,50}.?[0-9]{0,50}$", $param);
-    }
-  }
-
-  if (!function_exists('is_uploaded_file')) {
-    function is_uploaded_file($filename) {
-      if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
-        $tmp_file = dirname(tempnam('', ''));
-      }
-
-      if (strchr($tmp_file, '/')) {
-        if (substr($tmp_file, -1) != '/') $tmp_file .= '/';
-      } elseif (strchr($tmp_file, '\\')) {
-        if (substr($tmp_file, -1) != '\\') $tmp_file .= '\\';
-      }
-
-      return file_exists($tmp_file . basename($filename));
-    }
-  }
-
-  if (!function_exists('move_uploaded_file')) {
-    function move_uploaded_file($file, $target) {
-      return copy($file, $target);
-    }
+// set default timezone if none exists (PHP 5.3 throws an E_WARNING)
+  if ((strlen(ini_get('date.timezone')) < 1) && function_exists('date_default_timezone_set')) {
+    date_default_timezone_set(@date_default_timezone_get());
   }
 
   if (!function_exists('checkdnsrr')) {
     function checkdnsrr($host, $type) {
       if(tep_not_null($host) && tep_not_null($type)) {
-        @exec("nslookup -type=$type $host", $output);
+        @exec("nslookup -type=" . escapeshellarg($type) . " " . escapeshellarg($host), $output);
         while(list($k, $line) = each($output)) {
-          if(eregi("^$host", $line)) {
+          if(preg_match("/^$host/i", $line)) {
             return true;
           }
         }
@@ -91,79 +68,6 @@
     }
   }
 
-  if (!function_exists('in_array')) {
-    function in_array($lookup_value, $lookup_array) {
-      reset($lookup_array);
-      while (list($key, $value) = each($lookup_array)) {
-        if ($value == $lookup_value) return true;
-      }
-
-      return false;
-    }
-  }
-
-  if (!function_exists('array_merge')) {
-    function array_merge($array1, $array2, $array3 = '') {
-      if ($array3 == '') $array3 = array();
-
-      while (list($key, $val) = each($array1)) $array_merged[$key] = $val;
-      while (list($key, $val) = each($array2)) $array_merged[$key] = $val;
-
-      if (sizeof($array3) > 0) while (list($key, $val) = each($array3)) $array_merged[$key] = $val;
-
-      return (array)$array_merged;
-    }
-  }
-
-  if (!function_exists('array_shift')) {
-    function array_shift(&$array) {
-      $i = 0;
-      $shifted_array = array();
-      reset($array);
-      while (list($key, $value) = each($array)) {
-        if ($i > 0) {
-          $shifted_array[$key] = $value;
-        } else {
-          $return = $array[$key];
-        }
-        $i++;
-      }
-      $array = $shifted_array;
-
-      return $return;
-    }
-  }
-
-  if (!function_exists('array_reverse')) {
-    function array_reverse($array) {
-      $reversed_array = array();
-
-      for ($i=sizeof($array)-1; $i>=0; $i--) {
-        $reversed_array[] = $array[$i];
-      }
-
-      return $reversed_array;
-    }
-  }
-
-  if (!function_exists('array_slice')) {
-    function array_slice($array, $offset, $length = '0') {
-      $length = abs($length);
-
-      if ($length == 0) {
-        $high = sizeof($array);
-      } else {
-        $high = $offset+$length;
-      }
-
-      for ($i=$offset; $i<$high; $i++) {
-        $new_array[$i-$offset] = $array[$i];
-      }
-
-      return $new_array;
-    }
-  }
-
 /*
  * http_build_query() natively supported from PHP 5.0
  * From Pear::PHP_Compat
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/database.php 2.3.1.src/admin/includes/functions/database.php
--- 2.2rc2a.cp.src/admin/includes/functions/database.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/database.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: database.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -31,7 +31,7 @@
   }
 
   function tep_db_error($query, $errno, $error) { 
-    die('<font color="#000000"><b>' . $errno . ' - ' . $error . '<br><br>' . $query . '<br><br><small><font color="#ff0000">[TEP STOP]</font></small><br><br></b></font>');
+    die('<font color="#000000"><strong>' . $errno . ' - ' . $error . '<br /><br />' . $query . '<br /><br /><small><font color="#ff0000">[TEP STOP]</font></small><br /><br /></strong></font>');
   }
 
   function tep_db_query($query, $link = 'db_link') {
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/general.php 2.3.1.src/admin/includes/functions/general.php
--- 2.2rc2a.cp.src/admin/includes/functions/general.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/general.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: general.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,18 @@
 */
 
 ////
+// Get the installed version number
+  function tep_get_version() {
+    static $v;
+
+    if (!isset($v)) {
+      $v = trim(implode('', file(DIR_FS_CATALOG . 'includes/version.php')));
+    }
+
+    return $v;
+  }
+
+////
 // Redirect to another page or site
   function tep_redirect($url) {
     global $logger;
@@ -52,9 +64,9 @@
   }
 
   function tep_sanitize_string($string) {
-    $string = ereg_replace(' +', ' ', $string);
-
-    return preg_replace("/[<>]/", '_', $string);
+    $patterns = array ('/ +/','/[<>]/');
+    $replace = array (' ', '_');
+    return preg_replace($patterns, $replace, trim($string));
   }
 
   function tep_customers_name($customers_id) {
@@ -146,7 +158,7 @@
     if (@date('Y', mktime($hour, $minute, $second, $month, $day, $year)) == $year) {
       return date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, $year));
     } else {
-      return ereg_replace('2037' . '$', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
+      return preg_replace('/2037$/', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
     }
 
   }
@@ -212,6 +224,27 @@
     return $select_string;
   }
 
+  function tep_format_system_info_array($array) {
+
+    $output = '';
+    foreach ($array as $section => $child) {
+      $output .= '[' . $section . ']' . "\n";
+      foreach ($child as $variable => $value) {
+        if (is_array($value)) {
+          $output .= $variable . ' = ' . implode(',', $value) ."\n";
+        } else {
+          $output .= $variable . ' = ' . $value . "\n";
+        }
+      }
+
+    $output .= "\n";
+    }
+    return $output;
+
+  }
+
+
+
   function tep_options_name($options_id) {
     global $languages_id;
 
@@ -377,11 +410,11 @@
 
     if ($html) {
 // HTML Mode
-      $HR = '<hr>';
-      $hr = '<hr>';
+      $HR = '<hr />';
+      $hr = '<hr />';
       if ( ($boln == '') && ($eoln == "\n") ) { // Values not specified, use rational defaults
-        $CR = '<br>';
-        $cr = '<br>';
+        $CR = '<br />';
+        $cr = '<br />';
         $eoln = $cr;
       } else { // Use values supplied
         $CR = $eoln . $boln;
@@ -718,6 +751,18 @@
   }
 
 ////
+// Sets the status of a review
+  function tep_set_review_status($reviews_id, $status) {
+    if ($status == '1') {
+      return tep_db_query("update " . TABLE_REVIEWS . " set reviews_status = '1', last_modified = now() where reviews_id = '" . (int)$reviews_id . "'");
+    } elseif ($status == '0') {
+      return tep_db_query("update " . TABLE_REVIEWS . " set reviews_status = '0', last_modified = now() where reviews_id = '" . (int)$reviews_id . "'");
+    } else {
+      return -1;
+    }
+  }
+
+////
 // Sets the status of a product on special
   function tep_set_specials_status($specials_id, $status) {
     if ($status == '1') {
@@ -746,11 +791,11 @@
     for ($i=0, $n=sizeof($select_array); $i<$n; $i++) {
       $name = ((tep_not_null($key)) ? 'configuration[' . $key . ']' : 'configuration_value');
 
-      $string .= '<br><input type="radio" name="' . $name . '" value="' . $select_array[$i] . '"';
+      $string .= '<br /><input type="radio" name="' . $name . '" value="' . $select_array[$i] . '"';
 
-      if ($key_value == $select_array[$i]) $string .= ' CHECKED';
+      if ($key_value == $select_array[$i]) $string .= ' checked="checked"';
 
-      $string .= '> ' . $select_array[$i];
+      $string .= ' /> ' . $select_array[$i];
     }
 
     return $string;
@@ -762,9 +807,9 @@
     reset($select_array);
     while (list($key, $value) = each($select_array)) {
       if (is_int($key)) $key = $value;
-      $string .= '<br><input type="radio" name="configuration[' . $key_name . ']" value="' . $key . '"';
-      if ($key_value == $key) $string .= ' CHECKED';
-      $string .= '> ' . $value;
+      $string .= '<br /><input type="radio" name="configuration[' . $key_name . ']" value="' . $key . '"';
+      if ($key_value == $key) $string .= ' checked="checked"';
+      $string .= ' /> ' . $value;
     }
 
     return $string;
@@ -778,21 +823,47 @@
     $db_query = tep_db_query("select now() as datetime");
     $db = tep_db_fetch_array($db_query);
 
-    list($system, $host, $kernel) = preg_split('/[\s,]+/', @exec('uname -a'), 5);
+    @list($system, $host, $kernel) = preg_split('/[\s,]+/', @exec('uname -a'), 5);
+
+    $data = array();
+
+    $data['oscommerce']  = array('version' => tep_get_version());
 
-    return array('date' => tep_datetime_short(date('Y-m-d H:i:s')),
-                 'system' => $system,
-                 'kernel' => $kernel,
-                 'host' => $host,
-                 'ip' => gethostbyname($host),
-                 'uptime' => @exec('uptime'),
-                 'http_server' => $HTTP_SERVER_VARS['SERVER_SOFTWARE'],
-                 'php' => PHP_VERSION,
-                 'zend' => (function_exists('zend_version') ? zend_version() : ''),
-                 'db_server' => DB_SERVER,
-                 'db_ip' => gethostbyname(DB_SERVER),
-                 'db_version' => 'MySQL ' . (function_exists('mysql_get_server_info') ? mysql_get_server_info() : ''),
-                 'db_date' => tep_datetime_short($db['datetime']));
+    $data['system'] = array('date' => date('Y-m-d H:i:s O T'),
+                            'os' => PHP_OS,
+                            'kernel' => $kernel,
+                            'uptime' => @exec('uptime'),
+                            'http_server' => $HTTP_SERVER_VARS['SERVER_SOFTWARE']);
+
+    $data['mysql']  = array('version' => (function_exists('mysql_get_server_info') ? mysql_get_server_info() : ''),
+                            'date' => $db['datetime']);
+
+    $data['php']    = array('version' => PHP_VERSION,
+                            'zend' => zend_version(),
+                            'sapi' => PHP_SAPI,
+                            'int_size'	=> defined('PHP_INT_SIZE') ? PHP_INT_SIZE : '',
+                            'safe_mode'	=> (int) @ini_get('safe_mode'),
+                            'open_basedir' => (int) @ini_get('open_basedir'),
+                            'memory_limit' => @ini_get('memory_limit'),
+                            'error_reporting' => error_reporting(),
+                            'display_errors' => (int)@ini_get('display_errors'),
+                            'allow_url_fopen' => (int) @ini_get('allow_url_fopen'),
+                            'allow_url_include' => (int) @ini_get('allow_url_include'),
+                            'file_uploads' => (int) @ini_get('file_uploads'),
+                            'upload_max_filesize' => @ini_get('upload_max_filesize'),
+                            'post_max_size' => @ini_get('post_max_size'),
+                            'disable_functions' => @ini_get('disable_functions'),
+                            'disable_classes' => @ini_get('disable_classes'),
+                            'enable_dl'	=> (int) @ini_get('enable_dl'),
+                            'magic_quotes_gpc' => (int) @ini_get('magic_quotes_gpc'),
+                            'register_globals' => (int) @ini_get('register_globals'),
+                            'filter.default'   => @ini_get('filter.default'),
+                            'zend.ze1_compatibility_mode' => (int) @ini_get('zend.ze1_compatibility_mode'),
+                            'unicode.semantics' => (int) @ini_get('unicode.semantics'),
+                            'zend_thread_safty'	=> (int) function_exists('zend_thread_id'),
+                            'extensions' => get_loaded_extensions());
+
+    return $data;
   }
 
   function tep_generate_category_path($id, $from = 'category', $categories_array = '', $index = 0) {
@@ -831,9 +902,9 @@
       for ($j=0, $k=sizeof($calculated_category_path[$i]); $j<$k; $j++) {
         $calculated_category_path_string .= $calculated_category_path[$i][$j]['text'] . '&nbsp;&gt;&nbsp;';
       }
-      $calculated_category_path_string = substr($calculated_category_path_string, 0, -16) . '<br>';
+      $calculated_category_path_string = substr($calculated_category_path_string, 0, -16) . '<br />';
     }
-    $calculated_category_path_string = substr($calculated_category_path_string, 0, -4);
+    $calculated_category_path_string = substr($calculated_category_path_string, 0, -6);
 
     if (strlen($calculated_category_path_string) < 1) $calculated_category_path_string = TEXT_TOP;
 
@@ -847,9 +918,9 @@
       for ($j=0, $k=sizeof($calculated_category_path[$i]); $j<$k; $j++) {
         $calculated_category_path_string .= $calculated_category_path[$i][$j]['id'] . '_';
       }
-      $calculated_category_path_string = substr($calculated_category_path_string, 0, -1) . '<br>';
+      $calculated_category_path_string = substr($calculated_category_path_string, 0, -1) . '<br />';
     }
-    $calculated_category_path_string = substr($calculated_category_path_string, 0, -4);
+    $calculated_category_path_string = substr($calculated_category_path_string, 0, -6);
 
     if (strlen($calculated_category_path_string) < 1) $calculated_category_path_string = TEXT_TOP;
 
@@ -892,6 +963,22 @@
       }
     }
 
+    $product_images_query = tep_db_query("select image from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_id . "'");
+    if (tep_db_num_rows($product_images_query)) {
+      while ($product_images = tep_db_fetch_array($product_images_query)) {
+        $duplicate_image_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_IMAGES . " where image = '" . tep_db_input($product_images['image']) . "'");
+        $duplicate_image = tep_db_fetch_array($duplicate_image_query);
+
+        if ($duplicate_image['total'] < 2) {
+          if (file_exists(DIR_FS_CATALOG_IMAGES . $product_images['image'])) {
+            @unlink(DIR_FS_CATALOG_IMAGES . $product_images['image']);
+          }
+        }
+      }
+
+      tep_db_query("delete from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_id . "'");
+    }
+
     tep_db_query("delete from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "'");
     tep_db_query("delete from " . TABLE_PRODUCTS . " where products_id = '" . (int)$product_id . "'");
     tep_db_query("delete from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = '" . (int)$product_id . "'");
@@ -938,8 +1025,8 @@
               $cached_file = $cache_blocks[$i]['file'];
               $languages = tep_get_languages();
               for ($j=0, $k=sizeof($languages); $j<$k; $j++) {
-                $cached_file_unlink = ereg_replace('-language', '-' . $languages[$j]['directory'], $cached_file);
-                if (ereg('^' . $cached_file_unlink, $cache_file)) {
+                $cached_file_unlink = preg_replace('/-language/', '-' . $languages[$j]['directory'], $cached_file);
+                if (preg_match('/^' . $cached_file_unlink . '/', $cache_file)) {
                   @unlink(DIR_FS_CACHE . $cache_file);
                 }
               }
@@ -950,7 +1037,7 @@
           $cached_file = $cache_blocks[$i]['file'];
           $languages = tep_get_languages();
           for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-            $cached_file = ereg_replace('-language', '-' . $languages[$i]['directory'], $cached_file);
+            $cached_file = preg_replace('/-language/', '-' . $languages[$i]['directory'], $cached_file);
             @unlink(DIR_FS_CACHE . $cached_file);
           }
         }
@@ -1010,7 +1097,7 @@
       $dir = dir($source);
       while ($file = $dir->read()) {
         if ( ($file != '.') && ($file != '..') ) {
-          if (is_writeable($source . '/' . $file)) {
+          if (tep_is_writable($source . '/' . $file)) {
             tep_remove($source . '/' . $file);
           } else {
             $messageStack->add(sprintf(ERROR_FILE_NOT_REMOVEABLE, $source . '/' . $file), 'error');
@@ -1020,14 +1107,14 @@
       }
       $dir->close();
 
-      if (is_writeable($source)) {
+      if (tep_is_writable($source)) {
         rmdir($source);
       } else {
         $messageStack->add(sprintf(ERROR_DIRECTORY_NOT_REMOVEABLE, $source), 'error');
         $tep_remove_error = true;
       }
     } else {
-      if (is_writeable($source)) {
+      if (tep_is_writable($source)) {
         unlink($source);
       } else {
         $messageStack->add(sprintf(ERROR_FILE_NOT_REMOVEABLE, $source), 'error');
@@ -1123,12 +1210,7 @@
 ////
 // Wrapper function for round() for php3 compatibility
   function tep_round($value, $precision) {
-    if (PHP_VERSION < 4) {
-      $exp = pow(10, $precision);
-      return round($value * $exp) / $exp;
-    } else {
-      return round($value, $precision);
-    }
+    return round($value, $precision);
   }
 
 ////
@@ -1193,8 +1275,6 @@
   function tep_call_function($function, $parameter, $object = '') {
     if ($object == '') {
       return call_user_func($function, $parameter);
-    } elseif (PHP_VERSION < 4) {
-      return call_user_method($function, $object, $parameter);
     } else {
       return call_user_func(array($object, $function), $parameter);
     }
@@ -1276,7 +1356,7 @@
 // nl2br() prior PHP 4.2.0 did not convert linefeeds on all OSs (it only converted \n)
   function tep_convert_linefeeds($from, $to, $string) {
     if ((PHP_VERSION < "4.0.5") && is_array($from)) {
-      return ereg_replace('(' . implode('|', $from) . ')', $to, $string);
+      return preg_replace('/(' . implode('|', $from) . ')/', $to, $string);
     } else {
       return str_replace($from, $to, $string);
     }
@@ -1303,4 +1383,95 @@
 
     return $tmp_array;
   }
-?>
+
+  function tep_validate_ip_address($ip_address) {
+    if (function_exists('filter_var') && defined('FILTER_VALIDATE_IP')) {
+      return filter_var($ip_address, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4));
+    }
+
+    if (preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip_address)) {
+      $parts = explode('.', $ip_address);
+
+      foreach ($parts as $ip_parts) {
+        if ( (intval($ip_parts) > 255) || (intval($ip_parts) < 0) ) {
+          return false; // number is not within 0-255
+        }
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+
+  function tep_get_ip_address() {
+    global $HTTP_SERVER_VARS;
+
+    $ip_address = null;
+    $ip_addresses = array();
+
+    if (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) && !empty($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) {
+      foreach ( array_reverse(explode(',', $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) as $x_ip ) {
+        $x_ip = trim($x_ip);
+
+        if (tep_validate_ip_address($x_ip)) {
+          $ip_addresses[] = $x_ip;
+        }
+      }
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'];
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_PROXY_USER']) && !empty($HTTP_SERVER_VARS['HTTP_PROXY_USER'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_PROXY_USER'];
+    }
+
+    $ip_addresses[] = $HTTP_SERVER_VARS['REMOTE_ADDR'];
+
+    foreach ( $ip_addresses as $ip ) {
+      if (!empty($ip) && tep_validate_ip_address($ip)) {
+        $ip_address = $ip;
+        break;
+      }
+    }
+
+    return $ip_address;
+  }
+
+////
+// Wrapper function for is_writable() for Windows compatibility
+  function tep_is_writable($file) {
+    if (strtolower(substr(PHP_OS, 0, 3)) === 'win') {
+      if (file_exists($file)) {
+        $file = realpath($file);
+        if (is_dir($file)) {
+          $result = @tempnam($file, 'osc');
+          if (is_string($result) && file_exists($result)) {
+            unlink($result);
+            return (strpos($result, $file) === 0) ? true : false;
+          }
+        } else {
+          $handle = @fopen($file, 'r+');
+          if (is_resource($handle)) {
+            fclose($handle);
+            return true;
+          }
+        }
+      } else{
+        $dir = dirname($file);
+        if (file_exists($dir) && is_dir($dir) && tep_is_writable($dir)) {
+          return true;
+        }
+      }
+      return false;
+    } else {
+      return is_writable($file);
+    }
+  }
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/html_graphs.php 2.3.1.src/admin/includes/functions/html_graphs.php
--- 2.2rc2a.cp.src/admin/includes/functions/html_graphs.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/html_graphs.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: html_graphs.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -100,7 +100,7 @@
 // if a background was choosen don't print cell BGCOLOR
       if (!$vals['background']) $start_graph_string .= ' bgcolor="' . $vals['hbgcolor'] . '"';
 
-      $start_graph_string .= ' colspan="' . $colspan . '"><font color="' . $vals['hfcolor'] . '" style="' . $vals['hfstyle'] . '"><b>' . $vals['hlabel'] . '</b></font></td>' . "\n" .
+      $start_graph_string .= ' colspan="' . $colspan . '"><font color="' . $vals['hfcolor'] . '" style="' . $vals['hfstyle'] . '"><strong>' . $vals['hlabel'] . '</strong></font></td>' . "\n" .
                              '  </tr>' . "\n" .
                              '  <tr>' . "\n" .
                              '    <td align="center" valign="center"';
@@ -108,7 +108,7 @@
 // if a background was choosen don't print cell BGCOLOR
       if (!$vals['background']) $start_graph_string .= ' bgcolor="' . $vals['vbgcolor'] . '"';
 
-      $start_graph_string .=  ' rowspan="' . $rowspan . '"><font color="' . $vals['vfcolor'] . '" style="' . $vals['vfstyle'] . '"><b>' . $vals['vlabel'] . '</b></font></td>' . "\n" .
+      $start_graph_string .=  ' rowspan="' . $rowspan . '"><font color="' . $vals['vfcolor'] . '" style="' . $vals['vfstyle'] . '"><strong>' . $vals['vlabel'] . '</strong></font></td>' . "\n" .
                               '  </tr>' . "\n";
     }
 
@@ -160,7 +160,7 @@
       $horizontal_graph_string .= '>';
 
 // decide if the value in bar is a color code or image.
-      if (ereg('^#', $bars[$i])) { 
+      if (preg_match('/^#/', $bars[$i])) {
         $horizontal_graph_string .= '<table cellpadding="0" cellspacing="0" bgcolor="' . $bars[$i] . '" width="' . ($values[$i] * $vals['scale']) . '">' . "\n" .
                                     '  <tr>' . "\n" .
                                     '    <td>&nbsp;</td>' . "\n" .
@@ -195,7 +195,7 @@
       $vertical_graph_string .= '>';
 
       if (!$vals['noshowvals']) {
-        $vertical_graph_string .= '<i><font size="-2" color="' . $vals['valuefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $values[$i] . ')</font></i><br>';
+        $vertical_graph_string .= '<i><font size="-2" color="' . $vals['valuefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $values[$i] . ')</font></i><br />';
       }
 
       $vertical_graph_string .= '<img src="' . $bars[$i] . '" width="5" height="';
@@ -251,7 +251,7 @@
                                          '        <td';
 
 // set background to a color if it starts with # or an image otherwise.
-      if (ereg('^#', $dbars[$i])) {
+      if (preg_match('/^#/', $dbars[$i])) {
         $double_horizontal_graph_string .= ' bgcolor="' . $dbars[$i] . '">';
       } else {
         $double_horizontal_graph_string .= ' background="' . $dbars[$i] . '">';
@@ -260,7 +260,7 @@
       $double_horizontal_graph_string .= '<nowrap>';
 
 // decide if the value in bar is a color code or image.
-      if (ereg('^#', $bars[$i])) { 
+      if (preg_match('/^#/', $bars[$i])) {
         $double_horizontal_graph_string .= '<table align="left" cellpadding="0" cellspacing="0" bgcolor="' . $bars[$i] . '" width="' . ($values[$i] * $vals['scale']) . '">' . "\n" .
                                            '  <tr>' . "\n" .
                                            '    <td>&nbsp;</td>' . "\n" .
@@ -309,7 +309,7 @@
       $double_vertical_graph_string .= '>';
 
       if (!$vals['noshowvals'] && $values[$i]) {
-        $double_vertical_graph_string .= '<i><font size="-2" color="' . $vals['valuefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $values[$i] . ')</font></i><br>';
+        $double_vertical_graph_string .= '<i><font size="-2" color="' . $vals['valuefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $values[$i] . ')</font></i><br />';
       }
 
       $double_vertical_graph_string .= '<img src="' . $bars[$i] . '" width="10" height="';
@@ -329,7 +329,7 @@
       $double_vertical_graph_string .= '>';
 
       if (!$vals['noshowvals'] && $dvalues[$i]) {
-        $double_vertical_graph_string .= '<i><font size="-2" color="' . $vals['doublefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $dvalues[$i] . ')</font></i><br>';
+        $double_vertical_graph_string .= '<i><font size="-2" color="' . $vals['doublefcolor'] . '" style="' . $vals['valuefstyle'] . '">(' . $dvalues[$i] . ')</font></i><br />';
       }
 
       $double_vertical_graph_string .= '<img src="' . $dbars[$i] . '" width="10" height="';
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/html_output.php 2.3.1.src/admin/includes/functions/html_output.php
--- 2.2rc2a.cp.src/admin/includes/functions/html_output.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/html_output.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: html_output.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,24 +13,26 @@
 ////
 // The HTML href link wrapper function
   function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL') {
+    $page = tep_output_string($page);
+
     if ($page == '') {
-      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine the page link!<br><br>Function used:<br><br>tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</b>');
+      die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
     }
     if ($connection == 'NONSSL') {
       $link = HTTP_SERVER . DIR_WS_ADMIN;
     } elseif ($connection == 'SSL') {
-      if (ENABLE_SSL == 'true') {
+      if (ENABLE_SSL_CATALOG == 'true') {
         $link = HTTPS_SERVER . DIR_WS_ADMIN;
       } else {
         $link = HTTP_SERVER . DIR_WS_ADMIN;
       }
     } else {
-      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL<br><br>Function used:<br><br>tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</b>');
+      die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
     }
     if ($parameters == '') {
       $link = $link . $page . '?' . SID;
     } else {
-      $link = $link . $page . '?' . $parameters . '&' . SID;
+      $link = $link . $page . '?' . tep_output_string($parameters) . '&' . SID;
     }
 
     while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);
@@ -48,7 +50,7 @@
         $link = HTTP_CATALOG_SERVER . DIR_WS_CATALOG;
       }
     } else {
-      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL<br><br>Function used:<br><br>tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</b>');
+      die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL<br /><br />Function used:<br /><br />tep_href_link(\'' . $page . '\', \'' . $parameters . '\', \'' . $connection . '\')</strong>');
     }
     if ($parameters == '') {
       $link .= $page;
@@ -76,7 +78,7 @@
 
     if (tep_not_null($parameters)) $image .= ' ' . $parameters;
 
-    $image .= '>';
+    $image .= ' />';
 
     return $image;
   }
@@ -93,7 +95,7 @@
 
     if (tep_not_null($parameters)) $image_submit .= ' ' . $parameters;
 
-    $image_submit .= '>';
+    $image_submit .= ' />';
 
     return $image_submit;
   }
@@ -188,7 +190,7 @@
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
-    $field .= '>';
+    $field .= ' />';
 
     if ($required == true) $field .= TEXT_FIELD_REQUIRED;
 
@@ -221,10 +223,10 @@
     if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
 
     if ( ($checked == true) || (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name]) && (($HTTP_GET_VARS[$name] == 'on') || (stripslashes($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HTTP_POST_VARS[$name]) == $value))) || (tep_not_null($compare) && ($value == $compare)) ) {
-      $selection .= ' CHECKED';
+      $selection .= ' checked="checked"';
     }
 
-    $selection .= '>';
+    $selection .= ' />';
 
     return $selection;
   }
@@ -243,10 +245,11 @@
 
 ////
 // Output a form textarea field
+// The $wrap parameter is no longer used in the core xhtml template
   function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
     global $HTTP_GET_VARS, $HTTP_POST_VARS;
 
-    $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
+    $field = '<textarea name="' . tep_output_string($name) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
@@ -286,7 +289,7 @@
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
-    $field .= '>';
+    $field .= ' />';
 
     return $field;
   }
@@ -325,7 +328,7 @@
     for ($i=0, $n=sizeof($values); $i<$n; $i++) {
       $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
       if ($default == $values[$i]['id']) {
-        $field .= ' SELECTED';
+        $field .= ' selected="selected"';
       }
 
       $field .= '>' . tep_output_string($values[$i]['text'], array('"' => '&quot;', '\'' => '&#039;', '<' => '&lt;', '>' => '&gt;')) . '</option>';
@@ -336,4 +339,82 @@
 
     return $field;
   }
+
+////
+// Output a jQuery UI Button
+  function tep_draw_button($title = null, $icon = null, $link = null, $priority = null, $params = null) {
+    static $button_counter = 1;
+
+    $types = array('submit', 'button', 'reset');
+
+    if ( !isset($params['type']) ) {
+      $params['type'] = 'submit';
+    }
+
+    if ( !in_array($params['type'], $types) ) {
+      $params['type'] = 'submit';
+    }
+
+    if ( ($params['type'] == 'submit') && isset($link) ) {
+      $params['type'] = 'button';
+    }
+
+    if (!isset($priority)) {
+      $priority = 'secondary';
+    }
+
+    $button = '<span class="tdbLink">';
+
+    if ( ($params['type'] == 'button') && isset($link) ) {
+      $button .= '<a id="tdb' . $button_counter . '" href="' . $link . '"';
+
+      if ( isset($params['newwindow']) ) {
+        $button .= ' target="_blank"';
+      }
+    } else {
+      $button .= '<button id="tdb' . $button_counter . '" type="' . tep_output_string($params['type']) . '"';
+    }
+
+    if ( isset($params['params']) ) {
+      $button .= ' ' . $params['params'];
+    }
+
+    $button .= '>' . $title;
+
+    if ( ($params['type'] == 'button') && isset($link) ) {
+      $button .= '</a>';
+    } else {
+      $button .= '</button>';
+    }
+
+    $button .= '</span><script type="text/javascript">$("#tdb' . $button_counter . '").button(';
+
+    $args = array();
+
+    if ( isset($icon) ) {
+      if ( !isset($params['iconpos']) ) {
+        $params['iconpos'] = 'left';
+      }
+
+      if ( $params['iconpos'] == 'left' ) {
+        $args[] = 'icons:{primary:"ui-icon-' . $icon . '"}';
+      } else {
+        $args[] = 'icons:{secondary:"ui-icon-' . $icon . '"}';
+      }
+    }
+
+    if (empty($title)) {
+      $args[] = 'text:false';
+    }
+
+    if (!empty($args)) {
+      $button .= '{' . implode(',', $args) . '}';
+    }
+
+    $button .= ').addClass("ui-priority-' . $priority . '").parent().removeClass("tdbLink");</script>';
+
+    $button_counter++;
+
+    return $button;
+  }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/languages.php 2.3.1.src/admin/includes/functions/languages.php
--- 2.2rc2a.cp.src/admin/includes/functions/languages.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/languages.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: languages.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/localization.php 2.3.1.src/admin/includes/functions/localization.php
--- 2.2rc2a.cp.src/admin/includes/functions/localization.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/localization.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: localization.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/password_funcs.php 2.3.1.src/admin/includes/functions/password_funcs.php
--- 2.2rc2a.cp.src/admin/includes/functions/password_funcs.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/password_funcs.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,20 +1,41 @@
 <?php
 /*
-  $Id: password_funcs.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
 ////
-// This funstion validates a plain text password with an
-// encrpyted password
+// This function validates a plain text password with a
+// salted or phpass password
   function tep_validate_password($plain, $encrypted) {
     if (tep_not_null($plain) && tep_not_null($encrypted)) {
+      if (tep_password_type($encrypted) == 'salt') {
+        return tep_validate_old_password($plain, $encrypted);
+      }
+
+      if (!class_exists('PasswordHash')) {
+        include(DIR_WS_CLASSES . 'passwordhash.php');
+      }
+
+      $hasher = new PasswordHash(10, true);
+
+      return $hasher->CheckPassword($plain, $encrypted);
+    }
+
+    return false;
+  }
+
+////
+// This function validates a plain text password with a
+// salted password
+  function tep_validate_old_password($plain, $encrypted) {
+    if (tep_not_null($plain) && tep_not_null($encrypted)) {
 // split apart the hash / salt
       $stack = explode(':', $encrypted);
 
@@ -29,8 +50,22 @@
   }
 
 ////
-// This function makes a new password from a plaintext password. 
+// This function encrypts a phpass password from a plaintext
+// password.
   function tep_encrypt_password($plain) {
+    if (!class_exists('PasswordHash')) {
+      include(DIR_WS_CLASSES . 'passwordhash.php');
+    }
+
+    $hasher = new PasswordHash(10, true);
+
+    return $hasher->HashPassword($plain);
+  }
+
+////
+// This function encrypts a salted password from a plaintext
+// password.
+  function tep_encrypt_old_password($plain) {
     $password = '';
 
     for ($i=0; $i<10; $i++) {
@@ -43,4 +78,78 @@
 
     return $password;
   }
+
+////
+// This function returns the type of the encrpyted password
+// (phpass or salt)
+  function tep_password_type($encrypted) {
+    if (preg_match('/^[A-Z0-9]{32}\:[A-Z0-9]{2}$/i', $encrypted) === 1) {
+      return 'salt';
+    }
+
+    return 'phpass';
+  }
+
+////
+// This function produces a crypted string using the APR-MD5 algorithm
+// Source: http://www.php.net/crypt
+  function tep_crypt_apr_md5($password, $salt = null) {
+    if (empty($salt)) {
+      $salt_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+      $salt = '';
+
+      for ($i = 0; $i < 8; $i++) {
+        $salt .= $salt_string[rand(0, 61)];
+      }
+    }
+
+    $len = strlen($password);
+
+    $result = $password . '$apr1$' . $salt;
+
+    $bin = pack('H32', md5($password . $salt . $password));
+
+    for ($i=$len; $i>0; $i-=16) {
+      $result .= substr($bin, 0, min(16, $i));
+    }
+
+    for ($i=$len; $i>0; $i>>= 1) {
+      $result .= ($i & 1) ? chr(0) : $password[0];
+    }
+
+    $bin = pack('H32', md5($result));
+
+    for ($i=0; $i<1000; $i++) {
+      $new = ($i & 1) ? $password : $bin;
+
+      if ($i % 3) {
+        $new .= $salt;
+      }
+
+      if ($i % 7) {
+        $new .= $password;
+      }
+
+      $new .= ($i & 1) ? $bin : $password;
+
+      $bin = pack('H32', md5($new));
+    }
+
+    for ($i=0; $i<5; $i++) {
+      $k = $i + 6;
+      $j = $i + 12;
+
+      if ($j == 16) {
+        $j = 5;
+      }
+
+      $tmp = $bin[$i] . $bin[$k] . $bin[$j] . $tmp;
+    }
+
+    $tmp = chr(0) . chr(0) . $bin[11] . $tmp;
+    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)), 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
+
+    return '$apr1$' . $salt . '$' . $tmp;
+  }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/sessions.php 2.3.1.src/admin/includes/functions/sessions.php
--- 2.2rc2a.cp.src/admin/includes/functions/sessions.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/sessions.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: sessions.php 1830 2008-01-30 00:58:21Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/functions/validations.php 2.3.1.src/admin/includes/functions/validations.php
--- 2.2rc2a.cp.src/admin/includes/functions/validations.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/functions/validations.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: validations.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,102 +21,53 @@
   //
   // Description : function for validating email address that conforms to RFC 822 specs
   //
-  //               This function is converted from a JavaScript written by
-  //               Sandeep V. Tamhankar (stamhankar@hotmail.com). The original JavaScript
-  //               is available at http://javascript.internet.com
+  //              This function will first attempt to validate the Email address using the filter
+  //              extension for performance. If this extension is not available it will
+  //              fall back to a regex based validator which doesn't validate all RFC822
+  //              addresses but catches 99.9% of them. The regex is based on the code found at
+  //              http://www.regular-expressions.info/email.html
+  //
+  //              Optional validation for validating the domain name is also valid is supplied
+  //              and can be enabled using the administration tool.
   //
   // Sample Valid Addresses:
   //
   //    first.last@host.com
   //    firstlast@host.to
-  //    "first last"@host.com
-  //    "first@last"@host.com
   //    first-last@host.com
-  //    first.last@[123.123.123.123]
+  //    first_last@host.com
   //
   // Invalid Addresses:
   //
   //    first last@host.com
-  //
+  //    first@last@host.com
   //
   ////////////////////////////////////////////////////////////////////////////////////////////////
   function tep_validate_email($email) {
-    $valid_address = true;
+    $email = trim($email);
+    if (strlen($email) > 255) {
+      $valid_address = false;
+    } elseif (function_exists('filter_var') && defined('FILTER_VALIDATE_EMAIL')) {
 
-    $mail_pat = '^(.+)@(.+)$';
-    $valid_chars = "[^] \(\)<>@,;:\.\\\"\[]";
-    $atom = "$valid_chars+";
-    $quoted_user='(\"[^\"]*\")';
-    $word = "($atom|$quoted_user)";
-    $user_pat = "^$word(\.$word)*$";
-    $ip_domain_pat='^\[([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\]$';
-    $domain_pat = "^$atom(\.$atom)*$";
-
-    if (eregi($mail_pat, $email, $components)) {
-      $user = $components[1];
-      $domain = $components[2];
-      // validate user
-      if (eregi($user_pat, $user)) {
-        // validate domain
-        if (eregi($ip_domain_pat, $domain, $ip_components)) {
-          // this is an IP address
-      	  for ($i=1;$i<=4;$i++) {
-      	    if ($ip_components[$i] > 255) {
-      	      $valid_address = false;
-      	      break;
-      	    }
-          }
-        }
-        else {
-          // Domain is a name, not an IP
-          if (eregi($domain_pat, $domain)) {
-            /* domain name seems valid, but now make sure that it ends in a valid TLD or ccTLD
-               and that there's a hostname preceding the domain or country. */
-            $domain_components = explode(".", $domain);
-            // Make sure there's a host name preceding the domain.
-            if (sizeof($domain_components) < 2) {
-              $valid_address = false;
-            } else {
-              $top_level_domain = strtolower($domain_components[sizeof($domain_components)-1]);
-              // Allow all 2-letter TLDs (ccTLDs)
-              if (eregi('^[a-z][a-z]$', $top_level_domain) != 1) {
-                $tld_pattern = '';
-                // Get authorized TLDs from text file
-                $tlds = file(DIR_WS_INCLUDES . 'tld.txt');
-                while (list(,$line) = each($tlds)) {
-                  // Get rid of comments
-                  $words = explode('#', $line);
-                  $tld = trim($words[0]);
-                  // TLDs should be 3 letters or more
-                  if (eregi('^[a-z]{3,}$', $tld) == 1) {
-                    $tld_pattern .= '^' . $tld . '$|';
-                  }
-                }
-                // Remove last '|'
-                $tld_pattern = substr($tld_pattern, 0, -1);
-                if (eregi("$tld_pattern", $top_level_domain) == 0) {
-                    $valid_address = false;
-                }
-              }
-            }
-          }
-          else {
-      	    $valid_address = false;
-      	  }
-      	}
+     $valid_address = (bool)filter_var($email, FILTER_VALIDATE_EMAIL);
+    } else {
+      if ( substr_count( $email, '@' ) > 1 ) {
+        $valid_address = false;
       }
-      else {
+
+      if ( preg_match("/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i", $email)) {
+        $valid_address = true;
+      } else {
         $valid_address = false;
       }
     }
-    else {
-      $valid_address = false;
-    }
+
     if ($valid_address && ENTRY_EMAIL_ADDRESS_CHECK == 'true') {
-      if (!checkdnsrr($domain, "MX") && !checkdnsrr($domain, "A")) {
+      $domain = explode('@', $email);
+      if (!checkdnsrr($domain[1], "MX") && !checkdnsrr($domain[1], "A")) {
         $valid_address = false;
       }
     }
     return $valid_address;
   }
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/general.js 2.3.1.src/admin/includes/general.js
--- 2.2rc2a.cp.src/admin/includes/general.js	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/general.js	2010-11-15 03:42:36.000000000 -0600
@@ -8,6 +8,7 @@
           if ( (field.elements[i].type != "image") &&
                (field.elements[i].type != "hidden") &&
                (field.elements[i].type != "reset") &&
+               (field.elements[i].type != "button") &&
                (field.elements[i].type != "submit") ) {
 
             document.forms[f].elements[i].focus();
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/graphs/banner_daily.php 2.3.1.src/admin/includes/graphs/banner_daily.php
--- 2.2rc2a.cp.src/admin/includes/graphs/banner_daily.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/graphs/banner_daily.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_daily.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/graphs/banner_infobox.php 2.3.1.src/admin/includes/graphs/banner_infobox.php
--- 2.2rc2a.cp.src/admin/includes/graphs/banner_infobox.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/graphs/banner_infobox.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_infobox.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -36,7 +36,7 @@
   $graph->SetMarginsPixels(15,15,15,30);
 
   $graph->SetTitleFontSize('4');
-  $graph->SetTitle('TEXT_BANNERS_LAST_3_DAYS');
+  $graph->SetTitle(TEXT_BANNERS_LAST_3_DAYS);
 
   $graph->SetDataValues($stats);
   $graph->SetDataColors(array('blue','red'),array('blue', 'red'));
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/graphs/banner_monthly.php 2.3.1.src/admin/includes/graphs/banner_monthly.php
--- 2.2rc2a.cp.src/admin/includes/graphs/banner_monthly.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/graphs/banner_monthly.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_monthly.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/graphs/banner_yearly.php 2.3.1.src/admin/includes/graphs/banner_yearly.php
--- 2.2rc2a.cp.src/admin/includes/graphs/banner_yearly.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/graphs/banner_yearly.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_yearly.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/header.php 2.3.1.src/admin/includes/header.php
--- 2.2rc2a.cp.src/admin/includes/header.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/header.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: header.php 1785 2008-01-10 15:07:07Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,9 +14,10 @@
     echo $messageStack->output();
   }
 ?>
+
 <table border="0" width="100%" cellspacing="0" cellpadding="0">
   <tr>
-    <td colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, '', 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'oscommerce.png', PROJECT_VERSION) . '</a>'; ?></td>
+    <td colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, '', 'NONSSL') . '">' . tep_image(DIR_WS_IMAGES . 'oscommerce.png', 'osCommerce Online Merchant v' . tep_get_version()) . '</a>'; ?></td>
   </tr>
   <tr class="headerBar">
     <td class="headerBarContent">&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT, '', 'NONSSL') . '" class="headerLink">' . HEADER_TITLE_ADMINISTRATION . '</a> &nbsp;|&nbsp; <a href="' . tep_catalog_href_link() . '" class="headerLink">' . HEADER_TITLE_ONLINE_CATALOG . '</a> &nbsp;|&nbsp; <a href="http://www.oscommerce.com" class="headerLink">' . HEADER_TITLE_SUPPORT_SITE . '</a>'; ?></td>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/.htaccess 2.3.1.src/admin/includes/.htaccess
--- 2.2rc2a.cp.src/admin/includes/.htaccess	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -1,4 +1,4 @@
-# $Id: .htaccess 1775 2008-01-09 19:26:55Z hpdl $
+# $Id$
 #
 # This is used with Apache WebServers
 # The following blocks direct HTTP requests in this directory recursively
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/action_recorder.php 2.3.1.src/admin/includes/languages/english/action_recorder.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,28 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('HEADING_TITLE', 'Action Recorder');
+
+define('TABLE_HEADING_MODULE', 'Module');
+define('TABLE_HEADING_CUSTOMER', 'Customer');
+define('TABLE_HEADING_DATE_ADDED', 'Date');
+define('TABLE_HEADING_ACTION', 'Action');
+
+define('TEXT_FILTER_SEARCH', 'Search:');
+define('TEXT_ALL_MODULES', '-- All Modules --');
+define('TEXT_GUEST', 'Guest');
+
+define('TEXT_INFO_IDENTIFIER', 'Identifier:');
+define('TEXT_INFO_DATE_ADDED', 'Date Added:');
+
+define('SUCCESS_EXPIRED_ENTRIES', 'Success: %s expired entries were removed.');
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/administrators.php 2.3.1.src/admin/includes/languages/english/administrators.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/administrators.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/administrators.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: administrators.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2009 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,6 +13,7 @@
 define('HEADING_TITLE', 'Administrators');
 
 define('TABLE_HEADING_ADMINISTRATORS', 'Administrators');
+define('TABLE_HEADING_HTPASSWD', 'Secured by htpasswd');
 define('TABLE_HEADING_ACTION', 'Action');
 
 define('TEXT_INFO_INSERT_INTRO', 'Please enter the new administrator with its related data');
@@ -22,6 +23,11 @@
 define('TEXT_INFO_USERNAME', 'Username:');
 define('TEXT_INFO_NEW_PASSWORD', 'New Password:');
 define('TEXT_INFO_PASSWORD', 'Password:');
+define('TEXT_INFO_PROTECT_WITH_HTPASSWD', 'Protect With htaccess/htpasswd');
 
 define('ERROR_ADMINISTRATOR_EXISTS', 'Error: Administrator already exists.');
-?>
\ No newline at end of file
+
+define('HTPASSWD_INFO', '<strong>Additional Protection With htaccess/htpasswd</strong><p>This osCommerce Online Merchant Administration Tool installation is not additionally secured through htaccess/htpasswd means.</p><p>Enabling the htaccess/htpasswd security layer will automatically store administrator username and passwords in a htpasswd file when updating administrator password records.</p><p><strong>Please note</strong>, if this additional security layer is enabled and you can no longer access the Administration Tool, please make the following changes and consult your hosting provider to enable htaccess/htpasswd protection:</p><p><u><strong>1. Edit this file:</strong></u><br /><br />' . DIR_FS_ADMIN . '.htaccess</p><p>Remove the following lines if they exist:</p><p><i>%s</i></p><p><u><strong>2. Delete this file:</strong></u><br /><br />' . DIR_FS_ADMIN . '.htpasswd_oscommerce</p>');
+define('HTPASSWD_SECURED', '<strong>Additional Protection With htaccess/htpasswd</strong><p>This osCommerce Online Merchant Administration Tool installation is additionally secured through htaccess/htpasswd means.</p>');
+define('HTPASSWD_PERMISSIONS', '<strong>Additional Protection With htaccess/htpasswd</strong><p>This osCommerce Online Merchant Administration Tool installation is not additionally secured through htaccess/htpasswd means.</p><p>The following files need to be writable by the web server to enable the htaccess/htpasswd security layer:</p><ul><li>' . DIR_FS_ADMIN . '.htaccess</li><li>' . DIR_FS_ADMIN . '.htpasswd_oscommerce</li></ul><p>Reload this page to confirm if the correct file permissions have been set.</p>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/backup.php 2.3.1.src/admin/includes/languages/english/backup.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/backup.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/backup.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: backup.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -20,9 +20,9 @@
 define('TEXT_INFO_HEADING_NEW_BACKUP', 'New Backup');
 define('TEXT_INFO_HEADING_RESTORE_LOCAL', 'Restore Local');
 define('TEXT_INFO_NEW_BACKUP', 'Do not interrupt the backup process which might take a couple of minutes.');
-define('TEXT_INFO_UNPACK', '<br><br>(after unpacking the file from the archive)');
-define('TEXT_INFO_RESTORE', 'Do not interrupt the restoration process.<br><br>The larger the backup, the longer this process takes!<br><br>If possible, use the mysql client.<br><br>For example:<br><br><b>mysql -h' . DB_SERVER . ' -u' . DB_SERVER_USERNAME . ' -p ' . DB_DATABASE . ' < %s </b> %s');
-define('TEXT_INFO_RESTORE_LOCAL', 'Do not interrupt the restoration process.<br><br>The larger the backup, the longer this process takes!');
+define('TEXT_INFO_UNPACK', '<br /><br />(after unpacking the file from the archive)');
+define('TEXT_INFO_RESTORE', 'Do not interrupt the restoration process.<br /><br />The larger the backup, the longer this process takes!<br /><br />If possible, use the mysql client.<br /><br />For example:<br /><br /><strong>mysql -h' . DB_SERVER . ' -u' . DB_SERVER_USERNAME . ' -p ' . DB_DATABASE . ' < %s </strong> %s');
+define('TEXT_INFO_RESTORE_LOCAL', 'Do not interrupt the restoration process.<br /><br />The larger the backup, the longer this process takes!');
 define('TEXT_INFO_RESTORE_LOCAL_RAW_FILE', 'The file uploaded must be a raw sql (text) file.');
 define('TEXT_INFO_DATE', 'Date:');
 define('TEXT_INFO_SIZE', 'Size:');
@@ -46,4 +46,4 @@
 define('SUCCESS_DATABASE_SAVED', 'Success: The database has been saved.');
 define('SUCCESS_DATABASE_RESTORED', 'Success: The database has been restored.');
 define('SUCCESS_BACKUP_DELETED', 'Success: The backup has been removed.');
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/banner_manager.php 2.3.1.src/admin/includes/languages/english/banner_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/banner_manager.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/banner_manager.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_manager.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -30,18 +30,18 @@
 define('TEXT_BANNERS_OR_AT', ', or at');
 define('TEXT_BANNERS_IMPRESSIONS', 'impressions/views.');
 define('TEXT_BANNERS_SCHEDULED_AT', 'Scheduled At:');
-define('TEXT_BANNERS_BANNER_NOTE', '<b>Banner Notes:</b><ul><li>Use an image or HTML text for the banner - not both.</li><li>HTML Text has priority over an image</li></ul>');
-define('TEXT_BANNERS_INSERT_NOTE', '<b>Image Notes:</b><ul><li>Uploading directories must have proper user (write) permissions setup!</li><li>Do not fill out the \'Save To\' field if you are not uploading an image to the webserver (ie, you are using a local (serverside) image).</li><li>The \'Save To\' field must be an existing directory with an ending slash (eg, banners/).</li></ul>');
-define('TEXT_BANNERS_EXPIRCY_NOTE', '<b>Expiry Notes:</b><ul><li>Only one of the two fields should be submitted</li><li>If the banner is not to expire automatically, then leave these fields blank</li></ul>');
-define('TEXT_BANNERS_SCHEDULE_NOTE', '<b>Schedule Notes:</b><ul><li>If a schedule is set, the banner will be activated on that date.</li><li>All scheduled banners are marked as deactive until their date has arrived, to which they will then be marked active.</li></ul>');
+define('TEXT_BANNERS_BANNER_NOTE', '<strong>Banner Notes:</strong><ul><li>Use an image or HTML text for the banner - not both.</li><li>HTML Text has priority over an image</li></ul>');
+define('TEXT_BANNERS_INSERT_NOTE', '<strong>Image Notes:</strong><ul><li>Uploading directories must have proper user (write) permissions setup!</li><li>Do not fill out the \'Save To\' field if you are not uploading an image to the webserver (ie, you are using a local (serverside) image).</li><li>The \'Save To\' field must be an existing directory with an ending slash (eg, banners/).</li></ul>');
+define('TEXT_BANNERS_EXPIRCY_NOTE', '<strong>Expiry Notes:</strong><ul><li>Only one of the two fields should be submitted</li><li>If the banner is not to expire automatically, then leave these fields blank</li></ul>');
+define('TEXT_BANNERS_SCHEDULE_NOTE', '<strong>Schedule Notes:</strong><ul><li>If a schedule is set, the banner will be activated on that date.</li><li>All scheduled banners are marked as deactive until their date has arrived, to which they will then be marked active.</li></ul>');
 
 define('TEXT_BANNERS_DATE_ADDED', 'Date Added:');
-define('TEXT_BANNERS_SCHEDULED_AT_DATE', 'Scheduled At: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_DATE', 'Expires At: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS', 'Expires At: <b>%s</b> impressions');
+define('TEXT_BANNERS_SCHEDULED_AT_DATE', 'Scheduled At: <strong>%s</strong>');
+define('TEXT_BANNERS_EXPIRES_AT_DATE', 'Expires At: <strong>%s</strong>');
+define('TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS', 'Expires At: <strong>%s</strong> impressions');
 define('TEXT_BANNERS_STATUS_CHANGE', 'Status Change: %s');
 
-define('TEXT_BANNERS_DATA', 'D<br>A<br>T<br>A');
+define('TEXT_BANNERS_DATA', 'D<br />A<br />T<br />A');
 define('TEXT_BANNERS_LAST_3_DAYS', 'Last 3 Days');
 define('TEXT_BANNERS_BANNER_VIEWS', 'Banner Views');
 define('TEXT_BANNERS_BANNER_CLICKS', 'Banner Clicks');
@@ -64,4 +64,4 @@
 
 define('ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST', 'Error: Graphs directory does not exist. Please create a \'graphs\' directory inside \'images\'.');
 define('ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE', 'Error: Graphs directory is not writeable.');
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/banner_statistics.php 2.3.1.src/admin/includes/languages/english/banner_statistics.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/banner_statistics.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/banner_statistics.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner_statistics.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,7 +16,7 @@
 define('TABLE_HEADING_VIEWS', 'Views');
 define('TABLE_HEADING_CLICKS', 'Clicks');
 
-define('TEXT_BANNERS_DATA', 'D<br>a<br>t<br>a');
+define('TEXT_BANNERS_DATA', 'D<br />a<br />t<br />a');
 define('TEXT_BANNERS_DAILY_STATISTICS', '%s Daily Statistics For %s %s');
 define('TEXT_BANNERS_MONTHLY_STATISTICS', '%s Monthly Statistics For %s');
 define('TEXT_BANNERS_YEARLY_STATISTICS', '%s Yearly Statistics');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/cache.php 2.3.1.src/admin/includes/languages/english/cache.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/cache.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/cache.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cache.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/categories.php 2.3.1.src/admin/includes/languages/english/categories.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/categories.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/categories.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -56,12 +56,12 @@
 define('TEXT_DELETE_CATEGORY_INTRO', 'Are you sure you want to delete this category?');
 define('TEXT_DELETE_PRODUCT_INTRO', 'Are you sure you want to permanently delete this product?');
 
-define('TEXT_DELETE_WARNING_CHILDS', '<b>WARNING:</b> There are %s (child-)categories still linked to this category!');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>WARNING:</b> There are %s products still linked to this category!');
+define('TEXT_DELETE_WARNING_CHILDS', '<strong>WARNING:</strong> There are %s (child-)categories still linked to this category!');
+define('TEXT_DELETE_WARNING_PRODUCTS', '<strong>WARNING:</strong> There are %s products still linked to this category!');
 
-define('TEXT_MOVE_PRODUCTS_INTRO', 'Please select which category you wish <b>%s</b> to reside in');
-define('TEXT_MOVE_CATEGORIES_INTRO', 'Please select which category you wish <b>%s</b> to reside in');
-define('TEXT_MOVE', 'Move <b>%s</b> to:');
+define('TEXT_MOVE_PRODUCTS_INTRO', 'Please select which category you wish <strong>%s</strong> to reside in');
+define('TEXT_MOVE_CATEGORIES_INTRO', 'Please select which category you wish <strong>%s</strong> to reside in');
+define('TEXT_MOVE', 'Move <strong>%s</strong> to:');
 
 define('TEXT_NEW_CATEGORY_INTRO', 'Please fill out the following information for the new category');
 define('TEXT_CATEGORIES_NAME', 'Category Name:');
@@ -78,6 +78,12 @@
 define('TEXT_PRODUCTS_QUANTITY', 'Products Quantity:');
 define('TEXT_PRODUCTS_MODEL', 'Products Model:');
 define('TEXT_PRODUCTS_IMAGE', 'Products Image:');
+define('TEXT_PRODUCTS_MAIN_IMAGE', 'Main Image');
+define('TEXT_PRODUCTS_LARGE_IMAGE', 'Large Image');
+define('TEXT_PRODUCTS_LARGE_IMAGE_HTML_CONTENT', 'HTML Content (for popup)');
+define('TEXT_PRODUCTS_ADD_LARGE_IMAGE', 'Add Large Image');
+define('TEXT_PRODUCTS_LARGE_IMAGE_DELETE_TITLE', 'Delete Large Product Image?');
+define('TEXT_PRODUCTS_LARGE_IMAGE_CONFIRM_DELETE', 'Please confirm the removal of the large product image.');
 define('TEXT_PRODUCTS_URL', 'Products URL:');
 define('TEXT_PRODUCTS_URL_WITHOUT_HTTP', '<small>(without http://)</small>');
 define('TEXT_PRODUCTS_PRICE_NET', 'Products Price (Net):');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/configuration.php 2.3.1.src/admin/includes/languages/english/configuration.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/configuration.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/configuration.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: configuration.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/countries.php 2.3.1.src/admin/includes/languages/english/countries.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/countries.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/countries.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: countries.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/currencies.php 2.3.1.src/admin/includes/languages/english/currencies.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/currencies.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -18,6 +18,7 @@
 define('TABLE_HEADING_ACTION', 'Action');
 
 define('TEXT_INFO_EDIT_INTRO', 'Please make any necessary changes');
+define('TEXT_INFO_COMMON_CURRENCIES', '-- Common Currencies --');
 define('TEXT_INFO_CURRENCY_TITLE', 'Title:');
 define('TEXT_INFO_CURRENCY_CODE', 'Code:');
 define('TEXT_INFO_CURRENCY_SYMBOL_LEFT', 'Symbol Left:');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/customers.php 2.3.1.src/admin/includes/languages/english/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/customers.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/define_language.php 2.3.1.src/admin/includes/languages/english/define_language.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/define_language.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/define_language.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: define_language.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -10,7 +10,13 @@
   Released under the GNU General Public License
 */
 
-define('HEADING_TITLE', 'Define Language');
+define('HEADING_TITLE', 'Define Languages');
+
+define('TABLE_HEADING_FILES', 'Files');
+define('TABLE_HEADING_WRITABLE', 'Writable');
+define('TABLE_HEADING_LAST_MODIFIED', 'Last Modified');
+
+define('TEXT_EDIT_NOTE', '<strong>Editing Definitions</strong><br /><br />Each language definition is set using the PHP <a href="http://www.php.net/define" target="_blank">define()</a> function in the following manner:<br /><br /><nobr>define(\'TEXT_MAIN\', \'<span style="background-color: #FFFF99;">This text can be edited. It\\\'s really easy to do!</span>\');</nobr><br /><br />The highlighted text can be edited. As this definition is using single quotes to contain the text, any single quotes within the text definition must be escaped with a backslash (eg, It\\\'s).');
 
 define('TEXT_FILE_DOES_NOT_EXIST', 'File does not exist.');
 
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/file_manager.php 2.3.1.src/admin/includes/languages/english/file_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/file_manager.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/file_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: file_manager.php 1744 2007-12-21 02:22:21Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'File Manager');
-
-define('TABLE_HEADING_FILENAME', 'Name');
-define('TABLE_HEADING_SIZE', 'Size');
-define('TABLE_HEADING_PERMISSIONS', 'Permissions');
-define('TABLE_HEADING_USER', 'User');
-define('TABLE_HEADING_GROUP', 'Group');
-define('TABLE_HEADING_LAST_MODIFIED', 'Last Modified');
-define('TABLE_HEADING_ACTION', 'Action');
-
-define('TEXT_INFO_HEADING_UPLOAD', 'Upload');
-define('TEXT_FILE_NAME', 'Filename:');
-define('TEXT_FILE_SIZE', 'Size:');
-define('TEXT_FILE_CONTENTS', 'Contents:');
-define('TEXT_LAST_MODIFIED', 'Last Modified:');
-define('TEXT_NEW_FOLDER', 'New Folder');
-define('TEXT_NEW_FOLDER_INTRO', 'Enter the name for the new folder:');
-define('TEXT_DELETE_INTRO', 'Are you sure you want to delete this file?');
-define('TEXT_UPLOAD_INTRO', 'Please select the files to upload.');
-
-define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Error: I can not write to this directory. Please set the right user permissions on: %s');
-define('ERROR_FILE_NOT_WRITEABLE', 'Error: I can not write to this file. Please set the right user permissions on: %s');
-define('ERROR_DIRECTORY_NOT_REMOVEABLE', 'Error: I can not remove this directory. Please set the right user permissions on: %s');
-define('ERROR_FILE_NOT_REMOVEABLE', 'Error: I can not remove this file. Please set the right user permissions on: %s');
-define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Error: Directory does not exist: %s');
-define('ERROR_FILENAME_EMPTY', 'Error: Please enter a filename to store the contents in.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/geo_zones.php 2.3.1.src/admin/includes/languages/english/geo_zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/geo_zones.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/geo_zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: geo_zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/images/buttons/button_export.gif 2.3.1.src/admin/includes/languages/english/images/buttons/button_export.gif
--- 2.2rc2a.cp.src/admin/includes/languages/english/images/buttons/button_export.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/images/buttons/button_export.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+GIF89aA        <tM~%WU}ݿIphiln~ÿ!   ,    A   =Mihl{:EAmx|G,}Rl:ШtJJ˪v˥^ٮ~zn4 >/<{~}y}zxg	 	|g |g |žýϼg
+ 
+g ;s
pC>
$!B3jlǃg
+Iɒ NK\̀0cʜ) ͛8s!ϟ@
+J(]ʴӧPJu	j5j	DpA.| ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/images/buttons/button_file_manager.gif 2.3.1.src/admin/includes/languages/english/images/buttons/button_file_manager.gif
--- 2.2rc2a.cp.src/admin/includes/languages/english/images/buttons/button_file_manager.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/images/buttons/button_file_manager.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89ai   M~%W~U}hIplniö <t   !   ,    i   '[ihl
-0Pxx|pFrl:qCZجvz\Oi
-.4G!;x\Mٞ~w}xxxģx᪣#`@yT@HHb1JШ"Ŏ 3^IF%=TO0cf6kS'L?}	4MHeSF0TVz5V]*vTh.M˶۷pVx˷߿vL.	+^̸ǐ#''rb<2k̹ϠCM: 
-4^ͺװc˞Ml  h`@@ȓ+_!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/index.php 2.3.1.src/admin/includes/languages/english/index.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/index.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/index.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -9,30 +9,4 @@
 
   Released under the GNU General Public License
 */
-
-define('HEADING_TITLE', 'Choose an action..');
-
-define('BOX_TITLE_ORDERS', 'Orders');
-define('BOX_TITLE_STATISTICS', 'Statistics');
-
-define('BOX_ENTRY_SUPPORT_SITE', 'Support Site');
-define('BOX_ENTRY_SUPPORT_FORUMS', 'Support Forums');
-define('BOX_ENTRY_CONTRIBUTIONS', 'Contributions');
-
-define('BOX_ENTRY_CUSTOMERS', 'Customers:');
-define('BOX_ENTRY_PRODUCTS', 'Products:');
-define('BOX_ENTRY_REVIEWS', 'Reviews:');
-
-define('BOX_CONNECTION_PROTECTED', 'You are protected by a %s secure SSL connection.');
-define('BOX_CONNECTION_UNPROTECTED', 'You are <font color="#ff0000">not</font> protected by a secure SSL connection.');
-define('BOX_CONNECTION_UNKNOWN', 'unknown');
-
-define('CATALOG_CONTENTS', 'Contents');
-
-define('REPORTS_PRODUCTS', 'Products');
-define('REPORTS_ORDERS', 'Orders');
-
-define('TOOLS_BACKUP', 'Backup');
-define('TOOLS_BANNERS', 'Banners');
-define('TOOLS_FILES', 'Files');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/invoice.php 2.3.1.src/admin/includes/languages/english/invoice.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/invoice.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/invoice.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: invoice.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/languages.php 2.3.1.src/admin/includes/languages/english/languages.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/languages.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/languages.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: languages.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/login.php 2.3.1.src/admin/includes/languages/english/login.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/login.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/login.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -21,4 +21,6 @@
 
 define('BUTTON_LOGIN', 'Login');
 define('BUTTON_CREATE_ADMINISTRATOR', 'Create Administrator');
+
+define('ERROR_ACTION_RECORDER', 'Error: The maximum number of login attempts has been reached. Please try again in %s minutes.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/mail.php 2.3.1.src/admin/includes/languages/english/mail.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/mail.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/mail.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: mail.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/manufacturers.php 2.3.1.src/admin/includes/languages/english/manufacturers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/manufacturers.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/manufacturers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: manufacturers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -35,8 +35,8 @@
 define('TEXT_DELETE_INTRO', 'Are you sure you want to delete this manufacturer?');
 define('TEXT_DELETE_IMAGE', 'Delete manufacturers image?');
 define('TEXT_DELETE_PRODUCTS', 'Delete products from this manufacturer? (including product reviews, products on special, upcoming products)');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>WARNING:</b> There are %s products still linked to this manufacturer!');
+define('TEXT_DELETE_WARNING_PRODUCTS', '<strong>WARNING:</strong> There are %s products still linked to this manufacturer!');
 
 define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Error: I can not write to this directory. Please set the right user permissions on: %s');
 define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Error: Directory does not exist: %s');
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_action_recorder.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_action_recorder.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_ACTION_RECORDER_TITLE', 'Action Recorder');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_boxes.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_boxes.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_boxes.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_boxes.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_BOXES_TITLE', 'Boxes');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_dashboard.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_dashboard.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_dashboard.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_dashboard.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_DASHBOARD_TITLE', 'Dashboard');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_header_tags.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_header_tags.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_header_tags.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_header_tags.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_HEADER_TAGS_TITLE', 'Header Tags');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_order_total.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_order_total.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_order_total.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_order_total.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_ORDER_TOTAL_TITLE', 'Order Total');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_payment.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_payment.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_payment.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_payment.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_PAYMENT_TITLE', 'Payment');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_shipping.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_shipping.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_shipping.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_SHIPPING_TITLE', 'Shipping');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_social_bookmarks.php 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_social_bookmarks.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/cfg_modules/cfgm_social_bookmarks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/cfg_modules/cfgm_social_bookmarks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_CFG_MODULE_SOCIAL_BOOKMARKS_TITLE', 'Social Bookmarks');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_admin_logins.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_admin_logins.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_admin_logins.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_admin_logins.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_TITLE', 'Last Administrator Logins');
+define('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_DESCRIPTION', 'Show the last successful and failed administrator logins');
+define('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_DATE', 'Date');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_customers.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_customers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_CUSTOMERS_TITLE', 'Customers');
+define('MODULE_ADMIN_DASHBOARD_CUSTOMERS_DESCRIPTION', 'Show the newest customers');
+define('MODULE_ADMIN_DASHBOARD_CUSTOMERS_DATE', 'Date');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_latest_addons.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_latest_addons.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_latest_addons.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_latest_addons.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_TITLE', 'Lastest Add-Ons');
+define('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_DESCRIPTION', 'Show the lastest osCommerce Add-Ons');
+define('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_DATE', 'Date');
+define('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_FEED_ERROR', 'Could not connect to the osCommerce Add-Ons feed. The next attempt will be performed within 24 hours.');
+define('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_ICON_RSS', 'Subscribe to the osCommerce Add-Ons RSS Feed');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_latest_news.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_latest_news.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_latest_news.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_latest_news.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,21 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_TITLE', 'Lastest News');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_DESCRIPTION', 'Show the lastest osCommerce News');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_DATE', 'Date');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_FEED_ERROR', 'Could not connect to the osCommerce News feed. The next attempt will be performed within 24 hours.');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_NEWSLETTER', 'Sign-Up for the osCommerce Newsletter');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_FACEBOOK', 'Become an osCommerce Fan on Facebook');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_TWITTER', 'Follow osCommerce on Twitter');
+define('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_RSS', 'Subscribe to the osCommerce News RSS Feed');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_orders.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_orders.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_orders.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_ORDERS_TITLE', 'Orders');
+define('MODULE_ADMIN_DASHBOARD_ORDERS_DESCRIPTION', 'Show the latest orders');
+define('MODULE_ADMIN_DASHBOARD_ORDERS_TOTAL', 'Total');
+define('MODULE_ADMIN_DASHBOARD_ORDERS_DATE', 'Date');
+define('MODULE_ADMIN_DASHBOARD_ORDERS_ORDER_STATUS', 'Status');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_reviews.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_reviews.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_reviews.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,19 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_TITLE', 'Reviews');
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_DESCRIPTION', 'Show the latest reviews');
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_REVIEWER', 'Reviewer');
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_DATE', 'Date');
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_RATING', 'Rating');
+define('MODULE_ADMIN_DASHBOARD_REVIEWS_REVIEW_STATUS', 'Status');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_security_checks.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_security_checks.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_security_checks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_security_checks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_TITLE', 'Security Checks');
+define('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_DESCRIPTION', 'Run security checks');
+define('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_SUCCESS', 'This is a properly configured installation of osCommerce Online Merchant!');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_total_customers.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_total_customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_total_customers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_total_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_TITLE', 'Total Customers Chart (last 30 days)');
+define('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_DESCRIPTION', 'Show the total customers chart of the last 30 days');
+define('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_CHART_LINK', 'Total Customers');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_total_revenue.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_total_revenue.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_total_revenue.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_total_revenue.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_TITLE', 'Total Revenue Chart (last 30 days)');
+define('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_DESCRIPTION', 'Show the total revenue chart of the last 30 days');
+define('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_CHART_LINK', 'Total Revenue');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_version_check.php 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_version_check.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/dashboard/d_version_check.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/dashboard/d_version_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,19 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_TITLE', 'Version Check');
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_DESCRIPTION', 'Show the version check results');
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_DATE', 'Last Checked On');
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_CHECK_NOW', 'Check Now');
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_NEVER', 'Never');
+define('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_UPDATE_AVAILABLE', 'An update for osCommerce Online Merchant is available!');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/index/customers.php 2.3.1.src/admin/includes/languages/english/modules/index/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/index/customers.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/index/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define(ADMIN_INDEX_CUSTOMERS_TITLE, 'Customers');
-define(ADMIN_INDEX_CUSTOMERS_DATE, 'Date');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/index/orders.php 2.3.1.src/admin/includes/languages/english/modules/index/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/index/orders.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/index/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('ADMIN_INDEX_ORDERS_TITLE', 'Orders');
-define('ADMIN_INDEX_ORDERS_TOTAL', 'Total');
-define('ADMIN_INDEX_ORDERS_DATE', 'Date');
-define('ADMIN_INDEX_ORDERS_STATUS', 'Status');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/newsletters/newsletter.php 2.3.1.src/admin/includes/languages/english/modules/newsletters/newsletter.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/newsletters/newsletter.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/newsletters/newsletter.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: newsletter.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/newsletters/product_notification.php 2.3.1.src/admin/includes/languages/english/modules/newsletters/product_notification.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/newsletters/product_notification.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/newsletters/product_notification.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_notification.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/config_file_catalog.php 2.3.1.src/admin/includes/languages/english/modules/security_check/config_file_catalog.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/config_file_catalog.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/config_file_catalog.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_CONFIG_FILE_WRITEABLE', 'I am able to write to the configuration file: ' . DIR_FS_CATALOG . 'includes/configure.php. This is a potential security risk - please set the right user permissions on this file.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/default_currency.php 2.3.1.src/admin/includes/languages/english/modules/security_check/default_currency.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/default_currency.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/default_currency.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('ERROR_NO_DEFAULT_CURRENCY_DEFINED', 'Error: There is currently no default currency set. Please set one at: Administration Tool->Localization->Currencies');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/default_language.php 2.3.1.src/admin/includes/languages/english/modules/security_check/default_language.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/default_language.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/default_language.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('ERROR_NO_DEFAULT_LANGUAGE_DEFINED', 'Error: There is currently no default language set. Please set one at: Administration Tool->Localization->Languages');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/download_directory.php 2.3.1.src/admin/includes/languages/english/modules/security_check/download_directory.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/download_directory.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/download_directory.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT', 'The downloadable products directory does not exist: ' . DIR_FS_DOWNLOAD . '. Downloadable products will not work until this directory is valid.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/file_uploads.php 2.3.1.src/admin/includes/languages/english/modules/security_check/file_uploads.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/file_uploads.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/file_uploads.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_FILE_UPLOADS_DISABLED', 'Warning: File uploads are disabled in the php.ini configuration file.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/install_directory.php 2.3.1.src/admin/includes/languages/english/modules/security_check/install_directory.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/install_directory.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/install_directory.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_INSTALL_DIRECTORY_EXISTS', 'Installation directory exists at: ' . DIR_FS_CATALOG . 'install. Please remove this directory for security reasons.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/session_auto_start.php 2.3.1.src/admin/includes/languages/english/modules/security_check/session_auto_start.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/session_auto_start.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/session_auto_start.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_SESSION_AUTO_START', 'session.auto_start is enabled - please disable this php feature in php.ini and restart the web server.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/session_storage.php 2.3.1.src/admin/includes/languages/english/modules/security_check/session_storage.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules/security_check/session_storage.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules/security_check/session_storage.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('WARNING_SESSION_DIRECTORY_NON_EXISTENT', 'The sessions directory does not exist: ' . tep_session_save_path() . '. Sessions will not work until this directory is created.');
+define('WARNING_SESSION_DIRECTORY_NOT_WRITEABLE', 'I am not able to write to the sessions directory: ' . tep_session_save_path() . '. Sessions will not work until the right user permissions are set.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/modules.php 2.3.1.src/admin/includes/languages/english/modules.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/modules.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/modules.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: modules.php 1802 2008-01-11 16:59:17Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -10,16 +10,13 @@
   Released under the GNU General Public License
 */
 
-define('HEADING_TITLE_MODULES_PAYMENT', 'Payment Modules');
-define('HEADING_TITLE_MODULES_SHIPPING', 'Shipping Modules');
-define('HEADING_TITLE_MODULES_ORDER_TOTAL', 'Order Total Modules');
-
 define('TABLE_HEADING_MODULES', 'Modules');
 define('TABLE_HEADING_SORT_ORDER', 'Sort Order');
 define('TABLE_HEADING_ACTION', 'Action');
 
 define('TEXT_INFO_VERSION', 'Version:');
 define('TEXT_INFO_ONLINE_STATUS', 'online status');
+define('TEXT_INFO_API_VERSION', 'API Version:');
 
 define('TEXT_MODULE_DIRECTORY', 'Module Directory:');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/newsletters.php 2.3.1.src/admin/includes/languages/english/newsletters.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/newsletters.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/newsletters.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -28,7 +28,7 @@
 
 define('TEXT_INFO_DELETE_INTRO', 'Are you sure you want to delete this newsletter?');
 
-define('TEXT_PLEASE_WAIT', 'Please wait .. sending emails ..<br><br>Please do not interrupt this process!');
+define('TEXT_PLEASE_WAIT', 'Please wait .. sending emails ..<br /><br />Please do not interrupt this process!');
 define('TEXT_FINISHED_SENDING_EMAILS', 'Finished sending e-mails!');
 
 define('ERROR_NEWSLETTER_TITLE', 'Error: Newsletter title required');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/orders.php 2.3.1.src/admin/includes/languages/english/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/orders.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/orders.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/orders_status.php 2.3.1.src/admin/includes/languages/english/orders_status.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/orders_status.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/orders_status.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: orders_status.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/packingslip.php 2.3.1.src/admin/includes/languages/english/packingslip.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/packingslip.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/packingslip.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: packingslip.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/products_attributes.php 2.3.1.src/admin/includes/languages/english/products_attributes.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/products_attributes.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/products_attributes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: products_attributes.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/products_expected.php 2.3.1.src/admin/includes/languages/english/products_expected.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/products_expected.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/products_expected.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: products_expected.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/reviews.php 2.3.1.src/admin/includes/languages/english/reviews.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/reviews.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,12 +16,13 @@
 define('TABLE_HEADING_RATING', 'Rating');
 define('TABLE_HEADING_DATE_ADDED', 'Date Added');
 define('TABLE_HEADING_ACTION', 'Action');
+define('TABLE_HEADING_STATUS', 'Status');
 
 define('ENTRY_PRODUCT', 'Product:');
 define('ENTRY_FROM', 'From:');
 define('ENTRY_DATE', 'Date:');
 define('ENTRY_REVIEW', 'Review:');
-define('ENTRY_REVIEW_TEXT', '<small><font color="#ff0000"><b>NOTE:</b></font></small>&nbsp;HTML is not translated!&nbsp;');
+define('ENTRY_REVIEW_TEXT', '<small><font color="#ff0000"><strong>NOTE:</strong></font></small>&nbsp;HTML is not translated!&nbsp;');
 define('ENTRY_RATING', 'Rating:');
 
 define('TEXT_INFO_DELETE_REVIEW_INTRO', 'Are you sure you want to delete this review?');
@@ -33,10 +34,14 @@
 define('TEXT_INFO_REVIEW_RATING', 'Rating:');
 define('TEXT_INFO_REVIEW_READ', 'Read:');
 define('TEXT_INFO_REVIEW_SIZE', 'Size:');
+define('TEXT_INFO_REVIEW_STATUS', 'Review Status:');
 define('TEXT_INFO_PRODUCTS_AVERAGE_RATING', 'Average Rating:');
 
+define('TEXT_REVIEW_PUBLISHED', 'Published');
+define('TEXT_REVIEW_NOT_PUBLISHED', 'Not Published');
+
 define('TEXT_OF_5_STARS', '%s of 5 Stars!');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>GOOD</b></font></small>');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>BAD</b></font></small>');
+define('TEXT_GOOD', '<small><font color="#ff0000"><strong>GOOD</strong></font></small>');
+define('TEXT_BAD', '<small><font color="#ff0000"><strong>BAD</strong></font></small>');
 define('TEXT_INFO_HEADING_DELETE_REVIEW', 'Delete Review');
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/sec_dir_permissions.php 2.3.1.src/admin/includes/languages/english/sec_dir_permissions.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/sec_dir_permissions.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/sec_dir_permissions.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,20 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('HEADING_TITLE', 'Security Directory Permissions');
+
+define('TABLE_HEADING_DIRECTORIES', 'Directories');
+define('TABLE_HEADING_WRITABLE', 'Writable');
+define('TABLE_HEADING_RECOMMENDED', 'Recommended');
+
+define('TEXT_DIRECTORY', 'Directory:');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/server_info.php 2.3.1.src/admin/includes/languages/english/server_info.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/server_info.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/server_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: server_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -21,5 +21,12 @@
 define('TITLE_ZEND_VERSION', 'Zend:');
 define('TITLE_DATABASE_HOST', 'Database Host:');
 define('TITLE_DATABASE', 'Database:');
-define('TITLE_DATABASE_DATE', 'Datebase Date:');
-?>
+define('TITLE_DATABASE_DATE', 'Database Date:');
+
+define('TEXT_EXPORT_INTRO', 'The following information can be submitted to osCommerce by clicking on the Send button. You can also save the information to a file by clicking Save. This information is totally anonymous and cannot be used to identify an individual system. It will be used for support and development purposes only.');
+define('TEXT_EXPORT_INFO', 'Export Server Information');
+
+define('SUCCESS_INFO_SUBMIT', 'Your information has been submitted sucessfully.');
+define('ERROR_INFO_SUBMIT', 'Could not connect to the osCommerce website to submit your configuration. Please try again later');
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/specials.php 2.3.1.src/admin/includes/languages/english/specials.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/specials.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -20,7 +20,7 @@
 define('TEXT_SPECIALS_PRODUCT', 'Product:');
 define('TEXT_SPECIALS_SPECIAL_PRICE', 'Special Price:');
 define('TEXT_SPECIALS_EXPIRES_DATE', 'Expiry Date:');
-define('TEXT_SPECIALS_PRICE_TIP', '<b>Specials Notes:</b><ul><li>You can enter a percentage to deduct in the Specials Price field, for example: <b>20%</b></li><li>If you enter a new price, the decimal separator must be a \'.\' (decimal-point), example: <b>49.99</b></li><li>Leave the expiry date empty for no expiration</li></ul>');
+define('TEXT_SPECIALS_PRICE_TIP', '<strong>Specials Notes:</strong><ul><li>You can enter a percentage to deduct in the Specials Price field, for example: <strong>20%</strong></li><li>If you enter a new price, the decimal separator must be a \'.\' (decimal-point), example: <strong>49.99</strong></li><li>Leave the expiry date empty for no expiration</li></ul>');
 
 define('TEXT_INFO_DATE_ADDED', 'Date Added:');
 define('TEXT_INFO_LAST_MODIFIED', 'Last Modified:');
@@ -32,4 +32,4 @@
 
 define('TEXT_INFO_HEADING_DELETE_SPECIALS', 'Delete Special');
 define('TEXT_INFO_DELETE_INTRO', 'Are you sure you want to delete the special products price?');
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/stats_customers.php 2.3.1.src/admin/includes/languages/english/stats_customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/stats_customers.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/stats_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: stats_customers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/stats_products_purchased.php 2.3.1.src/admin/includes/languages/english/stats_products_purchased.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/stats_products_purchased.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/stats_products_purchased.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: stats_products_purchased.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/stats_products_viewed.php 2.3.1.src/admin/includes/languages/english/stats_products_viewed.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/stats_products_viewed.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/stats_products_viewed.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: stats_products_viewed.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/store_logo.php 2.3.1.src/admin/includes/languages/english/store_logo.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/store_logo.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/store_logo.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,21 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('HEADING_TITLE', 'Store Logo');
+
+define('TEXT_LOGO_IMAGE', 'New Logo:');
+define('TEXT_FORMAT_AND_LOCATION', 'The store logo must be in PNG format and will be saved as:');
+
+define('SUCCESS_LOGO_UPDATED', 'Success: The store logo has successfully been updated!');
+
+define('ERROR_IMAGES_DIRECTORY_NOT_WRITEABLE', 'Error: The images directory cannot be uploaded to. (<a href="%s">click here to review the directory permissions</a>)');
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/tax_classes.php 2.3.1.src/admin/includes/languages/english/tax_classes.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/tax_classes.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/tax_classes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: tax_classes.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/tax_rates.php 2.3.1.src/admin/includes/languages/english/tax_rates.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/tax_rates.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/tax_rates.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: tax_rates.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -26,7 +26,7 @@
 define('TEXT_INFO_COUNTRY_NAME', 'Country:');
 define('TEXT_INFO_ZONE_NAME', 'Zone:');
 define('TEXT_INFO_TAX_RATE', 'Tax Rate (%):');
-define('TEXT_INFO_TAX_RATE_PRIORITY', 'Tax rates at the same priority are added, others are compounded.<br><br>Priority:');
+define('TEXT_INFO_TAX_RATE_PRIORITY', 'Tax rates at the same priority are added, others are compounded.<br /><br />Priority:');
 define('TEXT_INFO_RATE_DESCRIPTION', 'Description:');
 define('TEXT_INFO_INSERT_INTRO', 'Please enter the new tax class with its related data');
 define('TEXT_INFO_DELETE_INTRO', 'Are you sure you want to delete this tax rate?');
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/version_check.php 2.3.1.src/admin/includes/languages/english/version_check.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/version_check.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/version_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,27 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+define('HEADING_TITLE', 'Version Checker');
+
+define('TABLE_HEADING_VERSION', 'Version');
+define('TABLE_HEADING_RELEASED', 'Release Date');
+define('TABLE_HEADING_ACTION', 'Action');
+
+define('TEXT_RELEASE_LINK', 'View Release Annoucement');
+
+define('TITLE_INSTALLED_VERSION', 'Installed Version:');
+
+define('VERSION_RUNNING_LATEST', 'You are running the latest version of osCommerce Online Merchant.');
+define('VERSION_UPGRADES_AVAILABLE', 'A new version is available for download! (osCommerce Online Merchant v%s)');
+
+define('ERROR_COULD_NOT_CONNECT', 'Could not connect to the osCommerce website to check for new versions.');
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/whos_online.php 2.3.1.src/admin/includes/languages/english/whos_online.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/whos_online.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/whos_online.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: whos_online.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english/zones.php 2.3.1.src/admin/includes/languages/english/zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/english/zones.php	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english/zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/english.php 2.3.1.src/admin/includes/languages/english.php
--- 2.2rc2a.cp.src/admin/includes/languages/english.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/english.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: english.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -20,6 +20,8 @@
 define('DATE_FORMAT', 'm/d/Y'); // this is used for date()
 define('PHP_DATE_TIME_FORMAT', 'm/d/Y H:i:s'); // this is used for date()
 define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
+define('JQUERY_DATEPICKER_I18N_CODE', ''); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
+define('JQUERY_DATEPICKER_FORMAT', 'mm/dd/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate
 
 ////
 // Return date in raw format
@@ -37,7 +39,7 @@
 define('HTML_PARAMS','dir="ltr" lang="en"');
 
 // charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
+define('CHARSET', 'utf-8');
 
 // page title
 define('TITLE', 'osCommerce Online Merchant Administration Tool');
@@ -61,12 +63,10 @@
 define('BOX_CONFIGURATION_LOGGING', 'Logging');
 define('BOX_CONFIGURATION_CACHE', 'Cache');
 define('BOX_CONFIGURATION_ADMINISTRATORS', 'Administrators');
+define('BOX_CONFIGURATION_STORE_LOGO', 'Store Logo');
 
 // modules box text in includes/boxes/modules.php
 define('BOX_HEADING_MODULES', 'Modules');
-define('BOX_MODULES_PAYMENT', 'Payment');
-define('BOX_MODULES_SHIPPING', 'Shipping');
-define('BOX_MODULES_ORDER_TOTAL', 'Order Total');
 
 // categories box text in includes/boxes/catalog.php
 define('BOX_HEADING_CATALOG', 'Catalog');
@@ -98,14 +98,16 @@
 
 // tools text in includes/boxes/tools.php
 define('BOX_HEADING_TOOLS', 'Tools');
+define('BOX_TOOLS_ACTION_RECORDER', 'Action Recorder');
 define('BOX_TOOLS_BACKUP', 'Database Backup');
 define('BOX_TOOLS_BANNER_MANAGER', 'Banner Manager');
 define('BOX_TOOLS_CACHE', 'Cache Control');
 define('BOX_TOOLS_DEFINE_LANGUAGE', 'Define Languages');
-define('BOX_TOOLS_FILE_MANAGER', 'File Manager');
 define('BOX_TOOLS_MAIL', 'Send Email');
 define('BOX_TOOLS_NEWSLETTER_MANAGER', 'Newsletter Manager');
+define('BOX_TOOLS_SEC_DIR_PERMISSIONS', 'Security Directory Permissions');
 define('BOX_TOOLS_SERVER_INFO', 'Server Info');
+define('BOX_TOOLS_VERSION_CHECK', 'Version Checker');
 define('BOX_TOOLS_WHOS_ONLINE', 'Who\'s Online');
 
 // localizaion box text in includes/boxes/localization.php
@@ -166,11 +168,9 @@
 define('ENTRY_EMAIL_ADDRESS_CHECK_ERROR', '&nbsp;<span class="errorText">The email address doesn\'t appear to be valid!</span>');
 define('ENTRY_EMAIL_ADDRESS_ERROR_EXISTS', '&nbsp;<span class="errorText">This email address already exists!</span>');
 define('ENTRY_COMPANY', 'Company name:');
-define('ENTRY_COMPANY_ERROR', '');
 define('ENTRY_STREET_ADDRESS', 'Street Address:');
 define('ENTRY_STREET_ADDRESS_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' chars</span>');
 define('ENTRY_SUBURB', 'Suburb:');
-define('ENTRY_SUBURB_ERROR', '');
 define('ENTRY_POST_CODE', 'Post Code:');
 define('ENTRY_POST_CODE_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_POSTCODE_MIN_LENGTH . ' chars</span>');
 define('ENTRY_CITY', 'City:');
@@ -178,15 +178,13 @@
 define('ENTRY_STATE', 'State:');
 define('ENTRY_STATE_ERROR', '&nbsp;<span class="errorText">required</span>');
 define('ENTRY_COUNTRY', 'Country:');
-define('ENTRY_COUNTRY_ERROR', '');
+define('ENTRY_COUNTRY_ERROR', 'You must select a country from the Countries pull down menu.');
 define('ENTRY_TELEPHONE_NUMBER', 'Telephone Number:');
 define('ENTRY_TELEPHONE_NUMBER_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_TELEPHONE_MIN_LENGTH . ' chars</span>');
 define('ENTRY_FAX_NUMBER', 'Fax Number:');
-define('ENTRY_FAX_NUMBER_ERROR', '');
 define('ENTRY_NEWSLETTER', 'Newsletter:');
 define('ENTRY_NEWSLETTER_YES', 'Subscribed');
 define('ENTRY_NEWSLETTER_NO', 'Unsubscribed');
-define('ENTRY_NEWSLETTER_ERROR', '');
 
 // images
 define('IMAGE_ANI_SEND_EMAIL', 'Sending E-Mail');
@@ -200,7 +198,7 @@
 define('IMAGE_DELETE', 'Delete');
 define('IMAGE_EDIT', 'Edit');
 define('IMAGE_EMAIL', 'Email');
-define('IMAGE_FILE_MANAGER', 'File Manager');
+define('IMAGE_EXPORT', 'Export');
 define('IMAGE_ICON_STATUS_GREEN', 'Active');
 define('IMAGE_ICON_STATUS_GREEN_LIGHT', 'Set Active');
 define('IMAGE_ICON_STATUS_RED', 'Inactive');
@@ -258,23 +256,24 @@
 
 // constants for use in tep_prev_next_display function
 define('TEXT_RESULT_PAGE', 'Page %s of %d');
-define('TEXT_DISPLAY_NUMBER_OF_BANNERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> banners)');
-define('TEXT_DISPLAY_NUMBER_OF_COUNTRIES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> countries)');
-define('TEXT_DISPLAY_NUMBER_OF_CUSTOMERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> customers)');
-define('TEXT_DISPLAY_NUMBER_OF_CURRENCIES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> currencies)');
-define('TEXT_DISPLAY_NUMBER_OF_LANGUAGES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> languages)');
-define('TEXT_DISPLAY_NUMBER_OF_MANUFACTURERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> manufacturers)');
-define('TEXT_DISPLAY_NUMBER_OF_NEWSLETTERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> newsletters)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> orders)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS_STATUS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> orders status)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> products)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_EXPECTED', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> products expected)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> product reviews)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> products on special)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_CLASSES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> tax classes)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_ZONES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> tax zones)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_RATES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> tax rates)');
-define('TEXT_DISPLAY_NUMBER_OF_ZONES', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> zones)');
+define('TEXT_DISPLAY_NUMBER_OF_BANNERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> banners)');
+define('TEXT_DISPLAY_NUMBER_OF_COUNTRIES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> countries)');
+define('TEXT_DISPLAY_NUMBER_OF_CUSTOMERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> customers)');
+define('TEXT_DISPLAY_NUMBER_OF_CURRENCIES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> currencies)');
+define('TEXT_DISPLAY_NUMBER_OF_ENTRIES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> entries)');
+define('TEXT_DISPLAY_NUMBER_OF_LANGUAGES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> languages)');
+define('TEXT_DISPLAY_NUMBER_OF_MANUFACTURERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> manufacturers)');
+define('TEXT_DISPLAY_NUMBER_OF_NEWSLETTERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> newsletters)');
+define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> orders)');
+define('TEXT_DISPLAY_NUMBER_OF_ORDERS_STATUS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> orders status)');
+define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> products)');
+define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_EXPECTED', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> products expected)');
+define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> product reviews)');
+define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> products on special)');
+define('TEXT_DISPLAY_NUMBER_OF_TAX_CLASSES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> tax classes)');
+define('TEXT_DISPLAY_NUMBER_OF_TAX_ZONES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> tax zones)');
+define('TEXT_DISPLAY_NUMBER_OF_TAX_RATES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> tax rates)');
+define('TEXT_DISPLAY_NUMBER_OF_ZONES', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> zones)');
 
 define('PREVNEXT_BUTTON_PREV', '&lt;&lt;');
 define('PREVNEXT_BUTTON_NEXT', '&gt;&gt;');
@@ -283,8 +282,6 @@
 define('TEXT_SET_DEFAULT', 'Set as default');
 define('TEXT_FIELD_REQUIRED', '&nbsp;<span class="fieldRequired">* Required</span>');
 
-define('ERROR_NO_DEFAULT_CURRENCY_DEFINED', 'Error: There is currently no default currency set. Please set one at: Administration Tool->Localization->Currencies');
-
 define('TEXT_CACHE_CATEGORIES', 'Categories Box');
 define('TEXT_CACHE_MANUFACTURERS', 'Manufacturers Box');
 define('TEXT_CACHE_ALSO_PURCHASED', 'Also Purchased Module');
@@ -298,5 +295,4 @@
 define('ERROR_FILETYPE_NOT_ALLOWED', 'Error: File upload type not allowed.');
 define('SUCCESS_FILE_SAVED_SUCCESSFULLY', 'Success: File upload saved successfully.');
 define('WARNING_NO_FILE_UPLOADED', 'Warning: No file uploaded.');
-define('WARNING_FILE_UPLOADS_DISABLED', 'Warning: File uploads are disabled in the php.ini configuration file.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/administrators.php 2.3.1.src/admin/includes/languages/espanol/administrators.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/administrators.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/administrators.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: administrators.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrators');
-
-define('TABLE_HEADING_ADMINISTRATORS', 'Administrators');
-define('TABLE_HEADING_ACTION', 'Action');
-
-define('TEXT_INFO_INSERT_INTRO', 'Please enter the new administrator with its related data');
-define('TEXT_INFO_EDIT_INTRO', 'Please make any necessary changes');
-define('TEXT_INFO_DELETE_INTRO', 'Are you sure you want to delete this administrator?');
-define('TEXT_INFO_HEADING_NEW_ADMINISTRATOR', 'New Administrator');
-define('TEXT_INFO_USERNAME', 'Username:');
-define('TEXT_INFO_NEW_PASSWORD', 'New Password:');
-define('TEXT_INFO_PASSWORD', 'Password:');
-
-define('ERROR_ADMINISTRATOR_EXISTS', 'Error: Administrator already exists.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/backup.php 2.3.1.src/admin/includes/languages/espanol/backup.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/backup.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/backup.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,49 +0,0 @@
-<?php
-/*
-  $Id: backup.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Copia de Seguridad de la Base de Datos');
-
-define('TABLE_HEADING_TITLE', 'T&iacute;tulo');
-define('TABLE_HEADING_FILE_DATE', 'Fecha');
-define('TABLE_HEADING_FILE_SIZE', 'Tama&ntilde;o');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_HEADING_NEW_BACKUP', 'Nueva Copia de Seguridad');
-define('TEXT_INFO_HEADING_RESTORE_LOCAL', 'Restaurar Localmente');
-define('TEXT_INFO_NEW_BACKUP', 'No interrumpa el proceso de copia, que puede durar unos minutos.');
-define('TEXT_INFO_UNPACK', '<br><br>(despues de descomprimir el archivo)');
-define('TEXT_INFO_RESTORE', 'No interrumpa el proceso de restauraci&oacute;n.<br><br>Cuanto mas grande sea la copia de seguridad, mas tardar&aacute; este proceso!<br><br>Si es posible, use el cliente de mysql.<br><br>Por ejemplo:<br><br><b>mysql -h' . DB_SERVER . ' -u' . DB_SERVER_USERNAME . ' -p ' . DB_DATABASE . ' < %s </b> %s');
-define('TEXT_INFO_RESTORE_LOCAL', 'No interrumpa el proceso de restauraci&oacute;n.<br><br>Cuanto mas grande sea la copia de seguridad, mas tardar&aacute; este proceso!');
-define('TEXT_INFO_RESTORE_LOCAL_RAW_FILE', 'El fichero subido debe ser de texto.');
-define('TEXT_INFO_DATE', 'Fecha:');
-define('TEXT_INFO_SIZE', 'Tama&ntilde;o:');
-define('TEXT_INFO_COMPRESSION', 'Compresi&oacute;n:');
-define('TEXT_INFO_USE_GZIP', 'Usar GZIP');
-define('TEXT_INFO_USE_ZIP', 'Usar ZIP');
-define('TEXT_INFO_USE_NO_COMPRESSION', 'Sin Compresi&oacute;n (directamente SQL)');
-define('TEXT_INFO_DOWNLOAD_ONLY', 'Bajar solo (no guardar en el servidor)');
-define('TEXT_INFO_BEST_THROUGH_HTTPS', 'Preferiblemente con una conexi&oacute;n segura');
-define('TEXT_NO_EXTENSION', 'Ninguna');
-define('TEXT_BACKUP_DIRECTORY', 'Directorio para Copias de Seguridad:');
-define('TEXT_LAST_RESTORATION', 'Ultima Restauraci&oacute;n:');
-define('TEXT_FORGET', '(<u>olvidar</u>)');
-define('TEXT_DELETE_INTRO', 'Seguro que quiere eliminar esta copia?');
-
-define('ERROR_BACKUP_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio de copias de seguridad.');
-define('ERROR_BACKUP_DIRECTORY_NOT_WRITEABLE', 'Error: No hay permiso de escritura en el directorio de copias de seguridad.');
-define('ERROR_DOWNLOAD_LINK_NOT_ACCEPTABLE', 'Error: No se aceptan enlaces.');
-
-define('SUCCESS_LAST_RESTORE_CLEARED', 'Exito: La fecha de ultima restauraci&oacute;n ha sido borrada.');
-define('SUCCESS_DATABASE_SAVED', 'Exito: Se ha guardado la base de datos.');
-define('SUCCESS_DATABASE_RESTORED', 'Exito: Se ha restaurado la base de datos.');
-define('SUCCESS_BACKUP_DELETED', 'Exito: Se ha eliminado la copia de seguridad.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/banner_manager.php 2.3.1.src/admin/includes/languages/espanol/banner_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/banner_manager.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/banner_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,67 +0,0 @@
-<?php
-/*
-  $Id: banner_manager.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrador de Banners');
-
-define('TABLE_HEADING_BANNERS', 'Banners');
-define('TABLE_HEADING_GROUPS', 'Grupos');
-define('TABLE_HEADING_STATISTICS', 'Vistas / Clicks');
-define('TABLE_HEADING_STATUS', 'Estado');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_BANNERS_TITLE', 'T&iacute;tulo:');
-define('TEXT_BANNERS_URL', 'URL:');
-define('TEXT_BANNERS_GROUP', 'Grupo:');
-define('TEXT_BANNERS_NEW_GROUP', ', o introduzca un grupo nuevo');
-define('TEXT_BANNERS_IMAGE', 'Imagen:');
-define('TEXT_BANNERS_IMAGE_LOCAL', ', o introduzca un fichero local');
-define('TEXT_BANNERS_IMAGE_TARGET', 'Destino de la Imagen (Grabar en):');
-define('TEXT_BANNERS_HTML_TEXT', 'Texto HTML:');
-define('TEXT_BANNERS_EXPIRES_ON', 'Caduca el:');
-define('TEXT_BANNERS_OR_AT', ', o tras');
-define('TEXT_BANNERS_IMPRESSIONS', 'vistas.');
-define('TEXT_BANNERS_SCHEDULED_AT', 'Programado el:');
-define('TEXT_BANNERS_BANNER_NOTE', '<b>Notas sobre el Banner:</b><ul><li>Use una imagen o texto HTML para el banner - no ambos.</li><li>Texto HTML tiene prioridad sobre una imagen</li></ul>');
-define('TEXT_BANNERS_INSERT_NOTE', '<b>Notas sobre la Imagen:</b><ul><li>El directorio donde suba la imagen debe de tener configurados los permisos de escritura necesarios!</li><li>No rellene el campo \'Grabar en\' si no va a subir una imagen al servidor (por ejemplo, cuando use una imagen ya existente en el servidor -fichero local).</li><li>El campo \'Grabar en\' debe de ser un directorio que exista y terminado en una barra (por ejemplo: banners/).</li></ul>');
-define('TEXT_BANNERS_EXPIRCY_NOTE', '<b>Notas sobre la Caducidad:</b><ul><li>Solo se debe de rellenar uno de los dos campos</li><li>Si el banner no debe de caducar no rellene ninguno de los campos</li></ul>');
-define('TEXT_BANNERS_SCHEDULE_NOTE', '<b>Notas sobre la Programaci&oacute;n:</b><ul><li>Si se configura una fecha de programaci&oacute;n el banner se activara en esa fecha.</li><li>Todos los banners programados se marcan como inactivos hasta que llegue su fecha, cuando se marcan activos.</li></ul>');
-
-define('TEXT_BANNERS_DATE_ADDED', 'A&ntilde;adido el:');
-define('TEXT_BANNERS_SCHEDULED_AT_DATE', 'Programado el: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_DATE', 'Caduca el: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS', 'Caduca tras: <b>%s</b> vistas');
-define('TEXT_BANNERS_STATUS_CHANGE', 'Cambio Estado: %s');
-
-define('TEXT_BANNERS_DATA', 'D<br>A<br>T<br>O<br>S');
-define('TEXT_BANNERS_LAST_3_DAYS', 'Ultimos 3 dias');
-define('TEXT_BANNERS_BANNER_VIEWS', 'Vistas');
-define('TEXT_BANNERS_BANNER_CLICKS', 'Clicks');
-
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que quiere eliminar este banner?');
-define('TEXT_INFO_DELETE_IMAGE', 'Borrar imagen');
-
-define('SUCCESS_BANNER_INSERTED', 'Exito: Se ha a&ntilde;adido el banner.');
-define('SUCCESS_BANNER_UPDATED', 'Exito: Se ha actualizado el banner.');
-define('SUCCESS_BANNER_REMOVED', 'Exito: Se ha eliminado el banner.');
-define('SUCCESS_BANNER_STATUS_UPDATED', 'Exito: El estado del banner se ha actualizado.');
-
-define('ERROR_BANNER_TITLE_REQUIRED', 'Error: Es necesario el t&iacute;tulo del banner.');
-define('ERROR_BANNER_GROUP_REQUIRED', 'Error: Es necesario el grupo del banner.');
-define('ERROR_IMAGE_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio destino: %s');
-define('ERROR_IMAGE_DIRECTORY_NOT_WRITEABLE', 'Error: No se puede escribir en el directorio destino: %s');
-define('ERROR_IMAGE_DOES_NOT_EXIST', 'Error: No existe imagen.');
-define('ERROR_IMAGE_IS_NOT_WRITEABLE', 'Error: No se puede eliminar la imagen.');
-define('ERROR_UNKNOWN_STATUS_FLAG', 'Error: Estado desconocido.');
-
-define('ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio de gr&aacute;ficos. Por favor cree un directorio llamado \'graphs\' dentro de \'images\'.');
-define('ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE', 'Error: No se puede escribir en el directorio de gr&aacute;ficos.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/banner_statistics.php 2.3.1.src/admin/includes/languages/espanol/banner_statistics.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/banner_statistics.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/banner_statistics.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,34 +0,0 @@
-<?php
-/*
-  $Id: banner_statistics.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Estadisticas de Banners');
-
-define('TABLE_HEADING_SOURCE', 'Fecha');
-define('TABLE_HEADING_VIEWS', 'Vistas');
-define('TABLE_HEADING_CLICKS', 'Clicks');
-
-define('TEXT_BANNERS_DATA', 'D<br>a<br>t<br>o<br>s');
-define('TEXT_BANNERS_DAILY_STATISTICS', '%s Estadisticas Diarias de %s %s');
-define('TEXT_BANNERS_MONTHLY_STATISTICS', '%s Estadisticas Mensuales de %s');
-define('TEXT_BANNERS_YEARLY_STATISTICS', '%s Estadisticas Anuales');
-
-define('STATISTICS_TYPE_DAILY', 'Diarias');
-define('STATISTICS_TYPE_MONTHLY', 'Mensuales');
-define('STATISTICS_TYPE_YEARLY', 'Anuales');
-
-define('TITLE_TYPE', 'Tipo:');
-define('TITLE_YEAR', 'A&ntilde;o:');
-define('TITLE_MONTH', 'Mes:');
-
-define('ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio de gr&aacute;ficos. Por favor cree un directorio llamado \'graphs\' dentro de \'images\'.');
-define('ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE', 'Error: No se puede escribir en el directorio de gr&aacute;ficos.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/cache.php 2.3.1.src/admin/includes/languages/espanol/cache.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/cache.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/cache.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: cache.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Control de Cach&eacute;');
-
-define('TABLE_HEADING_CACHE', 'Paneles');
-define('TABLE_HEADING_DATE_CREATED', 'Fecha de Creaci&oacute;n');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_FILE_DOES_NOT_EXIST', 'No existe fichero');
-define('TEXT_CACHE_DIRECTORY', 'Directorio para la Cach&eacute;: ');
-
-define('ERROR_CACHE_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio para la cach&eacute;. Especifique un directorio valido en Configuraci&oacute;n->Cach&eacute;.');
-define('ERROR_CACHE_DIRECTORY_NOT_WRITEABLE', 'Error: No hay permiso de escritura en el directorio para la cach.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/categories.php 2.3.1.src/admin/includes/languages/espanol/categories.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/categories.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/categories.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,97 +0,0 @@
-<?php
-/*
-  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Categorias / Productos');
-define('HEADING_TITLE_SEARCH', 'Buscar:');
-define('HEADING_TITLE_GOTO', 'Ir A:');
-
-define('TABLE_HEADING_ID', 'ID');
-define('TABLE_HEADING_CATEGORIES_PRODUCTS', 'Categorias / Productos');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-define('TABLE_HEADING_STATUS', 'Estado');
-
-define('TEXT_NEW_PRODUCT', 'Nuevo Producto en &quot;%s&quot;');
-define('TEXT_CATEGORIES', 'Categorias:');
-define('TEXT_SUBCATEGORIES', 'Subcategorias:');
-define('TEXT_PRODUCTS', 'Productos:');
-define('TEXT_PRODUCTS_PRICE_INFO', 'Precio:');
-define('TEXT_PRODUCTS_TAX_CLASS', 'Tipo Impuesto:');
-define('TEXT_PRODUCTS_AVERAGE_RATING', 'Evaluaci&oacute;n Media:');
-define('TEXT_PRODUCTS_QUANTITY_INFO', 'Cantidad:');
-define('TEXT_DATE_ADDED', 'A&ntilde;adido el:');
-define('TEXT_DATE_AVAILABLE', 'Fecha Disponibilidad:');
-define('TEXT_LAST_MODIFIED', 'Modificado el:');
-define('TEXT_IMAGE_NONEXISTENT', 'NO EXISTE IMAGEN');
-define('TEXT_NO_CHILD_CATEGORIES_OR_PRODUCTS', 'Inserte una nueva categoria o producto.');
-define('TEXT_PRODUCT_MORE_INFORMATION', 'Si quiere mas informaci&oacute;n, visite la <a href="http://%s" target="blank"><u>p&aacute;gina</u></a> de este producto.');
-define('TEXT_PRODUCT_DATE_ADDED', 'Este producto fue a&ntilde;adido el %s.');
-define('TEXT_PRODUCT_DATE_AVAILABLE', 'Este producto estar&aacute; disponible el %s.');
-
-define('TEXT_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_EDIT_CATEGORIES_ID', 'ID Categoria:');
-define('TEXT_EDIT_CATEGORIES_NAME', 'Nombre Categoria:');
-define('TEXT_EDIT_CATEGORIES_IMAGE', 'Imagen Categoria:');
-define('TEXT_EDIT_SORT_ORDER', 'Orden:');
-
-define('TEXT_INFO_COPY_TO_INTRO', 'Elija la categoria hacia donde quiera copiar este producto');
-define('TEXT_INFO_CURRENT_CATEGORIES', 'Categorias:');
-
-define('TEXT_INFO_HEADING_NEW_CATEGORY', 'Nueva Categoria');
-define('TEXT_INFO_HEADING_EDIT_CATEGORY', 'Editar Categoria');
-define('TEXT_INFO_HEADING_DELETE_CATEGORY', 'Eliminar Categoria');
-define('TEXT_INFO_HEADING_MOVE_CATEGORY', 'Mover Categoria');
-define('TEXT_INFO_HEADING_DELETE_PRODUCT', 'Eliminar Producto');
-define('TEXT_INFO_HEADING_MOVE_PRODUCT', 'Mover Producto');
-define('TEXT_INFO_HEADING_COPY_TO', 'Copiar A');
-
-define('TEXT_DELETE_CATEGORY_INTRO', 'Seguro que desea eliminar esta categoria?');
-define('TEXT_DELETE_PRODUCT_INTRO', 'Es usted seguro usted desea suprimir permanentemente este producto?');
-
-define('TEXT_DELETE_WARNING_CHILDS', '<b>ADVERTENCIA:</b> Hay %s categorias que pertenecen a esta categoria!');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>ADVERTENCIA:</b> Hay %s productos en esta categoria!');
-
-define('TEXT_MOVE_PRODUCTS_INTRO', 'Elija la categoria hacia donde quiera mover <b>%s</b>');
-define('TEXT_MOVE_CATEGORIES_INTRO', 'Elija la categoria hacia donde quiera mover <b>%s</b>');
-define('TEXT_MOVE', 'Mover <b>%s</b> a:');
-
-define('TEXT_NEW_CATEGORY_INTRO', 'Rellene los siguientes datos de la nueva categoria');
-define('TEXT_CATEGORIES_NAME', 'Nombre Categoria:');
-define('TEXT_CATEGORIES_IMAGE', 'Imagen Categoria:');
-define('TEXT_SORT_ORDER', 'Orden:');
-
-define('TEXT_PRODUCTS_STATUS', 'Estado de los Productos:');
-define('TEXT_PRODUCTS_DATE_AVAILABLE', 'Fecha Disponibilidad:');
-define('TEXT_PRODUCT_AVAILABLE', 'Disponible');
-define('TEXT_PRODUCT_NOT_AVAILABLE', 'Agotado');
-define('TEXT_PRODUCTS_MANUFACTURER', 'Fabricante del producto:');
-define('TEXT_PRODUCTS_NAME', 'Nombre del Producto:');
-define('TEXT_PRODUCTS_DESCRIPTION', 'Descripci&oacute;n del producto:');
-define('TEXT_PRODUCTS_QUANTITY', 'Cantidad:');
-define('TEXT_PRODUCTS_MODEL', 'M&oacute;delo:');
-define('TEXT_PRODUCTS_IMAGE', 'Imagen:');
-define('TEXT_PRODUCTS_URL', 'URL del Producto:');
-define('TEXT_PRODUCTS_URL_WITHOUT_HTTP', '<small>(sin http://)</small>');
-define('TEXT_PRODUCTS_PRICE_NET', 'Precio de los Productos (Net):');
-define('TEXT_PRODUCTS_PRICE_GROSS', 'Precio de los Productos (Gross):');
-define('TEXT_PRODUCTS_WEIGHT', 'Peso:');
-
-define('EMPTY_CATEGORY', 'Categoria Vacia');
-
-define('TEXT_HOW_TO_COPY', 'Metodo de Copia:');
-define('TEXT_COPY_AS_LINK', 'Enlazar el producto');
-define('TEXT_COPY_AS_DUPLICATE', 'Duplicar el producto');
-
-define('ERROR_CANNOT_LINK_TO_SAME_CATEGORY', 'Error: No se pueden enlazar productos en la misma categoria.');
-define('ERROR_CATALOG_IMAGE_DIRECTORY_NOT_WRITEABLE', 'Error: No se puede escribir en el directorio de imagenes del cat&aacute;logo: ' . DIR_FS_CATALOG_IMAGES);
-define('ERROR_CATALOG_IMAGE_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio de imagenes del cat&aacute;logo: ' . DIR_FS_CATALOG_IMAGES);
-define('ERROR_CANNOT_MOVE_CATEGORY_TO_PARENT', 'Error: Category cannot be moved into child category.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/configuration.php 2.3.1.src/admin/includes/languages/espanol/configuration.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/configuration.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/configuration.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: configuration.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_CONFIGURATION_TITLE', 'T&iacute;tulo');
-define('TABLE_HEADING_CONFIGURATION_VALUE', 'Valor');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_DATE_ADDED', 'Fecha de Alta:');
-define('TEXT_INFO_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/countries.php 2.3.1.src/admin/includes/languages/espanol/countries.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/countries.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/countries.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: countries.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Paises');
-
-define('TABLE_HEADING_COUNTRY_NAME', 'Pa&iacute;s');
-define('TABLE_HEADING_COUNTRY_CODES', 'C&oacute;digos ISO');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_COUNTRY_NAME', 'Nombre:');
-define('TEXT_INFO_COUNTRY_CODE_2', 'C&oacute;digo ISO (2):');
-define('TEXT_INFO_COUNTRY_CODE_3', 'C&oacute;digo ISO (3):');
-define('TEXT_INFO_ADDRESS_FORMAT', 'Formato de Direcci&oacute;n:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca el nuevo pa&iacute;s con sus datos');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que desea eliminar este pa&iacute;s?');
-define('TEXT_INFO_HEADING_NEW_COUNTRY', 'Nuevo Pa&iacute;s');
-define('TEXT_INFO_HEADING_EDIT_COUNTRY', 'Editar Pa&iacute;s');
-define('TEXT_INFO_HEADING_DELETE_COUNTRY', 'Eliminar Pa&iacute;s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/currencies.php 2.3.1.src/admin/includes/languages/espanol/currencies.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/currencies.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/currencies.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Monedas');
-
-define('TABLE_HEADING_CURRENCY_NAME', 'Moneda');
-define('TABLE_HEADING_CURRENCY_CODES', 'C&oacute;digo');
-define('TABLE_HEADING_CURRENCY_VALUE', 'Valor');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_CURRENCY_TITLE', 'T&iacute;tulo:');
-define('TEXT_INFO_CURRENCY_CODE', 'C&oacute;digo:');
-define('TEXT_INFO_CURRENCY_SYMBOL_LEFT', 'S&iacute;mbolo a la izquierda:');
-define('TEXT_INFO_CURRENCY_SYMBOL_RIGHT', 'S&iacute;mbolo a la derecha:');
-define('TEXT_INFO_CURRENCY_DECIMAL_POINT', 'Punto decimal:');
-define('TEXT_INFO_CURRENCY_THOUSANDS_POINT', 'Separador de miles:');
-define('TEXT_INFO_CURRENCY_DECIMAL_PLACES', 'Lugares decimales:');
-define('TEXT_INFO_CURRENCY_LAST_UPDATED', 'Actualizado el:');
-define('TEXT_INFO_CURRENCY_VALUE', 'Valor:');
-define('TEXT_INFO_CURRENCY_EXAMPLE', 'Ejemplo:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca los datos de la nueva moneda');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que quiere eliminar esta moneda?');
-define('TEXT_INFO_HEADING_NEW_CURRENCY', 'Nueva Moneda');
-define('TEXT_INFO_HEADING_EDIT_CURRENCY', 'Editar Moneda');
-define('TEXT_INFO_HEADING_DELETE_CURRENCY', 'Eliminar Moneda');
-define('TEXT_INFO_SET_AS_DEFAULT', TEXT_SET_DEFAULT . ' (requiere una actualizaci&oacute;n manual de los cambios de moneda)');
-define('TEXT_INFO_CURRENCY_UPDATED', 'El valor de %s (%s) se ha actualizado via %s.');
-
-define('ERROR_REMOVE_DEFAULT_CURRENCY', 'Error: La moneda predeterminada no se puede eliminar. Seleccione otra moneda como predeterminada y vuelva a intentarlo.');
-define('ERROR_CURRENCY_INVALID', 'Error: El valor de %s (%s) no ha sido actualizado via %s. Compruebe la validez del c&oacute;digo.');
-define('WARNING_PRIMARY_SERVER_FAILED', 'Advertencia: El servidor primario ha fallado (%s) actualizando %s (%s) - probando con el servidor secundario.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/customers.php 2.3.1.src/admin/includes/languages/espanol/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/customers.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Clientes');
-define('HEADING_TITLE_SEARCH', 'Buscar:');
-
-define('TABLE_HEADING_FIRSTNAME', 'Nombre');
-define('TABLE_HEADING_LASTNAME', 'Apellido');
-define('TABLE_HEADING_ACCOUNT_CREATED', 'Cuenta Creada');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_DATE_ACCOUNT_CREATED', 'Cuenta Creada:');
-define('TEXT_DATE_ACCOUNT_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_INFO_DATE_LAST_LOGON', 'Ultima Visita:');
-define('TEXT_INFO_NUMBER_OF_LOGONS', 'N&uacute;mero de visitas:');
-define('TEXT_INFO_COUNTRY', 'Pa&iacute;s:');
-define('TEXT_INFO_NUMBER_OF_REVIEWS', 'N&uacute;mero de Comentarios:');
-define('TEXT_DELETE_INTRO', 'Seguro que desea eliminar este cliente?');
-define('TEXT_DELETE_REVIEWS', 'Eliminar %s comentario(s)');
-define('TEXT_INFO_HEADING_DELETE_CUSTOMER', 'Eliminar Cliente');
-define('TYPE_BELOW', 'Escriba debajo');
-define('PLEASE_SELECT', 'Seleccione');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/define_language.php 2.3.1.src/admin/includes/languages/espanol/define_language.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/define_language.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/define_language.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: define_language.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Editor de Idiomas');
-
-define('TEXT_FILE_DOES_NOT_EXIST', 'No existe fichero.');
-
-define('ERROR_FILE_NOT_WRITEABLE', 'Error: No puedo escribir sobre este fichero. Asigne correctamente permisos a: %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/file_manager.php 2.3.1.src/admin/includes/languages/espanol/file_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/file_manager.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/file_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: file_manager.php 1744 2007-12-21 02:22:21Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrador de Archivos');
-
-define('TABLE_HEADING_FILENAME', 'Nombre');
-define('TABLE_HEADING_SIZE', 'Tama&ntilde;o');
-define('TABLE_HEADING_PERMISSIONS', 'Permisos');
-define('TABLE_HEADING_USER', 'Usuario');
-define('TABLE_HEADING_GROUP', 'Grupo');
-define('TABLE_HEADING_LAST_MODIFIED', 'Modificado');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_HEADING_UPLOAD', 'Subir');
-define('TEXT_FILE_NAME', 'Nombre:');
-define('TEXT_FILE_SIZE', 'Tama&ntilde;o:');
-define('TEXT_FILE_CONTENTS', 'Contenido:');
-define('TEXT_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_NEW_FOLDER', 'Nueva Carpeta');
-define('TEXT_NEW_FOLDER_INTRO', 'Introduzca el nombre de la carpeta nueva:');
-define('TEXT_DELETE_INTRO', 'Seguro que desea eliminar este fichero?');
-define('TEXT_UPLOAD_INTRO', 'Seleccione los ficheros a subir.');
-
-define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Error: No puedo escribir en este directorio. Asigne los permisos adecuados a: %s');
-define('ERROR_FILE_NOT_WRITEABLE', 'Error: No puedo escribir en este fichero. Asigne los permisos adecuados a: %s');
-define('ERROR_DIRECTORY_NOT_REMOVEABLE', 'Error: No puedo eliminar el directorio. Asigne los permisos adecuados a: %s');
-define('ERROR_FILE_NOT_REMOVEABLE', 'Error: No puedo eliminar este fichero. Asigne los permisos adecuados a: %s');
-define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio: %s');
-define('ERROR_FILENAME_EMPTY', 'Error: Please enter a filename to store the contents in.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/geo_zones.php 2.3.1.src/admin/includes/languages/espanol/geo_zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/geo_zones.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/geo_zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,48 +0,0 @@
-<?php
-/*
-  $Id: geo_zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Zonas Fiscales');
-
-define('TABLE_HEADING_COUNTRY', 'Pa&iacute;s');
-define('TABLE_HEADING_COUNTRY_ZONE', 'Zona');
-define('TABLE_HEADING_TAX_ZONES', 'Zona Fiscal');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_HEADING_NEW_ZONE', 'Nueva Zona');
-define('TEXT_INFO_NEW_ZONE_INTRO', 'Introduzca los datos de la nueva zona');
-
-define('TEXT_INFO_HEADING_EDIT_ZONE', 'Editar Zona');
-define('TEXT_INFO_EDIT_ZONE_INTRO', 'Haga los cambios necesarios');
-
-define('TEXT_INFO_HEADING_DELETE_ZONE', 'Eliminar Zona');
-define('TEXT_INFO_DELETE_ZONE_INTRO', 'Seguro que quiere eliminar esta zona?');
-
-define('TEXT_INFO_HEADING_NEW_SUB_ZONE', 'Nueva Subzona');
-define('TEXT_INFO_NEW_SUB_ZONE_INTRO', 'Introduzca los datos de la subzona');
-
-define('TEXT_INFO_HEADING_EDIT_SUB_ZONE', 'Editar Subzona');
-define('TEXT_INFO_EDIT_SUB_ZONE_INTRO', 'Haga los cambios necesarios');
-
-define('TEXT_INFO_HEADING_DELETE_SUB_ZONE', 'Eliminar Subzona');
-define('TEXT_INFO_DELETE_SUB_ZONE_INTRO', 'Seguro que quiere eliminar esta subzona?');
-
-define('TEXT_INFO_DATE_ADDED', 'A&ntilde;adido el:');
-define('TEXT_INFO_LAST_MODIFIED', 'Modificado:');
-define('TEXT_INFO_ZONE_NAME', 'Nombre de la Zona:');
-define('TEXT_INFO_NUMBER_ZONES', 'N&uacute;mero de Zonas:');
-define('TEXT_INFO_ZONE_DESCRIPTION', 'Descripci&oacute;n:');
-define('TEXT_INFO_COUNTRY', 'Pa&iacute;s:');
-define('TEXT_INFO_COUNTRY_ZONE', 'Zona:');
-define('TYPE_BELOW', 'Todas las zonas');
-define('PLEASE_SELECT', 'Todas las zonas');
-define('TEXT_ALL_COUNTRIES', 'Todos los paises');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_back.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_back.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_back.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_back.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{Ҽ&O *]ʴikNJz4իXjzmׯ_~K,kg^[;7oղ;׬ݣݫZ߼~m^k*{Tǐ!_7qe˔O|9sȠ5
zfə1s^:5iGɞM5pe֍{ݻ}^(ȓ+9rΏG6ʏvνkYopϝ|y{_];˟Ͽ̀h&̓F(VhD<t ($<䨓;&$Γ;Ѝ89 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_backup.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_backup.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_backup.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_backup.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:hkJ>j)xXj݊ׯ`ÊKWҪ]6pʝK]V˷k߮	+x_ÁMWaÀ~<ٯeVi̹fy&ZgҜKtjҭQ{^=Uqsލn߼}=\p޽w?N8ȑߎ}9̯cw\oɇcN]Upӫ_zා^~z> g7h^c0`* .!N("衁Vu#$(5$x"v+
/8ba3".'#@)$.id7VmL6PF)\CPZ͖\v`)diVilp)t)P͞|矀*蠄jN:裐F*<#Ae馜rJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_cancel.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_cancel.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_cancel.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_cancel.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-ymh˟ )]ʴӧP^J5pXjʵW׾
ٳ߮=vmڴnͶe;ܺ=ԛ߿ V~#N|x0Ŏ!Gʘ-ysfΔ/,:sɟMUͫK^4er뾦;7~[8ő^נs.s֣[νu#~F|c7-ZדW޼ϿHm#h&HeF(VhHiv (76(,0(9N8Î@9$D.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_confirm.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_confirm.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_confirm.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_confirm.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aF    <t   M~~%WIpU}nlhݲöi   !   ,    F   IBihlBU[`x|h+ 8ШtJZRzYk g(|.mffmfmͻՖͼmm

	࿁נMEX` Ċ-f#ǌ0^pɓ(SW\M0cʜI͛8ɳϟ@
-J
H*]ʴӧP@@իXjʵ2P൬ٳg5P p`A@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_copy.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_copy.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_copy.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_copy.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-&O *]ʴӧP6=իXjʵk֣;Yf~V-۰i߲UKݫZ_o~7=*ǎAYƒ/?sgƞ'3渖C>
-׮ֲi߶oG	N|5܎#W.rɣ^hسgO=׾wl^yϫ_߭<nOϿl (hx66F(Bx9`v (N:,8O:DC4hBSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_copy_to.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_copy_to.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_copy_to.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_copy_to.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{&˟ )]ʴӧPJu4իXjʵWHFV7eϞM{,ڶjӚ]+w]Hyw߾|Wo`VRqA,rɗ+cμ3d͞1?dӤ#M-Аwmڷi֍ھw-lܸ]K9˟;:ΫcNihwy{xϋ_?k{gO?~G ^hHe6F(Hicfv衆76$h(,(9N4hÎ@9@.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_delete.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_delete.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_delete.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9u^c9tgў5ǴSמJJxJiʕ뵮`ÊK6ohӢڷںmmܸlҽW-Zvmp#NX0bG,YRq33͘?њAN-2klG.M4j԰oV
-op~|oō'WxsrN۵ׯ[};wڻ{ynJ_^nݮ?~}g>= (6&62T6Vhfb6 ($h(x9`0(4hN:@8O:DCH&BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_details.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_details.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_details.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_details.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA     <t   %W~M~IpU}nlhi   !     ,    A   `ABihl{JXyAmx|G,}R l:ШtJJ˪v˥^Y:&3]7hp v~~k

kkÈkk)C
-h 'JhÇ?IIkR\ɲ˗0ct͛8sɳOkJѣH*5zEPJJիXv`Ê$\]vB  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_edit.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_edit.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_edit.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_edit.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{μFО?[ʴӧN5
-զIiʵ׮׸J,פҪ]kjߺW.\oֽ˶﷤<ZaoNpōKN*˗eٲΝ1W,eʦ1%hr].۸q_
nݾ}޻8㷓r[μykϹA_V:̡OwνynËv/7nЛwޮO'ƿ (T6&626Vhfbx9`#$h(N:(48O:DC<BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_email.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_email.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_email.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_email.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-yeў?[ʴӧPF&jpXjʵW׾vMٳh][{,۶lѾuK7ݲI˷5썰*Tǐ#_<yc0K|9ȍ?~sӗߚ,rRpc˞}m6ڰqߎ{7޶m'F׌'ON97ΟK~zݲkν״lwgǮ'Fl (h66F(Bx9`v (N:,8O:DC4hBSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_file_manager.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_file_manager.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_file_manager.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_file_manager.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,        +7*\ȰÇ#Jh:ȱǏ CIɓ(Srfn :0cʜI& tɳϟ@
-JѣHPPҧPJJ8H*+U^j
ۓWV[˶۵ʝKmܺumn߽
GÄ!^̸qaŎClxrc˔3/Nk}-ОOw.
hҨYF=iխ_~tڢqwޒ+_~[s͟;NݹؗO.]{tۓG^}uջ/?˟M\}`7"X~ .H_a i
-
h( Hanl Ό3^C#86Hc;X>x#>8&#Cy@2	L27XbyMl^febjcg	f٦pY&dyX͟gh\ShhJ蠠
-(iNif*)j)vgꪬ꫰ƃ*imc뭸뮼+V6&6F+Vkiiv+kv9`+k+9Nl#<O:DEG,OLN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_insert.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_insert.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_insert.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_insert.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9a^I˟ )]ʴӧP]J)pXjʵp׾Պٳfv-ڶn]nڹlEԛ߿~0`E81ސLy5˕/Lϝ+YdɦA{r]ҙG4Nps㾶[7oxM<ȁGʭנ?[tұ[]{H{/Zy^=ym˯O|_?m (hT66F(B6fv rx9`c(,袊N:h88O:DC@)BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_invoice.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_invoice.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_invoice.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_invoice.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a?    <t   %W~M~IpU}nlhi   !   ,    ?   ABihl[JU^`x|ۅh+	) h:ШtJ>%uN@b^-~'~iddi

di÷ĻŶiii $ p@2$H@ÄJ,oŋ3jǏ CIIiD\ɲ˗0cd&͛8sɳOX$\@ѣH*]h	(hhJդ(`Aׯ`SH   ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_lock.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_lock.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_lock.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_lock.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9[^9Q?[SNJJժIizm֮^ÊK,٤Ҧ۵jݾ]+-۸qkoI	v5oVbÎ!/fxrRq1_,nΜ=g͜QN-ҤW-[s]uIno~|pǍ.^<r'Fܮ_ώ]{uܭon=|yة'ƞmw{׏'G66BxMVXaRdv aRڔh(,M͌4h87C:D<#A5N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_module_install.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_module_install.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_module_install.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_module_install.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89aL  h ƴ̴~%WM~@7`+2ȴIp˴ҼǪó^5U}Xzҿ:c*6Cz'+?in\~k=Cf
2$QL-.Y
2~(Wz6`>El-
-s%lBAaiRv33
-t%
-y'):h2\Vy	n#74=e@n@Fl@/ZTw4^9 <t                                                                        !  h ,    L   hd$Rgbgeg*3Lʻd'׾\%fg]
=>	
f&4eJ4h"3%b̸Q#F3^9˻,(% cBGZ؁ 	(s4g>Уu|	X+Tpצfz
Wg~-vmNu hI"An!CAWd
-ض,a`N "GVkvlΛ-ҧI~~mfZͻ-1vwb+On $KWn&yu1f~ݧ'G. 8_Ͼb}O>!`Ͽ ;^h`, 6F(afvR ch(,b.`#h8H9B#@)8F  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_module_remove.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_module_remove.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_module_remove.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_module_remove.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89aL  G ë~M~%WIpZZU}ѺƹĵXX,,99

7744˾RRKKMMi$$

((lhnCCÆ

ū <t                                                                                                                                                                           !  G ,    L   GC!
-FA
-		FDFDCF;E<<E:EE:[  *\`7ѠD/b8Q#Dˀ@@x`Dʜ)HM6qfΞ4I@#DD@byg՟3a*W	)bx׷punݻ9楻7߯nn^̘q /~|2ʐ-7޼xYϠCM3 E@k5m:ukԬK,طs^֣^dȗXμУKNسkνs5ӫ_Ͼ/	A<"8
-G ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_move.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_move.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_move.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_move.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-Z'xH*]ʴӧP
GիXjo`Ê{ofǚ=6,[iۖKQox{-o_~/kTǐ_{<Y2eȕ'WȠ7ӧ5S^4hb˞l۵om78ߺimȍ_;\9s͹EzǍvνkpﾖ{_];˟Ͽ̀h&̓F(VhD<t ($<䨓;&$Γ;Ѝ89 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_banner.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_banner.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_banner.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_banner.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ9Az)xXjʵׯ[KVҪ]˶۷p^KݵVݻڷkp࿂[aǇ.n<Yqdǌ[ƹsg9_<[iѦCVРQv-ulϸYǻwk[8ő'[Ε7xs߻?}aɉOo>޻ԙ?o]8˗m~}po?  Χ|Vq^PX!Vv蠄ar!(Z͊,xM/hX718-X:(w4(?X#-L6PF)e7VmcXf\v`Uٔihlpi6tix||
-E<j衈&袌6裐6*9Nf馜Γ;ѨjSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_category.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_category.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_category.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_category.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP^@XjʵׯWKkphӪ]˶۷p^Kn۪^vo^Wa;/>nyazwk=4hҢG>zuצ]kU龦{޼{x+<yrŏGwxn͡~:˹{t{W߻7=o?{w_{Uq5
-.r6XaR`Zv!~`UݤxM*HX7+,8c7>f1<H#=vbH&L6@BdUTiXf\v啈})fUechlpfUix|矀)9`c衈&袌6裐F<䨓;f馜v:O:DPDjꩧN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_country.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_country.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_country.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_country.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPw^Z)xXjʵׯ`ÊjhӪ]˶۷p}kݻx߻|8p%pcZF˖VFΙy
sѣ?{N5fb˞M{5۱o֭;޽m޵+
{w&؉}p紭OЏOO={߿7?Un (^S "` 7>N8fȍUt ~x͈RG&H'!"6<c@h6DiH&LyMPFiUTiXf\v`vi6dihll
-E<ix|矀)9N&袌Γ;ѤVjSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_currency.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_currency.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_currency.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_currency.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP^@Xjʵׯ`v&6^phӪ]˶۷pu{mn߽zWp}	>Xq`:freȋVƹ_Ϝu&hѥM:kР?V:5mثoq|7q{'/\ȡyrˇq鐳oo]8{.*'ϟ ן|
-x`U45rN8a^HnaB!~(brSU7,xMݼ"a1H0Y28#;7J6PF)TBY6Xf\v`)`V͙hlp)Uicx|矀P͡&袌6裐F*N:L馜v<#AjꩨJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_file.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_file.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_file.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_file.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ;]75gU>ǵׯ`ÊYfϪU5۷pʝKkv˗oM*a6|8cÂC~Xrb˕"VoChӥOԫ_6MZڮaޭU-wē#G.ysɇCu}>=挏SO~xÓ]Pp˿6>G_~g_H ~'V4@`RH^ȍn!rb~h͊,x,͋+228c1JU3Hc>hF&L6P26TViXf\v\j͘dihlZi#tix|P͠j衈&袌6N:<j饘f<#A*ꨤJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_folder.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_folder.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_folder.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_folder.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPd
- իXjʵׯ`^jhӪ]˶۷p㢽&w-ox߼|8pMܗƇ/K8qeŊzy_<w퍴hӦGw.
z5ϞQnzuTޭooἃ'G\9ʋGo>ynЫl\{͹k\<sQǾ=kდϿ{_|w{Tq
-^à@!F`2harZ!.HU7(5*_ݸ#a-8#6x#2(ce)ȝ*HH&LDR͔TViXf\nsM`fIU6dihllR͜tix|B6j衈&袌6裌C:饘fÎ@E$ꨤZ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_language.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_language.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_language.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_language.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ;*jQ iʵׯ`Êzmٳ\[˶۷pʝݻxbƷo _̗pᾃ^,X_ÉCN\2ej՛Ϡ
|siҦA>-:5jծSfݚЯq*|xoǓ#G^xs}_.xuyc9ȃGwܽG+・˧_}ן V4\:8XbhvfXjX"b͊,5-¸bb/Y.ޘ(481b*L6PF$VTiXf\v`vU6dihllb͜tix|B6j衈&袌6裌C:饘fÎ@E$ꨤZ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_newsletter.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_newsletter.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_newsletter.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_newsletter.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ::U)S jʵׯ`^uWd^
Ƕ۷pʝݶv귿_v0FbÁ/~̘2Ń+OUoC.hӥOԣ[n5٫Y;Uq68Ǐ_\8ϋ;'\zȅk{{Ӎcw֟Ǿ{⮂O5ׯ>
_~%UD(Pabnȍ~h!"!&8Wu0^㋋u#c0ژ#<ca4y6d7-.PF)TVPd\v`)dyU6hlp)p^͝x|矀*B6&袌6裐F*餐C:C馜vÎ@Edꩨ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_product.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_product.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_product.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_product.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPm^)xXjʵׯ`f&vlYVé]˶۷pʝݺwZ5<oFܷaǂ_È)~Uo}
tiҦC^ukҧW~-[uجc߶[Uq].Ǐ_\yq·G9ˑ_[)[Nŧw<⃻&~|o~Gx  Y̓\aJXVan8ar("#z8Uݴ5.a2(Y0Hc/X;c4($D"<6PBidTVieVm\v`yMdiVelp)t)U|矀*蠄*9`袌6裐F*餔V*<䨓;v駠:O:DPDꪫN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_tax_class.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_tax_class.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_tax_class.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_tax_class.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧAړ)xXjʵׯ`ÊzmphӪ]˶۷p}{mox}^`	ׯy;,0~zwk=4hҧIVuѫaNZlr_˭7-\xp+8pǑC_.7-?ν;vťwnY7ӫ߻7=Ͽ?~7_~' Y͂,6ȍN蠅R!fxaJVu5*`ݰ"/8#_6c:x؋8#C
-I-L6PSZ͕Xf\vY^djiU6hlp)pZ͝x|矀*B6&袌6裐F*餐C:C馜vÎ@Edꩨ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_tax_rate.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_tax_rate.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_tax_rate.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_tax_rate.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89av    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    v    +7*\ȰÇ#*$Ns 2jȱǏ CIn3ɲ˗0A#͛8sɳϟ@
-	`͡H*]ʔgqGJJ絠Oʵׯ`ÊKkff
Ƕ۷pʝKݹk߮	7_
Mqō#NxpÖ+gqčfF`Ӥjխ]Nulدmiڳknݻ+\s͟?O.:ͭ_;wݱ^w{>c'o( ^ 88`h`	x
-
7>`
-f͇ ^"7"b%~b&8b*h"+("1##MV)5BvCd9dCi$E`H:	dU6$O2yd_
-	dih*lfYm#tix)5zt
-hVj衈&袌6裐FhVTj饘f馜v駠iQͩꪬ꫰(*묮C:C뮼믬Γ;$ѱ&	N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_zone.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_zone.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_new_zone.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_new_zone.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPd
- իXjʵׯ`zٳhӪ]˶۷pRFݻ߮彦n_uLxໂ',bRFVFΖ9{ΌtiңQNib˞M[ܵٷm㎝޴-6pk+
{ɓ'wwC}ݹrOܵͣջ_/=ʭ rs
-_6 *hhTuv5`nXNX&fH8<H#U)DiH&L&IU6PF)TViXfXR͗`)dihB6p)tixxC:砄jÎ@E裐F)9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_orders.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_orders.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_orders.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_orders.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{ּF(LB]ӧPJ&)ժX.
ǵׯ`^u,ٳ^~[˖o⺍v-]u޵KwܶmzLp\ޮVqƃ/N\r2k|msΜŁgѧGo^-3kӡEiՠּ߿.8⾉'~s㾗rNׯ[禝{r^}|yK_^v{u/_=wg?=(6&5
-6F(!Kecfv衆Ki#$h(760(4h8(9N@)Î@9L.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_packingslip.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_packingslip.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_packingslip.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_packingslip.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a?    <t   %W~M~U}Ipnlhi   !   ,    ?   ABihl[JQ^`x|h+	) h:ШtJ>%uN-w${߬bnk{Nb{~}yy

yĸŷțɿɾ̸yy  OJ+0B&d	
bȱǏ Iɓ(SJ\Y2ρ0cʜI͛1$ɳϟ@
-*]ʴӧP. !C
RjtC"HKl
-	  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_preview.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_preview.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_preview.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_preview.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RמҌJjRHǵׯ`Ê;ٳhj
Ƕ۷pʝ;ݻxj57p}|x?6|ȏ-#ܗVo}MtiЧQ&zuh׭_>ҩqǞ[7₋&|qđ'xş+O.]:ЧG/r)S?Npoo;yϭkGܵ׿} _%8~7rsMfXv!rh!"fH"%j!a)rU74v#Ԉa:XB<G"$:8QViXf\vٍVۄ5bihlfZe#tix|V*蠄j衈&袌&*9`#餔Vj饘f馜v<䨓;jꩨ:O:DPD
-*묳N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_reset.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_reset.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_reset.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_reset.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-Z'xH*]ʴikNJEj4իXjzׯ`Fo΢MvmZlU,[k5꭯ߴz6Xp+LaFI|mʔ/[֜dϜ-WY\͠bfynˮa&(۸{oݽwxnoƼܞ;ṯW\;unF{mْW|7Ӿ7O[_m (hhT66F(Bh6fv rx9`c(,袊N:h88O:DC@)BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_restore.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_restore.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_restore.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_restore.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-Z'xH*]ӧPF5իX^ʵWFٲfϢMvlڱbE,\qzkvk~
-80|6,a"_,ɓ-gLʜ;_-2hl3=zѰ;m(n[wܾy;xpཌྷr[~m9sܚCo.sץW>;F~&<i͛E[z˳__~ϿFm#h&FeF(VhFiv (76(,0(9N8Î@9$D.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_save.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_save.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_save.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_save.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a?    <t   %W~M~IpU}nlhi   !   ,    ?   ABihl[JU^`x|ۅh+	) h:ШtJ>%uNKoznj|NO~	~
-hh

h²½Ŵhhh
-@ǐ߾BH,2jܘǏ Cɓ(S@\ɲKhȜI͛8s꤉E@
-JѣHvPJ-$\h5B  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_search.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_search.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_search.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_search.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9g^I( )]4޵PJJ)pXj
wmׯ`ÊՊٳh]S{mZnٶ56n]k݋ԛ߿{M0lx0HILY5ʗ/O֬ysʙ?yΖS{>绡MWF
-֭vݹq>qܒ+_rΓe޼tףSߎt^Wۦ/-{˟OHϿ (Hec&6蠂Hi#Vhf76 ($h((9N0(Î@9<.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_select.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_select.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_select.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_select.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҝמF}J&S jʵW׾KٮWé]˶۷kKݻn~˷߾_+x7ÇUL80Ō3np⿘^ƹϝ}iҜEV]gիA6ZWͻk'\nƏW><y澣K{t#^r{=x֯[Ͼ/񯯯_~߀]́&\`: R8Jx`^! 2xU7$h%`$^b`/؍-84Ψb(>)Di>^͒L6PF)TViWe\v`)d)Uڤlp)t)9`|矀*蠄*<䨓;6裐F:O:DPDf馛N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_send.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_send.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_send.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_send.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-wm̟ )]ʴӧPJu4իXjʵWHK쵳ĦEvlooᲅ+]Hw5Wo}#Rq#K|Mrʔ!_<YΠ!?mYϖ5VjғM6k=nݽkM6Rnȓ+O~MỵKˑvν{wۯ}o.<y彫}gsϿHe#h&HiF(Vh76v ($(9N,Î@9d8.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_send_mail.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_send_mail.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_send_mail.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_send_mail.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-wm̟ )]ʴӧPJu4իXjʵWHK쵳ĦEvlooᲅ+]Hw5Wo}#Rq#K|Mrʔ!_<YΠ!?mYϖ5VjғM6k=nݽkM6Rnȓ+O~MỵKˑvν{wۯ}o.<y彫}gsϿHe#h&HiF(Vh76v ($(9N,Î@9d8.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_unlock.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_unlock.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_unlock.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_unlock.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:(k@ޔjQ iʵkk^Uٳhӊ۷p^K7\u˷.oaÀ_paĎfx1cʐC^gBMhӦE.jקa:ukڳ
8qƇwș/]s؅Ξq
?_ޜν=Vp˟M~~'`|槠|XqFx̓q3!Z^ aj!Vݴ0vs-*V2H㍆85<c<dHbL61	Sb͕Xf\vW^drU6hlp)pb͝x|矀*B6&袌6裐F*餐C:C馜vÎ@Edꩨ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_update_currencies.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_update_currencies.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_update_currencies.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_update_currencies.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89av    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    v    +7*\ȰÇ#*$Ns 2jȱǏ CIn3ɲ˗0A#͛8sɳϟ@
-	`͡H*]ʔgqG"fԫ7)x`Ê+ٳd͢]˶xjߒݻx^7޾/^)^k7~rȒ+Lsʖgxњ?c.XWocvvڵo=7l޺{ܶpo'
7K.Zu֥g}ݯS^xo;zwN޼ų|}w~7W$5
- 
BNaf
^衅RHa^q׬M-1c/#:أ=bC84ɍW4d75SBTRQZ95OYW)%YVi&a6dp)tix6|矀*蠄j衈U66裐F*餔Vj饘N6v駠*ꨤjꩨZ9`꫰0*무j뭸kN:*kÎ@IF+mBSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_update.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_update.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_update.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_update.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-eyЗ?[ʴkNJuUIiʵ뵮`Æ*lؤ^[{-7oٶmnܵjŻ7/oI	Z
#&aō;N[Rq3Ys̜A{9thѣKLZgԤ5mڶ1'o޾}=\8㿃#'8Iq&]:u֧Wn;޳oV6}7쯽w^r㷷 (h`R$6F`RThfvaRڄ($h(XM͋0(4h3C:鼃@i<#A%N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_upload.gif 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_upload.gif
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/images/buttons/button_upload.gif	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/images/buttons/button_upload.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{P8)]ʴӧJAJuO jʵ׬׾귳hӪ={oo}떭ݶk꭯߿]<oᶆE1"KLY5ʗ%gʠACmɟ5[>MUpc˞=8۱qm[7߿rNq׸%ޖy˗njسkvܯwjڭ_Ͼ{WɟO5 (hWi6F(76fv r(9N(Î@9$4.DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/index.php 2.3.1.src/admin/includes/languages/espanol/index.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/index.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/index.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,38 +0,0 @@
-<?php
-/*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Seleccione una opci&oacute;n..');
-
-define('BOX_TITLE_ORDERS', 'Pedidos');
-define('BOX_TITLE_STATISTICS', 'Estadisticas');
-
-define('BOX_ENTRY_SUPPORT_SITE', 'Soporte');
-define('BOX_ENTRY_SUPPORT_FORUMS', 'Foros');
-define('BOX_ENTRY_CONTRIBUTIONS', 'M&oacute;dulos');
-
-define('BOX_ENTRY_CUSTOMERS', 'Clientes:');
-define('BOX_ENTRY_PRODUCTS', 'Productos:');
-define('BOX_ENTRY_REVIEWS', 'Comentarios:');
-
-define('BOX_CONNECTION_PROTECTED', 'Esta protegido por una conexi&oacute;n SSL %s.');
-define('BOX_CONNECTION_UNPROTECTED', '<font color="#ff0000">No</font> esta protegido por una conexi&oacute;n segura SSL.');
-define('BOX_CONNECTION_UNKNOWN', 'desconocido');
-
-define('CATALOG_CONTENTS', 'Contenido');
-
-define('REPORTS_PRODUCTS', 'Productos');
-define('REPORTS_ORDERS', 'Pedidos');
-
-define('TOOLS_BACKUP', 'Copias');
-define('TOOLS_BANNERS', 'Banners');
-define('TOOLS_FILES', 'Ficheros');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/invoice.php 2.3.1.src/admin/includes/languages/espanol/invoice.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/invoice.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/invoice.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-/*
-  $Id: invoice.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_COMMENTS', 'Comentario');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Modelo');
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_TAX', 'Impuestos');
-define('TABLE_HEADING_TOTAL', 'Total');
-define('TABLE_HEADING_PRICE_EXCLUDING_TAX', 'Precio (ex)');
-define('TABLE_HEADING_PRICE_INCLUDING_TAX', 'Precio (inc)');
-define('TABLE_HEADING_TOTAL_EXCLUDING_TAX', 'Total (ex)');
-define('TABLE_HEADING_TOTAL_INCLUDING_TAX', 'Total (inc)');
-
-define('ENTRY_SOLD_TO', 'VENDIDO A:');
-define('ENTRY_SHIP_TO', 'ENVIAR A:');
-define('ENTRY_PAYMENT_METHOD', 'M&eacute;todo de Pago:');
-define('ENTRY_SUB_TOTAL', 'Subtotal:');
-define('ENTRY_TAX', 'Impuestos:');
-define('ENTRY_SHIPPING', 'Portes:');
-define('ENTRY_TOTAL', 'Total:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/languages.php 2.3.1.src/admin/includes/languages/espanol/languages.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/languages.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/languages.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: languages.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Idiomas');
-
-define('TABLE_HEADING_LANGUAGE_NAME', 'Idioma');
-define('TABLE_HEADING_LANGUAGE_CODE', 'C&oacute;digo');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_LANGUAGE_NAME', 'Nombre:');
-define('TEXT_INFO_LANGUAGE_CODE', 'C&oacute;digo:');
-define('TEXT_INFO_LANGUAGE_IMAGE', 'Imagen:');
-define('TEXT_INFO_LANGUAGE_DIRECTORY', 'Directorio:');
-define('TEXT_INFO_LANGUAGE_SORT_ORDER', 'Orden:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca los datos del nuevo idioma');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que quiere eliminar este idioma?');
-define('TEXT_INFO_HEADING_NEW_LANGUAGE', 'Nuevo Idioma');
-define('TEXT_INFO_HEADING_EDIT_LANGUAGE', 'Editar Idioma');
-define('TEXT_INFO_HEADING_DELETE_LANGUAGE', 'Eliminar Idioma');
-
-define('ERROR_REMOVE_DEFAULT_LANGUAGE', 'Error: El idioma seleccionado por defecto no se puede eliminar. Seleccione otro idioma predeterminado y pruebe de nuevo.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/login.php 2.3.1.src/admin/includes/languages/espanol/login.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/login.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/login.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrator Login');
-
-define('TEXT_USERNAME', 'Username:');
-define('TEXT_PASSWORD', 'Password:');
-
-define('TEXT_CREATE_FIRST_ADMINISTRATOR', 'No administrators exist in the database table. Please fill in the following information to create the first administrator. (A manual login is still required after this step)');
-
-define('ERROR_INVALID_ADMINISTRATOR', 'Error: Invalid administrator login attempt.');
-
-define('BUTTON_LOGIN', 'Login');
-define('BUTTON_CREATE_ADMINISTRATOR', 'Create Administrator');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/mail.php 2.3.1.src/admin/includes/languages/espanol/mail.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/mail.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/mail.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: mail.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Enviar Email a Cliente(s)');
-
-define('TEXT_CUSTOMER', 'Cliente:');
-define('TEXT_SUBJECT', 'Asunto:');
-define('TEXT_FROM', 'Desde:');
-define('TEXT_MESSAGE', 'Mensaje:');
-define('TEXT_SELECT_CUSTOMER', 'Seleccionar Cliente');
-define('TEXT_ALL_CUSTOMERS', 'Todos los Clientes');
-define('TEXT_NEWSLETTER_CUSTOMERS', 'Todos los Suscritos');
-
-define('NOTICE_EMAIL_SENT_TO', 'Aviso: Email enviado a: %s');
-define('ERROR_NO_CUSTOMER_SELECTED', 'Error: No ha seleccionado ningun cliente.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/manufacturers.php 2.3.1.src/admin/includes/languages/espanol/manufacturers.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/manufacturers.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/manufacturers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: manufacturers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Fabricantes');
-
-define('TABLE_HEADING_MANUFACTURERS', 'Fabricantes');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_HEADING_NEW_MANUFACTURER', 'Nuevo Fabricante');
-define('TEXT_HEADING_EDIT_MANUFACTURER', 'Editar Fabricante');
-define('TEXT_HEADING_DELETE_MANUFACTURER', 'Eliminar Fabricante');
-
-define('TEXT_MANUFACTURERS', 'Fabricantes:');
-define('TEXT_DATE_ADDED', 'A&ntilde;adido el:');
-define('TEXT_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_PRODUCTS', 'Productos:');
-define('TEXT_IMAGE_NONEXISTENT', 'NO EXISTE IMAGEN');
-
-define('TEXT_NEW_INTRO', 'Introduzca los datos del nuevo fabricante');
-define('TEXT_EDIT_INTRO', 'Haga los cambios necesarios');
-
-define('TEXT_MANUFACTURERS_NAME', 'Nombre del Fabricante:');
-define('TEXT_MANUFACTURERS_IMAGE', 'Imagen del Fabricante:');
-define('TEXT_MANUFACTURERS_URL', 'URL del Fabricante:');
-
-define('TEXT_DELETE_INTRO', 'Seguro que desea eliminar este fabricante?');
-define('TEXT_DELETE_IMAGE', 'Eliminar imagen del fabricante?');
-define('TEXT_DELETE_PRODUCTS', 'Quiere borrar tambien todos los productos de este fabricante? (incluyendo comentarios, ofertas y los productos proximamente disponibles)');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>ADVERTENCIA:</b> Todavia hay productos que pertenecen a este fabricante!');
-
-define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Error: No puedo escribir en este directorio. Asigner permisos de escritura en: %s');
-define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Error: No existe el directorio: %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/index/customers.php 2.3.1.src/admin/includes/languages/espanol/modules/index/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/index/customers.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/modules/index/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define(ADMIN_INDEX_CUSTOMERS_TITLE, 'Customers');
-define(ADMIN_INDEX_CUSTOMERS_DATE, 'Date');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/index/orders.php 2.3.1.src/admin/includes/languages/espanol/modules/index/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/index/orders.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/modules/index/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('ADMIN_INDEX_ORDERS_TITLE', 'Orders');
-define('ADMIN_INDEX_ORDERS_TOTAL', 'Total');
-define('ADMIN_INDEX_ORDERS_DATE', 'Date');
-define('ADMIN_INDEX_ORDERS_STATUS', 'Status');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/newsletters/newsletter.php 2.3.1.src/admin/includes/languages/espanol/modules/newsletters/newsletter.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/newsletters/newsletter.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/modules/newsletters/newsletter.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-<?php
-/*
-  $Id: newsletter.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_COUNT_CUSTOMERS', 'Clientes que recibir&aacute;n el bolet&iacute;n: %s');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/newsletters/product_notification.php 2.3.1.src/admin/includes/languages/espanol/modules/newsletters/product_notification.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/modules/newsletters/product_notification.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/modules/newsletters/product_notification.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: product_notification.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_COUNT_CUSTOMERS', 'Clientes que recibir&aacute; el bolet&iacute;n: %s');
-define('TEXT_PRODUCTS', 'Productos');
-define('TEXT_SELECTED_PRODUCTS', 'Productos Seleccionados');
-
-define('JS_PLEASE_SELECT_PRODUCTS', 'Seleccione algunos productos.');
-
-define('BUTTON_GLOBAL', 'Global');
-define('BUTTON_SELECT', '>>>');
-define('BUTTON_UNSELECT', '<<<');
-define('BUTTON_SUBMIT', 'Enviar');
-define('BUTTON_CANCEL', 'Cancelar');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/modules.php 2.3.1.src/admin/includes/languages/espanol/modules.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/modules.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/modules.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: modules.php 1802 2008-01-11 16:59:17Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE_MODULES_PAYMENT', 'M&oacute;dulos de Pago');
-define('HEADING_TITLE_MODULES_SHIPPING', 'M&oacute;dulos de Envio');
-define('HEADING_TITLE_MODULES_ORDER_TOTAL', 'M&oacute;dules de Totalizaci&oacute;n');
-
-define('TABLE_HEADING_MODULES', 'M&oacute;dulos');
-define('TABLE_HEADING_SORT_ORDER', 'Orden');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_VERSION', 'Versi&oacute;n:');
-define('TEXT_INFO_ONLINE_STATUS', 'online status');
-
-define('TEXT_MODULE_DIRECTORY', 'Directorio de m&oacute;dulos:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/newsletters.php 2.3.1.src/admin/includes/languages/espanol/newsletters.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/newsletters.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/newsletters.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrador de Boletines');
-
-define('TABLE_HEADING_NEWSLETTERS', 'Boletines');
-define('TABLE_HEADING_SIZE', 'Tama&ntilde;o');
-define('TABLE_HEADING_MODULE', 'Modulo');
-define('TABLE_HEADING_SENT', 'Enviado');
-define('TABLE_HEADING_STATUS', 'Estado');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_NEWSLETTER_MODULE', 'Modulo:');
-define('TEXT_NEWSLETTER_TITLE', 'T&iacute;tulo del Bolet&iacute;n:');
-define('TEXT_NEWSLETTER_CONTENT', 'Contenido:');
-
-define('TEXT_NEWSLETTER_DATE_ADDED', 'A&ntilde;adido el:');
-define('TEXT_NEWSLETTER_DATE_SENT', 'Fecha de Env&iacute;o:');
-
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que quiere eliminar este bolet&iacute;n?');
-
-define('TEXT_PLEASE_WAIT', 'Por favor espere .. enviando emails ..<br><br>No interrumpa este proceso!');
-define('TEXT_FINISHED_SENDING_EMAILS', 'Finalizado el env&iacute;o de emails!');
-
-define('ERROR_NEWSLETTER_TITLE', 'Error: Se requiere un t&iacute;tulo para el bolet&iacute;n');
-define('ERROR_NEWSLETTER_MODULE', 'Error: Se requiere un modulo para el boletin');
-define('ERROR_REMOVE_UNLOCKED_NEWSLETTER', 'Error: Bloquee el bolet&iacute;n antes de eliminarlo.');
-define('ERROR_EDIT_UNLOCKED_NEWSLETTER', 'Error: Bloquee el bolet&iacute;n antes de editarlo.');
-define('ERROR_SEND_UNLOCKED_NEWSLETTER', 'Error: Bloquee el bolet&iacute;n antes de enviarlo.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/orders.php 2.3.1.src/admin/includes/languages/espanol/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/orders.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,79 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Pedidos');
-define('HEADING_TITLE_SEARCH', 'Pedido:');
-define('HEADING_TITLE_STATUS', 'Estado:');
-
-define('TABLE_HEADING_COMMENTS', 'Comentarios');
-define('TABLE_HEADING_CUSTOMERS', 'Clientes');
-define('TABLE_HEADING_ORDER_TOTAL', 'Total Pedido');
-define('TABLE_HEADING_DATE_PURCHASED', 'Fecha de Compra');
-define('TABLE_HEADING_STATUS', 'Estado');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-define('TABLE_HEADING_QUANTITY', 'Cantidad');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Modelo');
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_TAX', 'Impuesto');
-define('TABLE_HEADING_TOTAL', 'Total');
-define('TABLE_HEADING_PRICE_EXCLUDING_TAX', 'Precio (ex)');
-define('TABLE_HEADING_PRICE_INCLUDING_TAX', 'Precio (inc)');
-define('TABLE_HEADING_TOTAL_EXCLUDING_TAX', 'Total (ex)');
-define('TABLE_HEADING_TOTAL_INCLUDING_TAX', 'Total (inc)');
-
-define('TABLE_HEADING_CUSTOMER_NOTIFIED', 'Cliente Notificado');
-define('TABLE_HEADING_DATE_ADDED', 'A&ntilde;adido el');
-
-define('ENTRY_CUSTOMER', 'Cliente:');
-define('ENTRY_SOLD_TO', 'Cliente:');
-define('ENTRY_DELIVERY_TO', 'Enviar A:');
-define('ENTRY_SHIP_TO', 'Enviar A:');
-define('ENTRY_SHIPPING_ADDRESS', 'Direcci&oacute; de Env&iacute;o:');
-define('ENTRY_BILLING_ADDRESS', 'Direcci&oacute; de Facturaci&oacute;n:');
-define('ENTRY_PAYMENT_METHOD', 'M&eacute;todo de Pago:');
-define('ENTRY_CREDIT_CARD_TYPE', 'Tipo Tarjeta Credito:');
-define('ENTRY_CREDIT_CARD_OWNER', 'Titular Tarjeta Credito:');
-define('ENTRY_CREDIT_CARD_NUMBER', 'N&uacute;mero Tarjeta Credito:');
-define('ENTRY_CREDIT_CARD_EXPIRES', 'Caducidad Tarjeta Credito:');
-define('ENTRY_SUB_TOTAL', 'Subtotal:');
-define('ENTRY_TAX', 'Impuestos:');
-define('ENTRY_SHIPPING', 'Gastos de Env&iacute;o:');
-define('ENTRY_TOTAL', 'Total:');
-define('ENTRY_DATE_PURCHASED', 'Fecha de Compra:');
-define('ENTRY_STATUS', 'Estado:');
-define('ENTRY_DATE_LAST_UPDATED', 'Ultima Modificaci&oacute;n:');
-define('ENTRY_NOTIFY_CUSTOMER', 'Notificar Cliente:');
-define('ENTRY_NOTIFY_COMMENTS', 'A&ntilde;adir Comentarios:');
-define('ENTRY_PRINTABLE', 'Imprimir Factura');
-
-define('TEXT_INFO_HEADING_DELETE_ORDER', 'Eliminar Pedido');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que quiere eliminar este pedido?');
-define('TEXT_INFO_RESTOCK_PRODUCT_QUANTITY', 'A&ntilde;adir productos al almacen');
-define('TEXT_DATE_ORDER_CREATED', 'A&ntilde;adido el:');
-define('TEXT_DATE_ORDER_LAST_MODIFIED', 'Modificado:');
-define('TEXT_INFO_PAYMENT_METHOD', 'M&eacute;todo de Pago:');
-
-define('TEXT_ALL_ORDERS', 'Todos');
-define('TEXT_NO_ORDER_HISTORY', 'No hay hist&oacute;rico');
-
-define('EMAIL_SEPARATOR', '------------------------------------------------------');
-define('EMAIL_TEXT_SUBJECT', 'Actualizaci&oacute;n del Pedido');
-define('EMAIL_TEXT_ORDER_NUMBER', 'N&uacute;mero de Pedido:');
-define('EMAIL_TEXT_INVOICE_URL', 'Pedido Detallado:');
-define('EMAIL_TEXT_DATE_ORDERED', 'Fecha del Pedido:');
-define('EMAIL_TEXT_STATUS_UPDATE', 'Su pedido ha sido actualizado al siguiente estado.' . "\n\n" . 'Nuevo estado: %s' . "\n\n" . 'Por favor responda a este email si tiene alguna pregunta que hacer.' . "\n");
-define('EMAIL_TEXT_COMMENTS_UPDATE', 'Los comentarios sobre su pedido son' . "\n\n%s\n\n");
-
-define('ERROR_ORDER_DOES_NOT_EXIST', 'Error: No existe pedido.');
-define('SUCCESS_ORDER_UPDATED', 'Exito: Pedido actualizado correctamente.');
-define('WARNING_ORDER_NOT_UPDATED', 'Advertencia: No se ha actualizado el pedido, no habia nada que actualizar.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/orders_status.php 2.3.1.src/admin/includes/languages/espanol/orders_status.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/orders_status.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/orders_status.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,34 +0,0 @@
-<?php
-/*
-  $Id: orders_status.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Estado Pedidos');
-
-define('TABLE_HEADING_ORDERS_STATUS', 'Estado Pedidos');
-define('TABLE_HEADING_PUBLIC_STATUS', 'Public Status');
-define('TABLE_HEADING_DOWNLOADS_STATUS', 'Downloads Status');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_ORDERS_STATUS_NAME', 'Estado Pedido:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca un nombre y los datos del nuevo estado de pedido');
-define('TEXT_INFO_DELETE_INTRO', 'Esta seguro que desea suprimir permanentemente este estado de pedido?');
-define('TEXT_INFO_HEADING_NEW_ORDERS_STATUS', 'Nuevo Estado Pedido');
-define('TEXT_INFO_HEADING_EDIT_ORDERS_STATUS', 'Editar Estado Pedido');
-define('TEXT_INFO_HEADING_DELETE_ORDERS_STATUS', 'Eliminar Estado Pedido');
-
-define('TEXT_SET_PUBLIC_STATUS', 'Show the order to the customer at this order status level');
-define('TEXT_SET_DOWNLOADS_STATUS', 'Allow downloads of virtual products at this order status level');
-
-define('ERROR_REMOVE_DEFAULT_ORDER_STATUS', 'Error: El estado de pedido por defecto no se puede eliminar. Establezca otro estado de pedido predeterminado y pruebe de nuevo.');
-define('ERROR_STATUS_USED_IN_ORDERS', 'Error: Este estado de pedido esta siendo usado actualmente.');
-define('ERROR_STATUS_USED_IN_HISTORY', 'Error: Este estado de pedido se esta usando en algun hist&oacute;rico de algun pedido.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/packingslip.php 2.3.1.src/admin/includes/languages/espanol/packingslip.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/packingslip.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/packingslip.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: packingslip.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_COMMENTS', 'Comentario');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Modelo');
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-
-define('ENTRY_SOLD_TO', 'VENDIDO A:');
-define('ENTRY_SHIP_TO', 'ENVIAR A:');
-define('ENTRY_PAYMENT_METHOD', 'M&eacute;todo de Pago:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/products_attributes.php 2.3.1.src/admin/includes/languages/espanol/products_attributes.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/products_attributes.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/products_attributes.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-<?php
-/*
-  $Id: products_attributes.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE_OPT', 'Opciones del Producto');
-define('HEADING_TITLE_VAL', 'Valores para Opciones');
-define('HEADING_TITLE_ATRIB', 'Atributos');
-
-define('TABLE_HEADING_ID', 'ID');
-define('TABLE_HEADING_PRODUCT', 'Nombre del Producto');
-define('TABLE_HEADING_OPT_NAME', 'Nombre de la Opci&oacute;n');
-define('TABLE_HEADING_OPT_VALUE', 'Valor de la Opci&oacute;n');
-define('TABLE_HEADING_OPT_PRICE', 'Precio');
-define('TABLE_HEADING_OPT_PRICE_PREFIX', 'Prefijo');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-define('TABLE_HEADING_DOWNLOAD', 'Productos descargables:');
-define('TABLE_TEXT_FILENAME', 'Nombre del Fichero:');
-define('TABLE_TEXT_MAX_DAYS', 'Dias de caducidad:');
-define('TABLE_TEXT_MAX_COUNT', 'N&uacute;mero m&aacute;ximo de descargas:');
-
-define('MAX_ROW_LISTS_OPTIONS', 10);
-
-define('TEXT_WARNING_OF_DELETE', 'Esta opcion tiene productos y valores - no es seguro eliminarla.');
-define('TEXT_OK_TO_DELETE', 'Esta opcion no esta en uso - es seguro eliminarla.');
-define('TEXT_OPTION_ID', 'ID de Opci&oacute;n');
-define('TEXT_OPTION_NAME', 'Nombre de Opci&oacute;n');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/products_expected.php 2.3.1.src/admin/includes/languages/espanol/products_expected.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/products_expected.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/products_expected.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: products_expected.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Pr&oacute;ximamente');
-
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_DATE_EXPECTED', 'Fecha Lanzamiento');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_DATE_EXPECTED', 'Fecha Lanzamiento:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/reviews.php 2.3.1.src/admin/includes/languages/espanol/reviews.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/reviews.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Comentarios');
-
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_RATING', 'Evaluaci&oacute;n');
-define('TABLE_HEADING_DATE_ADDED', 'Fecha Alta');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('ENTRY_PRODUCT', 'Producto:');
-define('ENTRY_FROM', 'De:');
-define('ENTRY_DATE', 'Fecha:');
-define('ENTRY_REVIEW', 'Comentario:');
-define('ENTRY_REVIEW_TEXT', '<small><font color="#ff0000"><b>NOTA:</b></font></small>&nbsp;no se traduce el c&oacute;digo HTML!&nbsp;');
-define('ENTRY_RATING', 'Evaluacion:');
-
-define('TEXT_INFO_DELETE_REVIEW_INTRO', 'Seguro que desea eliminar este comentario?');
-
-define('TEXT_INFO_DATE_ADDED', 'Fecha Alta:');
-define('TEXT_INFO_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_INFO_IMAGE_NONEXISTENT', 'NO EXISTE IMAGEN');
-define('TEXT_INFO_REVIEW_AUTHOR', 'Autor:');
-define('TEXT_INFO_REVIEW_RATING', 'Evaluaci&oacute;n:');
-define('TEXT_INFO_REVIEW_READ', 'Leer:');
-define('TEXT_INFO_REVIEW_SIZE', 'Tama&ntilde;o:');
-define('TEXT_INFO_PRODUCTS_AVERAGE_RATING', 'Evaluacion Media:');
-
-define('TEXT_OF_5_STARS', '%s de 5 Estrellas!');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>BUENO</b></font></small>');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>MALO</b></font></small>');
-define('TEXT_INFO_HEADING_DELETE_REVIEW', 'Eliminar Comentario');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/server_info.php 2.3.1.src/admin/includes/languages/espanol/server_info.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/server_info.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/server_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: server_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Informaci&oacute;n del Servidor');
-
-define('TITLE_SERVER_HOST', 'Nombre del Servidor:');
-define('TITLE_SERVER_OS', 'Sistema Operativo del Servidor:');
-define('TITLE_SERVER_DATE', 'Fecha en el Servidor:');
-define('TITLE_SERVER_UP_TIME', 'Encendido desde:');
-define('TITLE_HTTP_SERVER', 'Servidor HTTP:');
-define('TITLE_PHP_VERSION', 'Version PHP:');
-define('TITLE_ZEND_VERSION', 'Zend:');
-define('TITLE_DATABASE_HOST', 'Servidor de Base de Datos:');
-define('TITLE_DATABASE', 'Base de Datos:');
-define('TITLE_DATABASE_DATE', 'Fecha de la Base de Datos:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/specials.php 2.3.1.src/admin/includes/languages/espanol/specials.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/specials.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/specials.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-<?php
-/*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Ofertas');
-
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_PRODUCTS_PRICE', 'Precio');
-define('TABLE_HEADING_STATUS', 'Estado');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_SPECIALS_PRODUCT', 'Producto:');
-define('TEXT_SPECIALS_SPECIAL_PRICE', 'Precio de Oferta:');
-define('TEXT_SPECIALS_EXPIRES_DATE', 'Fecha de Caducidad:');
-define('TEXT_SPECIALS_PRICE_TIP', '<b>Notas:</b><ul><li>Puedes introducir un porcentaje de reduccion del precio del producto, por ejemplo: <b>20%</b></li><li>Si por el contrario, introduces un precio de oferta debes de usar el punto como separador decimal \'.\' (punto decimal), por ejemplo: <b>49.99</b></li><li>Deja la fecha de caducidad vacia si no quieres caducidad</li></ul>');
-
-define('TEXT_INFO_DATE_ADDED', 'Fecha Alta:');
-define('TEXT_INFO_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_INFO_NEW_PRICE', 'Nuevo Precio:');
-define('TEXT_INFO_ORIGINAL_PRICE', 'Precio Original:');
-define('TEXT_INFO_PERCENTAGE', 'Porcentaje:');
-define('TEXT_INFO_EXPIRES_DATE', 'Fecha de Caducidad:');
-define('TEXT_INFO_STATUS_CHANGE', 'Cambio de Estado:');
-
-define('TEXT_INFO_HEADING_DELETE_SPECIALS', 'Eliminar Oferta');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que desea eliminar este precio de oferta?');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_customers.php 2.3.1.src/admin/includes/languages/espanol/stats_customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_customers.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/stats_customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Total de Pedidos por Cliente');
-
-define('TABLE_HEADING_NUMBER', 'N&uacute;mero');
-define('TABLE_HEADING_CUSTOMERS', 'Clientes');
-define('TABLE_HEADING_TOTAL_PURCHASED', 'Total Pedido');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_products_purchased.php 2.3.1.src/admin/includes/languages/espanol/stats_products_purchased.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_products_purchased.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/stats_products_purchased.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_products_purchased.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Productos Mas Comprados');
-
-define('TABLE_HEADING_NUMBER', 'N&uacute;mero');
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_PURCHASED', 'Comprados');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_products_viewed.php 2.3.1.src/admin/includes/languages/espanol/stats_products_viewed.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/stats_products_viewed.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/stats_products_viewed.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_products_viewed.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Productos Mas Vistos');
-
-define('TABLE_HEADING_NUMBER', 'N&uacute;mero');
-define('TABLE_HEADING_PRODUCTS', 'Productos');
-define('TABLE_HEADING_VIEWED', 'Visto');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/tax_classes.php 2.3.1.src/admin/includes/languages/espanol/tax_classes.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/tax_classes.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/tax_classes.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: tax_classes.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Tipos de Impuesto');
-
-define('TABLE_HEADING_TAX_CLASSES', 'Tipos de Impuesto');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_CLASS_TITLE', 'Nombre del Impuesto:');
-define('TEXT_INFO_CLASS_DESCRIPTION', 'Descripci&oacute;n:');
-define('TEXT_INFO_DATE_ADDED', 'Creado:');
-define('TEXT_INFO_LAST_MODIFIED', 'Modificado:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca los datos del nuevo tipo de impuesto');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que desea eliminar este tipo de impuesto?');
-define('TEXT_INFO_HEADING_NEW_TAX_CLASS', 'Nuevo Tipo de Impuesto');
-define('TEXT_INFO_HEADING_EDIT_TAX_CLASS', 'Editar Tipo de Impuesto');
-define('TEXT_INFO_HEADING_DELETE_TAX_CLASS', 'Eliminar Tipo de Impuesto');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/tax_rates.php 2.3.1.src/admin/includes/languages/espanol/tax_rates.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/tax_rates.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/tax_rates.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,36 +0,0 @@
-<?php
-/*
-  $Id: tax_rates.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Porcentajes de Impuestos');
-
-define('TABLE_HEADING_TAX_RATE_PRIORITY', 'Prioridad');
-define('TABLE_HEADING_TAX_CLASS_TITLE', 'Porcentajes');
-define('TABLE_HEADING_COUNTRIES_NAME', 'Pa&iacute;s');
-define('TABLE_HEADING_ZONE', 'Zona');
-define('TABLE_HEADING_TAX_RATE', 'Porcentaje');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_DATE_ADDED', 'Fecha de Alta:');
-define('TEXT_INFO_LAST_MODIFIED', 'Ultima Modificaci&oacute;n:');
-define('TEXT_INFO_CLASS_TITLE', 'Nombre del Porcentaje:');
-define('TEXT_INFO_COUNTRY_NAME', 'Pa&iacute;s:');
-define('TEXT_INFO_ZONE_NAME', 'Zona:');
-define('TEXT_INFO_TAX_RATE', 'Porcentaje (%):');
-define('TEXT_INFO_TAX_RATE_PRIORITY', 'Impuestos con la misma prioridad se suman, los dem&aacute;s se aplican sucesivamente.<br><br>Prioridad:');
-define('TEXT_INFO_RATE_DESCRIPTION', 'Descripci&oacute;n:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca un nombre y los datos del nuevo porcentaje');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que desea eliminar este porcentaje?');
-define('TEXT_INFO_HEADING_NEW_TAX_RATE', 'Nuevo Porcentaje');
-define('TEXT_INFO_HEADING_EDIT_TAX_RATE', 'Editar Porcentaje');
-define('TEXT_INFO_HEADING_DELETE_TAX_RATE', 'Eliminar Porcentaje');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/whos_online.php 2.3.1.src/admin/includes/languages/espanol/whos_online.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/whos_online.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/whos_online.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: whos_online.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Usuarios Conectados');
-
-define('TABLE_HEADING_ONLINE', 'Conectado');
-define('TABLE_HEADING_CUSTOMER_ID', 'ID');
-define('TABLE_HEADING_FULL_NAME', 'Nombre');
-define('TABLE_HEADING_IP_ADDRESS', 'Direccion IP');
-define('TABLE_HEADING_ENTRY_TIME', 'Hora Entrada');
-define('TABLE_HEADING_LAST_CLICK', 'Ultimo Click');
-define('TABLE_HEADING_LAST_PAGE_URL', 'Ultima URL');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-define('TABLE_HEADING_SHOPPING_CART', 'Cesta del Usuario');
-define('TEXT_SHOPPING_CART_SUBTOTAL', 'Subtotal');
-define('TEXT_NUMBER_OF_CUSTOMERS', 'Hay actualmente %s clientes en lnea');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol/zones.php 2.3.1.src/admin/includes/languages/espanol/zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol/zones.php	2008-01-31 16:34:15.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol/zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Zonas');
-
-define('TABLE_HEADING_COUNTRY_NAME', 'Pa&iacute;s');
-define('TABLE_HEADING_ZONE_NAME', 'Zonas');
-define('TABLE_HEADING_ZONE_CODE', 'C&oacute;digo');
-define('TABLE_HEADING_ACTION', 'Acci&oacute;n');
-
-define('TEXT_INFO_EDIT_INTRO', 'Haga los cambios necesarios');
-define('TEXT_INFO_ZONES_NAME', 'Nombre de la Zona:');
-define('TEXT_INFO_ZONES_CODE', 'C&oacute;digo de la Zona:');
-define('TEXT_INFO_COUNTRY_NAME', 'Pa&iacute;s:');
-define('TEXT_INFO_INSERT_INTRO', 'Introduzca los datos de la nueva zona');
-define('TEXT_INFO_DELETE_INTRO', 'Seguro que desea eliminar esta zona?');
-define('TEXT_INFO_HEADING_NEW_ZONE', 'Nueva Zona');
-define('TEXT_INFO_HEADING_EDIT_ZONE', 'Editar Zone');
-define('TEXT_INFO_HEADING_DELETE_ZONE', 'Eliminar Zone');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/espanol.php 2.3.1.src/admin/includes/languages/espanol.php
--- 2.2rc2a.cp.src/admin/includes/languages/espanol.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/espanol.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,297 +0,0 @@
-<?php
-/*
-  $Id: espanol.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-// look in your $PATH_LOCALE/locale directory for available locales..
-// on RedHat6.0 I used 'es_ES'
-// on FreeBSD 4.0 I use 'es_ES.ISO_8859-1'
-// this may not work under win32 environments..
-setlocale(LC_TIME, 'es_ES.ISO_8859-1');
-define('DATE_FORMAT_SHORT', '%d/%m/%Y');  // this is used for strftime()
-define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
-define('DATE_FORMAT', 'd/m/Y');  // this is used for date()
-define('PHP_DATE_TIME_FORMAT', 'd/m/Y H:i:s'); // this is used for date()
-define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
-
-////
-// Return date in raw format
-// $date should be in format mm/dd/yyyy
-// raw date is in format YYYYMMDD, or DDMMYYYY
-function tep_date_raw($date, $reverse = false) {
-  if ($reverse) {
-    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
-  } else {
-    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
-  }
-}
-
-// Global entries for the <html> tag
-define('HTML_PARAMS','dir="ltr" lang="es"');
-
-// charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
-
-// page title
-define('TITLE', 'osCommerce Online Merchant Administration Tool');
-
-// header text in includes/header.php
-define('HEADER_TITLE_TOP', 'Administraci&oacute;n');
-define('HEADER_TITLE_SUPPORT_SITE', 'Soporte');
-define('HEADER_TITLE_ONLINE_CATALOG', 'Cat&aacute;logo');
-define('HEADER_TITLE_ADMINISTRATION', 'Administraci&oacute;n');
-
-// text for gender
-define('MALE', 'Var&oacute;n');
-define('FEMALE', 'Mujer');
-
-// text for date of birth example
-define('DOB_FORMAT_STRING', 'dd/mm/aaaa');
-
-// configuration box text in includes/boxes/configuration.php
-define('BOX_HEADING_CONFIGURATION', 'Configuraci&oacute;n');
-define('BOX_CONFIGURATION_MYSTORE', 'Mi Tienda');
-define('BOX_CONFIGURATION_LOGGING', 'Registro');
-define('BOX_CONFIGURATION_CACHE', 'Cach&eacute;');
-define('BOX_CONFIGURATION_ADMINISTRATORS', 'Administrators');
-
-// modules box text in includes/boxes/modules.php
-define('BOX_HEADING_MODULES', 'M&oacute;dulos');
-define('BOX_MODULES_PAYMENT', 'Pago');
-define('BOX_MODULES_SHIPPING', 'Env&iacute;o');
-define('BOX_MODULES_ORDER_TOTAL', 'Totalizaci&oacute;n');
-
-// categories box text in includes/boxes/catalog.php
-define('BOX_HEADING_CATALOG', 'Cat&aacute;logo');
-define('BOX_CATALOG_CATEGORIES_PRODUCTS', 'Categorias/Productos');
-define('BOX_CATALOG_CATEGORIES_PRODUCTS_ATTRIBUTES', 'Atributos');
-define('BOX_CATALOG_MANUFACTURERS', 'Fabricantes');
-define('BOX_CATALOG_REVIEWS', 'Comentarios');
-define('BOX_CATALOG_SPECIALS', 'Ofertas');
-define('BOX_CATALOG_PRODUCTS_EXPECTED', 'Pr&oacute;ximamente');
-
-// customers box text in includes/boxes/customers.php
-define('BOX_HEADING_CUSTOMERS', 'Clientes');
-define('BOX_CUSTOMERS_CUSTOMERS', 'Clientes');
-define('BOX_CUSTOMERS_ORDERS', 'Pedidos');
-
-// taxes box text in includes/boxes/taxes.php
-define('BOX_HEADING_LOCATION_AND_TAXES', 'Zonas/Impuestos');
-define('BOX_TAXES_COUNTRIES', 'Paises');
-define('BOX_TAXES_ZONES', 'Provincias');
-define('BOX_TAXES_GEO_ZONES', 'Zonas de Impuestos');
-define('BOX_TAXES_TAX_CLASSES', 'Tipos de Impuestos');
-define('BOX_TAXES_TAX_RATES', 'Impuestos');
-
-// reports box text in includes/boxes/reports.php
-define('BOX_HEADING_REPORTS', 'Informes');
-define('BOX_REPORTS_PRODUCTS_VIEWED', 'Los Mas Vistos');
-define('BOX_REPORTS_PRODUCTS_PURCHASED', 'Los Mas Comprados');
-define('BOX_REPORTS_ORDERS_TOTAL', 'Total por Cliente');
-
-// tools text in includes/boxes/tools.php
-define('BOX_HEADING_TOOLS', 'Herramientas');
-define('BOX_TOOLS_BACKUP', 'Copia de Seguridad');
-define('BOX_TOOLS_BANNER_MANAGER', 'Banners');
-define('BOX_TOOLS_CACHE', 'Control de Cach&eacute;');
-define('BOX_TOOLS_DEFINE_LANGUAGE', 'Definir Idiomas');
-define('BOX_TOOLS_FILE_MANAGER', 'Archivos');
-define('BOX_TOOLS_MAIL', 'Enviar Email');
-define('BOX_TOOLS_NEWSLETTER_MANAGER', 'Boletines');
-define('BOX_TOOLS_SERVER_INFO', 'Informaci&oacute;n');
-define('BOX_TOOLS_WHOS_ONLINE', 'Usuarios conectados');
-
-// localizaion box text in includes/boxes/localization.php
-define('BOX_HEADING_LOCALIZATION', 'Localizaci&oacute;n');
-define('BOX_LOCALIZATION_CURRENCIES', 'Monedas');
-define('BOX_LOCALIZATION_LANGUAGES', 'Idiomas');
-define('BOX_LOCALIZATION_ORDERS_STATUS', 'Estado Pedidos');
-
-// javascript messages
-define('JS_ERROR', 'Ha habido errores procesando su formulario!\nPor favor, haga las siguientes modificaciones:\n\n');
-
-define('JS_OPTIONS_VALUE_PRICE', '* El atributo necesita un precio\n');
-define('JS_OPTIONS_VALUE_PRICE_PREFIX', '* El atributo necesita un prefijo para el precio\n');
-
-define('JS_PRODUCTS_NAME', '* El producto necesita un nombre\n');
-define('JS_PRODUCTS_DESCRIPTION', '* El producto necesita una descripci&oacute;n\n');
-define('JS_PRODUCTS_PRICE', '* El producto necesita un precio\n');
-define('JS_PRODUCTS_WEIGHT', '* Debe especificar el peso del producto\n');
-define('JS_PRODUCTS_QUANTITY', '* Debe especificar la cantidad\n');
-define('JS_PRODUCTS_MODEL', '* Debe especificar el modelo\n');
-define('JS_PRODUCTS_IMAGE', '* Debe suministrar una imagen\n');
-
-define('JS_SPECIALS_PRODUCTS_PRICE', '* Debe rellenar el precio\n');
-
-define('JS_GENDER', '* Debe elegir un \'Sexo\'.\n');
-define('JS_FIRST_NAME', '* El \'Nombre\' debe tener al menos ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' letras.\n');
-define('JS_LAST_NAME', '* El \'Apellido\' debe tener al menos ' . ENTRY_LAST_NAME_MIN_LENGTH . ' letras.\n');
-define('JS_DOB', '* La \'Fecha de Nacimiento\' debe tener el formato: xx/xx/xxxx (dia/mes/a&ntilde;o).\n');
-define('JS_EMAIL_ADDRESS', '* El \'E-Mail\' debe tener al menos ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' letras.\n');
-define('JS_ADDRESS', '* El \'Domicilio\' debe tener al menos ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' letras.\n');
-define('JS_POST_CODE', '* El \'C&oacute;digo Postal\' debe tener al menos ' . ENTRY_POSTCODE_MIN_LENGTH . ' letras.\n');
-define('JS_CITY', '* La \'Ciudad\' debe tener al menos ' . ENTRY_CITY_MIN_LENGTH . ' letras.\n');
-define('JS_STATE', '* Debe indicar la \'Provincia\'.\n');
-define('JS_STATE_SELECT', '-- Seleccione Arriba --');
-define('JS_ZONE', '* La \'Provincia\' se debe seleccionar de la lista para este pais.');
-define('JS_COUNTRY', '* Debe seleccionar un \'Pais\'.\n');
-define('JS_TELEPHONE', '* El \'Telefono\' debe tener al menos ' . ENTRY_TELEPHONE_MIN_LENGTH . ' letras.\n');
-define('JS_PASSWORD', '* La \'Contrase&ntilde;a\' y \'Confirmaci&oacute;n\' deben ser iguales y tener al menos ' . ENTRY_PASSWORD_MIN_LENGTH . ' letras.\n');
-
-define('JS_ORDER_DOES_NOT_EXIST', 'El n&uacute;mero de pedido %s no existe!');
-
-define('CATEGORY_PERSONAL', 'Personal');
-define('CATEGORY_ADDRESS', 'Domicilio');
-define('CATEGORY_CONTACT', 'Contacto');
-define('CATEGORY_COMPANY', 'Empresa');
-define('CATEGORY_OPTIONS', 'Opciones');
-
-define('ENTRY_GENDER', 'Sexo:');
-define('ENTRY_GENDER_ERROR', '&nbsp;<span class="errorText">obligatorio</span>');
-define('ENTRY_FIRST_NAME', 'Nombre:');
-define('ENTRY_FIRST_NAME_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' letras</span>');
-define('ENTRY_LAST_NAME', 'Apellidos:');
-define('ENTRY_LAST_NAME_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_LAST_NAME_MIN_LENGTH . ' letras</span>');
-define('ENTRY_DATE_OF_BIRTH', 'Fecha de Nacimiento:');
-define('ENTRY_DATE_OF_BIRTH_ERROR', '&nbsp;<span class="errorText">(p.ej. 21/05/1970)</span>');
-define('ENTRY_EMAIL_ADDRESS', 'E-Mail:');
-define('ENTRY_EMAIL_ADDRESS_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' letras</span>');
-define('ENTRY_EMAIL_ADDRESS_CHECK_ERROR', '&nbsp;<span class="errorText">Su Email no parece correcto!</span>');
-define('ENTRY_EMAIL_ADDRESS_ERROR_EXISTS', '&nbsp;<span class="errorText">email ya existe!</span>');
-define('ENTRY_COMPANY', 'Nombre empresa:');
-define('ENTRY_STREET_ADDRESS', 'Direcci&oacute;n:');
-define('ENTRY_STREET_ADDRESS_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' letras</span>');
-define('ENTRY_SUBURB', '');
-define('ENTRY_POST_CODE', 'C&oacute;digo Postal:');
-define('ENTRY_POST_CODE_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_POSTCODE_MIN_LENGTH . ' letras</span>');
-define('ENTRY_CITY', 'Poblaci&oacute;n:');
-define('ENTRY_CITY_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_CITY_MIN_LENGTH . ' letras</span>');
-define('ENTRY_STATE', 'Provincia:');
-define('ENTRY_STATE_ERROR', '&nbsp;<span class="errorText">obligatorio</span>');
-define('ENTRY_COUNTRY', 'Pa&iacute;s:');
-define('ENTRY_TELEPHONE_NUMBER', 'Tel&eacute;fono:');
-define('ENTRY_TELEPHONE_NUMBER_ERROR', '&nbsp;<span class="errorText">min ' . ENTRY_TELEPHONE_MIN_LENGTH . ' letras</span>');
-define('ENTRY_FAX_NUMBER', 'Fax:');
-define('ENTRY_NEWSLETTER', 'Bolet&iacute;n:');
-define('ENTRY_NEWSLETTER_YES', 'suscrito');
-define('ENTRY_NEWSLETTER_NO', 'no suscrito');
-
-// images
-define('IMAGE_ANI_SEND_EMAIL', 'Enviando E-Mail');
-define('IMAGE_BACK', 'Volver');
-define('IMAGE_BACKUP', 'Copiar');
-define('IMAGE_CANCEL', 'Cancelar');
-define('IMAGE_CONFIRM', 'Confirmar');
-define('IMAGE_COPY', 'Copiar');
-define('IMAGE_COPY_TO', 'Copiar A');
-define('IMAGE_DETAILS', 'Detalle');
-define('IMAGE_DELETE', 'Eliminar');
-define('IMAGE_EDIT', 'Editar');
-define('IMAGE_EMAIL', 'Email');
-define('IMAGE_FILE_MANAGER', 'Archivos');
-define('IMAGE_ICON_STATUS_GREEN', 'Activado');
-define('IMAGE_ICON_STATUS_GREEN_LIGHT', 'Activar');
-define('IMAGE_ICON_STATUS_RED', 'Desactivado');
-define('IMAGE_ICON_STATUS_RED_LIGHT', 'Desactivar');
-define('IMAGE_ICON_INFO', 'Datos');
-define('IMAGE_INSERT', 'Insertar');
-define('IMAGE_LOCK', 'Bloqueado');
-define('IMAGE_MODULE_INSTALL', 'Instalar M&oacute;dulo');
-define('IMAGE_MODULE_REMOVE', 'Quitar M&oacute;dulo');
-define('IMAGE_MOVE', 'Mover');
-define('IMAGE_NEW_BANNER', 'Nuevo Banner');
-define('IMAGE_NEW_CATEGORY', 'Nueva Categoria');
-define('IMAGE_NEW_COUNTRY', 'Nuevo Pais');
-define('IMAGE_NEW_CURRENCY', 'Nueva Moneda');
-define('IMAGE_NEW_FILE', 'Nuevo Fichero');
-define('IMAGE_NEW_FOLDER', 'Nueva Carpeta');
-define('IMAGE_NEW_LANGUAGE', 'Nueva Idioma');
-define('IMAGE_NEW_NEWSLETTER', 'Nuevo Bolet&iacute;n');
-define('IMAGE_NEW_PRODUCT', 'Nuevo Producto');
-define('IMAGE_NEW_TAX_CLASS', 'Nuevo Tipo de Impuesto');
-define('IMAGE_NEW_TAX_RATE', 'Nuevo Impuesto');
-define('IMAGE_NEW_TAX_ZONE', 'Nueva Zona');
-define('IMAGE_NEW_ZONE', 'Nueva Zona');
-define('IMAGE_ORDERS', 'Pedidos');
-define('IMAGE_ORDERS_INVOICE', 'Factura');
-define('IMAGE_ORDERS_PACKINGSLIP', 'Albar&aacute;n');
-define('IMAGE_PREVIEW', 'Ver');
-define('IMAGE_RESET', 'Resetear');
-define('IMAGE_RESTORE', 'Restaurar');
-define('IMAGE_SAVE', 'Grabar');
-define('IMAGE_SEARCH', 'Buscar');
-define('IMAGE_SELECT', 'Seleccionar');
-define('IMAGE_SEND', 'Enviar');
-define('IMAGE_SEND_EMAIL', 'Send Email');
-define('IMAGE_UNLOCK', 'Desbloqueado');
-define('IMAGE_UPDATE', 'Actualizar');
-define('IMAGE_UPDATE_CURRENCIES', 'Actualizar Cambio de Moneda');
-define('IMAGE_UPLOAD', 'Subir');
-
-define('ICON_CROSS', 'Falso');
-define('ICON_CURRENT_FOLDER', 'Directorio Actual');
-define('ICON_DELETE', 'Eliminar');
-define('ICON_ERROR', 'Error');
-define('ICON_FILE', 'Fichero');
-define('ICON_FILE_DOWNLOAD', 'Descargar');
-define('ICON_FOLDER', 'Carpeta');
-define('ICON_LOCKED', 'Bloqueado');
-define('ICON_PREVIOUS_LEVEL', 'Nivel Anterior');
-define('ICON_PREVIEW', 'Ver');
-define('ICON_STATISTICS', 'Estadisticas');
-define('ICON_SUCCESS', 'Exito');
-define('ICON_TICK', 'Verdadero');
-define('ICON_UNLOCKED', 'Desbloqueado');
-define('ICON_WARNING', 'Advertencia');
-
-// constants for use in tep_prev_next_display function
-define('TEXT_RESULT_PAGE', 'P&aacute;gina %s de %d');
-define('TEXT_DISPLAY_NUMBER_OF_BANNERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> banners)');
-define('TEXT_DISPLAY_NUMBER_OF_COUNTRIES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> paises)');
-define('TEXT_DISPLAY_NUMBER_OF_CUSTOMERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> clientes)');
-define('TEXT_DISPLAY_NUMBER_OF_CURRENCIES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> monedas)');
-define('TEXT_DISPLAY_NUMBER_OF_LANGUAGES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> idiomas)');
-define('TEXT_DISPLAY_NUMBER_OF_MANUFACTURERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> fabricantes)');
-define('TEXT_DISPLAY_NUMBER_OF_NEWSLETTERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> boletines)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> pedidos)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS_STATUS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> estado de pedidos)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> productos)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_EXPECTED', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> productos esperados)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> comentarios)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> ofertas)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_ZONES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> zonas de impuestos)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_RATES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> porcentajes de impuestos)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_CLASSES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> tipos de impuesto)');
-define('TEXT_DISPLAY_NUMBER_OF_ZONES', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> zonas)');
-
-define('PREVNEXT_BUTTON_PREV', '&lt;&lt;');
-define('PREVNEXT_BUTTON_NEXT', '&gt;&gt;');
-
-define('TEXT_DEFAULT', 'predeterminado/a');
-define('TEXT_SET_DEFAULT', 'Establecer como predeterminado/a');
-define('TEXT_FIELD_REQUIRED', '&nbsp;<span class="fieldRequired">* Obligatorio</span>');
-
-define('ERROR_NO_DEFAULT_CURRENCY_DEFINED', 'Error: No hay moneda predeterminada. Por favor establezca una en: Herramientas de Administracion->Localizaci&oacute;n->Monedas');
-
-define('TEXT_CACHE_CATEGORIES', 'Categorias');
-define('TEXT_CACHE_MANUFACTURERS', 'Fabricantes');
-define('TEXT_CACHE_ALSO_PURCHASED', 'Tambi&eacute;n Han Comprado');
-
-define('TEXT_NONE', '--ninguno--');
-define('TEXT_TOP', 'Principio');
-
-define('ERROR_DESTINATION_DOES_NOT_EXIST', 'Error: Destino no existe.');
-define('ERROR_DESTINATION_NOT_WRITEABLE', 'Error: No se puede escribir en el destino.');
-define('ERROR_FILE_NOT_SAVED', 'Error: El archivo subido no se ha guardado.');
-define('ERROR_FILETYPE_NOT_ALLOWED', 'Error: Extension de fichero no permitida.');
-define('SUCCESS_FILE_SAVED_SUCCESSFULLY', 'Exito: Fichero guardado con &eacute;xito.');
-define('WARNING_NO_FILE_UPLOADED', 'Advertencia: No se ha subido ningun archivo.');
-define('WARNING_FILE_UPLOADS_DISABLED', 'Warning: Se ha desactivado la subida de archivos en el fichero de configuraci&oacute;n php.ini.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/administrators.php 2.3.1.src/admin/includes/languages/german/administrators.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/administrators.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/administrators.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: administrators.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrators');
-
-define('TABLE_HEADING_ADMINISTRATORS', 'Administrators');
-define('TABLE_HEADING_ACTION', 'Action');
-
-define('TEXT_INFO_INSERT_INTRO', 'Please enter the new administrator with its related data');
-define('TEXT_INFO_EDIT_INTRO', 'Please make any necessary changes');
-define('TEXT_INFO_DELETE_INTRO', 'Are you sure you want to delete this administrator?');
-define('TEXT_INFO_HEADING_NEW_ADMINISTRATOR', 'New Administrator');
-define('TEXT_INFO_USERNAME', 'Username:');
-define('TEXT_INFO_NEW_PASSWORD', 'New Password:');
-define('TEXT_INFO_PASSWORD', 'Password:');
-
-define('ERROR_ADMINISTRATOR_EXISTS', 'Error: Administrator already exists.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/backup.php 2.3.1.src/admin/includes/languages/german/backup.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/backup.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/backup.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,49 +0,0 @@
-<?php
-/*
-  $Id: backup.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Datenbanksicherung'); 
-
-define('TABLE_HEADING_TITLE', 'Titel');
-define('TABLE_HEADING_FILE_DATE', 'Datum');
-define('TABLE_HEADING_FILE_SIZE', 'Gr&ouml;sse');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_HEADING_NEW_BACKUP', 'Neue Sicherung');
-define('TEXT_INFO_HEADING_RESTORE_LOCAL', 'Lokal wiederherstellen');
-define('TEXT_INFO_NEW_BACKUP', 'Bitte den Sicherungsprozess AUF KEINEN FALL unterbrechen. Dieser kann einige Minuten in Anspruch nehmen.');
-define('TEXT_INFO_UNPACK', '<br><br>(nach dem die Dateien aus dem Archiv extrahiert wurden)');
-define('TEXT_INFO_RESTORE', 'Den Wiederherstellungsprozess AUF KEINEN FALL unterbrechen.<br><br>Je gr&ouml;sser die Sicherungsdatei - desto l&auml;nger dauert die Wiederherstellung!<br><br>Bitte wenn m&ouml;glich den mysql client benutzen.<br><br>Beispiel:<br><br><b>mysql -h' . DB_SERVER . ' -u' . DB_SERVER_USERNAME . ' -p ' . DB_DATABASE . ' < %s </b> %s');
-define('TEXT_INFO_RESTORE_LOCAL', 'Den Wiederherstellungsprozess AUF KEINEN FALL unterbrechen.<br><br>Je gr&ouml;sser die Sicherungsdatei - desto l&auml;nger dauert die Wiederherstellung!');
-define('TEXT_INFO_RESTORE_LOCAL_RAW_FILE', 'Die Datei, welche hochgeladen wird muss eine sog. raw sql Datei sein (nur Text).');
-define('TEXT_INFO_DATE', 'Datum:');
-define('TEXT_INFO_SIZE', 'Gr&ouml;sse:');
-define('TEXT_INFO_COMPRESSION', 'Komprimieren:');
-define('TEXT_INFO_USE_GZIP', 'Mit GZIP');
-define('TEXT_INFO_USE_ZIP', 'Mit ZIP');
-define('TEXT_INFO_USE_NO_COMPRESSION', 'Keine Komprimierung (Raw SQL)');
-define('TEXT_INFO_DOWNLOAD_ONLY', 'Nur herunterladen (nicht auf dem Server speichern)');
-define('TEXT_INFO_BEST_THROUGH_HTTPS', 'Sichere HTTPS Verbindung verwenden!');
-define('TEXT_NO_EXTENSION', 'Keine');
-define('TEXT_BACKUP_DIRECTORY', 'Sicherungsverzeichnis:');
-define('TEXT_LAST_RESTORATION', 'Letzte Wiederherstellung:');
-define('TEXT_FORGET', '(<u> vergessen</u>)');
-define('TEXT_DELETE_INTRO', 'Sind Sie sicher, dass Sie diese Sicherung l&ouml;schen m&ouml;chten?');
-
-define('ERROR_BACKUP_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Sicherungsverzeichnis ist nicht vorhanden.');
-define('ERROR_BACKUP_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Sicherungsverzeichnis ist schreibgesch&uuml;tzt.');
-define('ERROR_DOWNLOAD_LINK_NOT_ACCEPTABLE', 'Fehler: Download Link nicht akzeptabel.');
-
-define('SUCCESS_LAST_RESTORE_CLEARED', 'Erfolg: Das letzte Wiederherstellungdatum wurde gel&ouml;scht.');
-define('SUCCESS_DATABASE_SAVED', 'Erfolg: Die Datenbank wurde gesichert.');
-define('SUCCESS_DATABASE_RESTORED', 'Erfolg: Die Datenbank wurde wiederhergestellt.');
-define('SUCCESS_BACKUP_DELETED', 'Erfolg: Die Sicherungsdatei wurde gel&ouml;scht.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/banner_manager.php 2.3.1.src/admin/includes/languages/german/banner_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/banner_manager.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/banner_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,67 +0,0 @@
-<?php
-/*
-  $Id: banner_manager.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Banner Manager');
-
-define('TABLE_HEADING_BANNERS', 'Banner');
-define('TABLE_HEADING_GROUPS', 'Gruppe');
-define('TABLE_HEADING_STATISTICS', 'Anzeigen / Klicks');
-define('TABLE_HEADING_STATUS', 'Status');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_BANNERS_TITLE', 'Titel des Banners:'); 
-define('TEXT_BANNERS_URL', 'Banner-URL:'); 
-define('TEXT_BANNERS_GROUP', 'Banner-Gruppe:'); 
-define('TEXT_BANNERS_NEW_GROUP', ', oder geben Sie unten eine neue Banner-Gruppe ein'); 
-define('TEXT_BANNERS_IMAGE', 'Bild (Datei):'); 
-define('TEXT_BANNERS_IMAGE_LOCAL', ', oder geben Sie unten die lokale Datei auf Ihrem Server an'); 
-define('TEXT_BANNERS_IMAGE_TARGET', 'Bildziel (Speichern nach):'); 
-define('TEXT_BANNERS_HTML_TEXT', 'HTML Text:');
-define('TEXT_BANNERS_EXPIRES_ON', 'G&uuml;ltigkeit bis:');
-define('TEXT_BANNERS_OR_AT', ', oder bei');
-define('TEXT_BANNERS_IMPRESSIONS', 'Impressionen/Anzeigen.');
-define('TEXT_BANNERS_SCHEDULED_AT', 'G&uuml;ltigkeit ab:');
-define('TEXT_BANNERS_BANNER_NOTE', '<b>Banner Bemerkung:</b><ul><li>Sie k&ouml;nnen Bild- oder HTML-Text-Banner verwenden, beides gleichzeitig ist nicht m&ouml;glich.</li><li>Wenn Sie beide Bannerarten gleichzeitig verwenden, wird nur der HTML-Text Banner angezeigt.</li></ul>');
-define('TEXT_BANNERS_INSERT_NOTE', '<b>Bemerkung:</b><ul><li>Auf das Bildverzeichnis muss ein Schreibrecht bestehen!</li><li>F&uuml;llen Sie das Feld \'Bildziel (Speichern nach)\' nicht aus, wenn Sie kein Bild auf Ihren Server kopieren m&ouml;chten (z.B. wenn sich das Bild bereits auf dem Server befindet).</li><li>Das \'Bildziel (Speichern nach)\' Feld muss ein bereits existierendes Verzeichnis mit \'/\' am Ende sein (z.B. banners/).</li></ul>'); 
-define('TEXT_BANNERS_EXPIRCY_NOTE', '<b>G&uuml;ltigkeit Bemerkung:</b><ul><li>Nur ein Feld ausf&uuml;llen!</li><li>Wenn der Banner unbegrenzt angezeigt werden soll, tragen Sie in diesen Feldern nichts ein.</li></ul>');
-define('TEXT_BANNERS_SCHEDULE_NOTE', '<b>G&uuml;ltigkeit ab Bemerkung:</b><ul><li>Bei Verwendung dieser Funktion, wird der Banner erst ab dem angegeben Datum angezeigt.</li><li>Alle Banner mit dieser Funktion werden bis ihrer Aktivierung, als Deaktiviert angezeigt.</li></ul>');
-
-define('TEXT_BANNERS_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_BANNERS_SCHEDULED_AT_DATE', 'G&uuml;ltigkeit ab: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_DATE', 'G&uuml;ltigkeit bis zum: <b>%s</b>');
-define('TEXT_BANNERS_EXPIRES_AT_IMPRESSIONS', 'G&uuml;ltigkeit bis: <b>%s</b> impressionen/anzeigen');
-define('TEXT_BANNERS_STATUS_CHANGE', 'Status ge&auml;ndert: %s');
-
-define('TEXT_BANNERS_DATA', 'D<br>A<br>T<br>E<br>N');
-define('TEXT_BANNERS_LAST_3_DAYS', 'letzten 3 Tage');
-define('TEXT_BANNERS_BANNER_VIEWS', 'Banneranzeigen');
-define('TEXT_BANNERS_BANNER_CLICKS', 'Bannerklicks');
-
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie diesen Banner l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_DELETE_IMAGE', 'Bannerbild l&ouml;schen');
-
-define('SUCCESS_BANNER_INSERTED', 'Erfolg: Der Banner wurde eingef&uuml;gt.');
-define('SUCCESS_BANNER_UPDATED', 'Erfolg: Der Banner wurde aktualisiert.');
-define('SUCCESS_BANNER_REMOVED', 'Erfolg: Der Banner wurde gel&ouml;scht.');
-define('SUCCESS_BANNER_STATUS_UPDATED', 'Erfolg: Der Status des Banners wurde aktualisiert.');
-
-define('ERROR_BANNER_TITLE_REQUIRED', 'Fehler: Ein Bannertitel wird ben&ouml;tigt.');
-define('ERROR_BANNER_GROUP_REQUIRED', 'Fehler: Eine Bannergruppe wird ben&ouml;tigt.');
-define('ERROR_IMAGE_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Zielverzeichnis %s existiert nicht.');
-define('ERROR_IMAGE_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Zielverzeichnis %s ist nicht beschreibbar.');
-define('ERROR_IMAGE_DOES_NOT_EXIST', 'Fehler: Bild existiert nicht.');
-define('ERROR_IMAGE_IS_NOT_WRITEABLE', 'Fehler: Bild kann nicht gel&ouml;scht werden.');
-define('ERROR_UNKNOWN_STATUS_FLAG', 'Fehler: Unbekanntes Status Flag.');
-
-define('ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Verzeichnis \'graphs\' ist nicht vorhanden! Bitte erstellen Sie ein Verzeichnis \'graphs\' im Verzeichnis \'images\'.');
-define('ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Verzeichnis \'graphs\' ist schreibgesch&uuml;tzt!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/banner_statistics.php 2.3.1.src/admin/includes/languages/german/banner_statistics.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/banner_statistics.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/banner_statistics.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,34 +0,0 @@
-<?php
-/*
-  $Id: banner_statistics.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Bannerstatistik');
-
-define('TABLE_HEADING_SOURCE', 'Grundlage');
-define('TABLE_HEADING_VIEWS', 'Anzeigen');
-define('TABLE_HEADING_CLICKS', 'Klicks');
-
-define('TEXT_BANNERS_DATA', 'D<br>a<br>t<br>a');
-define('TEXT_BANNERS_DAILY_STATISTICS', '%s Tagesstatistik fr %s %s');
-define('TEXT_BANNERS_MONTHLY_STATISTICS', '%s Monatsstatistik fr %s');
-define('TEXT_BANNERS_YEARLY_STATISTICS', '%s Jahresstatistik');
-
-define('STATISTICS_TYPE_DAILY', 't&auml;glich');
-define('STATISTICS_TYPE_MONTHLY', 'monatlich');
-define('STATISTICS_TYPE_YEARLY', 'j&auml;hrlich');
-
-define('TITLE_TYPE', 'Typ:');
-define('TITLE_YEAR', 'Jahr:');
-define('TITLE_MONTH', 'Monat:');
-
-define('ERROR_GRAPHS_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Verzeichnis \'graphs\' ist nicht vorhanden! Bitte erstellen Sie ein Verzeichnis \'graphs\' im Verzeichnis \'images\'.');
-define('ERROR_GRAPHS_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Verzeichnis \'graphs\' ist schreibgesch&uuml;tzt!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/cache.php 2.3.1.src/admin/includes/languages/german/cache.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/cache.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/cache.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: cache.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Cache Steuerung');
-
-define('TABLE_HEADING_CACHE', 'Cache Bl&ouml;cke');
-define('TABLE_HEADING_DATE_CREATED', 'erstellt am');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_FILE_DOES_NOT_EXIST', 'Datei ist nicht vorhanden');
-define('TEXT_CACHE_DIRECTORY', 'Cache Verzeichnis:');
-
-define('ERROR_CACHE_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Cache Verzeichnis ist nicht vorhanden. Please set it in Konfiguration / Cache');
-define('ERROR_CACHE_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Cache Verzeichnis ist schreibgesch&uuml;tzt.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/categories.php 2.3.1.src/admin/includes/languages/german/categories.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/categories.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/categories.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,97 +0,0 @@
-<?php
-/*
-  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Kategorien / Artikel');
-define('HEADING_TITLE_SEARCH', 'Suche: ');
-define('HEADING_TITLE_GOTO', 'Gehe zu:');
-
-define('TABLE_HEADING_ID', 'ID');
-define('TABLE_HEADING_CATEGORIES_PRODUCTS', 'Kategorien / Artikel');
-define('TABLE_HEADING_ACTION', 'Aktion');
-define('TABLE_HEADING_STATUS', 'Status');
-
-define('TEXT_NEW_PRODUCT', 'Neuer Artikel in &quot;%s&quot;');
-define('TEXT_CATEGORIES', 'Kategorien:');
-define('TEXT_SUBCATEGORIES', 'Unterkategorien:');
-define('TEXT_PRODUCTS', 'Artikel:');
-define('TEXT_PRODUCTS_PRICE_INFO', 'Preis:');
-define('TEXT_PRODUCTS_TAX_CLASS', 'Steuerklasse:');
-define('TEXT_PRODUCTS_AVERAGE_RATING', 'durchschnittl. Bewertung:');
-define('TEXT_PRODUCTS_QUANTITY_INFO', 'Anzahl:');
-define('TEXT_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_DATE_AVAILABLE', 'Erscheinungsdatum:');
-define('TEXT_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_IMAGE_NONEXISTENT', 'BILD EXISTIERT NICHT');
-define('TEXT_NO_CHILD_CATEGORIES_OR_PRODUCTS', 'Bitte f&uuml;gen Sie eine neue Kategorie oder einen Artikel ein.');
-define('TEXT_PRODUCT_MORE_INFORMATION', 'F&uuml;r weitere Informationen, besuchen Sie bitte die <a href="http://%s" target="blank"><u>Homepage</u></a> des Herstellers.');
-define('TEXT_PRODUCT_DATE_ADDED', 'Diesen Artikel haben wir am %s in unseren Katalog aufgenommen.');
-define('TEXT_PRODUCT_DATE_AVAILABLE', 'Dieser Artikel ist erh&auml;ltlich ab %s.');
-
-define('TEXT_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch.');
-define('TEXT_EDIT_CATEGORIES_ID', 'Kategorie ID:');
-define('TEXT_EDIT_CATEGORIES_NAME', 'Kategorie Name:');
-define('TEXT_EDIT_CATEGORIES_IMAGE', 'Kategorie Bild:');
-define('TEXT_EDIT_SORT_ORDER', 'Sortierreihenfolge:');
-
-define('TEXT_INFO_COPY_TO_INTRO', 'Bitte w&auml;hlen Sie eine neue Kategorie aus, in die Sie den Artikel kopieren m&ouml;chten:');
-define('TEXT_INFO_CURRENT_CATEGORIES', 'aktuelle Kategorien:');
-
-define('TEXT_INFO_HEADING_NEW_CATEGORY', 'Neue Kategorie');
-define('TEXT_INFO_HEADING_EDIT_CATEGORY', 'Kategorie bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_CATEGORY', 'Kategorie l&ouml;schen');
-define('TEXT_INFO_HEADING_MOVE_CATEGORY', 'Kategorie verschieben');
-define('TEXT_INFO_HEADING_DELETE_PRODUCT', 'Artikel l&ouml;schen');
-define('TEXT_INFO_HEADING_MOVE_PRODUCT', 'Artikel verschieben');
-define('TEXT_INFO_HEADING_COPY_TO', 'Kopieren nach');
-
-define('TEXT_DELETE_CATEGORY_INTRO', 'Sind Sie sicher, dass Sie diese Kategorie l&ouml;schen m&ouml;chten?');
-define('TEXT_DELETE_PRODUCT_INTRO', 'Sind Sie sicher, dass Sie diesen Artikel l&ouml;schen m&ouml;chten?');
-
-define('TEXT_DELETE_WARNING_CHILDS', '<b>WARNUNG:</b> Es existieren noch %s (Unter-)Kategorien, die mit dieser Kategorie verbunden sind!');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>WARNING:</b> Es existieren noch %s Artikel, die mit dieser Kategorie verbunden sind!');
-
-define('TEXT_MOVE_PRODUCTS_INTRO', 'Bitte w&auml;hlen Sie die &uuml;bergordnete Kategorie, in die Sie <b>%s</b> verschieben m&ouml;chten');
-define('TEXT_MOVE_CATEGORIES_INTRO', 'Bitte w&auml;hlen Sie die &uuml;bergordnete Kategorie, in die Sie <b>%s</b> verschieben m&ouml;chten');
-define('TEXT_MOVE', 'Verschiebe <b>%s</b> nach:');
-
-define('TEXT_NEW_CATEGORY_INTRO', 'Bitte geben Sie die neue Kategorie mit allen relevanten Daten ein.');
-define('TEXT_CATEGORIES_NAME', 'Kategorie Name:');
-define('TEXT_CATEGORIES_IMAGE', 'Kategorie Bild:');
-define('TEXT_SORT_ORDER', 'Sortierreihenfolge:');
-
-define('TEXT_PRODUCTS_STATUS', 'Produktstatus:');
-define('TEXT_PRODUCTS_DATE_AVAILABLE', 'Erscheinungsdatum:');
-define('TEXT_PRODUCT_AVAILABLE', 'auf Lager');
-define('TEXT_PRODUCT_NOT_AVAILABLE', 'nicht vorr&auml;tig');
-define('TEXT_PRODUCTS_MANUFACTURER', 'Artikel-Hersteller:');
-define('TEXT_PRODUCTS_NAME', 'Artikelname:');
-define('TEXT_PRODUCTS_DESCRIPTION', 'Artikelbeschreibung:');
-define('TEXT_PRODUCTS_QUANTITY', 'Artikelanzahl:');
-define('TEXT_PRODUCTS_MODEL', 'Artikel-Nr.:');
-define('TEXT_PRODUCTS_IMAGE', 'Artikelbild:');
-define('TEXT_PRODUCTS_URL', 'Herstellerlink:');
-define('TEXT_PRODUCTS_URL_WITHOUT_HTTP', '<small>(ohne f&uuml;hrendes http://)</small>');
-define('TEXT_PRODUCTS_PRICE_NET', 'Artikelpreis (Netto):');
-define('TEXT_PRODUCTS_PRICE_GROSS', 'Artikelpreis (Brutto):');
-define('TEXT_PRODUCTS_WEIGHT', 'Artikelgewicht:');
-
-define('EMPTY_CATEGORY', 'Leere Kategorie');
-
-define('TEXT_HOW_TO_COPY', 'Kopiermethode:');
-define('TEXT_COPY_AS_LINK', 'Produkt verlinken');
-define('TEXT_COPY_AS_DUPLICATE', 'Produkt duplizieren');
-
-define('ERROR_CANNOT_LINK_TO_SAME_CATEGORY', 'Fehler: Produkte k&ouml;nnen nicht in der gleichen Kategorie verlinkt werden.');
-define('ERROR_CATALOG_IMAGE_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Verzeichnis \'images\' im Katalogverzeichnis ist schreibgesch&uuml;tzt: ' . DIR_FS_CATALOG_IMAGES);
-define('ERROR_CATALOG_IMAGE_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Verzeichnis \'images\' im Katalogverzeichnis ist nicht vorhanden: ' . DIR_FS_CATALOG_IMAGES);
-define('ERROR_CANNOT_MOVE_CATEGORY_TO_PARENT', 'Error: Category cannot be moved into child category.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/configuration.php 2.3.1.src/admin/includes/languages/german/configuration.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/configuration.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/configuration.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: configuration.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_CONFIGURATION_TITLE', 'Name');
-define('TABLE_HEADING_CONFIGURATION_VALUE', 'Wert');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/countries.php 2.3.1.src/admin/includes/languages/german/countries.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/countries.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/countries.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: countries.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'L&auml;nder');
-
-define('TABLE_HEADING_COUNTRY_NAME', 'Land');
-define('TABLE_HEADING_COUNTRY_CODES', 'ISO Codes');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_COUNTRY_NAME', 'Name:');
-define('TEXT_INFO_COUNTRY_CODE_2', 'ISO Code (2):');
-define('TEXT_INFO_COUNTRY_CODE_3', 'ISO Code (3):');
-define('TEXT_INFO_ADDRESS_FORMAT', 'Adressformat:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie das neue Land mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie das Land l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_COUNTRY', 'neues Land');
-define('TEXT_INFO_HEADING_EDIT_COUNTRY', 'Land bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_COUNTRY', 'Land l&ouml;schen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/currencies.php 2.3.1.src/admin/includes/languages/german/currencies.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/currencies.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/currencies.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'W&auml;hrungen');
-
-define('TABLE_HEADING_CURRENCY_NAME', 'W&auml;hrung');
-define('TABLE_HEADING_CURRENCY_CODES', 'K&uuml;rzel');
-define('TABLE_HEADING_CURRENCY_VALUE', 'Wert');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_CURRENCY_TITLE', 'Name:');
-define('TEXT_INFO_CURRENCY_CODE', 'K&uuml;rzel:');
-define('TEXT_INFO_CURRENCY_SYMBOL_LEFT', 'Symbol Links:');
-define('TEXT_INFO_CURRENCY_SYMBOL_RIGHT', 'Symbol Rechts:');
-define('TEXT_INFO_CURRENCY_DECIMAL_POINT', 'Dezimalkomma:');
-define('TEXT_INFO_CURRENCY_THOUSANDS_POINT', 'Tausenderpunkt:');
-define('TEXT_INFO_CURRENCY_DECIMAL_PLACES', 'Dezimalstellen:');
-define('TEXT_INFO_CURRENCY_LAST_UPDATED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_CURRENCY_VALUE', 'Wert:');
-define('TEXT_INFO_CURRENCY_EXAMPLE', 'Beispiel:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie die neue W&auml;hrung mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie diese W&auml;hrung l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_CURRENCY', 'neue W&auml;hrung');
-define('TEXT_INFO_HEADING_EDIT_CURRENCY', 'W&auml;hrung bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_CURRENCY', 'W&auml;hrung l&ouml;schen');
-define('TEXT_INFO_SET_AS_DEFAULT', TEXT_SET_DEFAULT . ' (manuelles Aktualisieren der Wechselkurse erforderlich.)');
-define('TEXT_INFO_CURRENCY_UPDATED', 'The exchange rate for %s (%s) was updated successfully via %s.');
-
-define('ERROR_REMOVE_DEFAULT_CURRENCY', 'Fehler: Die Standardw&auml;hrung darf nicht gel&ouml;scht werden. Bitte definieren Sie eine neue Standardw&auml;hrung und wiederholen Sie den Vorgang.');
-define('ERROR_CURRENCY_INVALID', 'Error: The exchange rate for %s (%s) was not updated via %s. Is it a valid currency code?');
-define('WARNING_PRIMARY_SERVER_FAILED', 'Warning: The primary exchange rate server (%s) failed for %s (%s) - trying the secondary exchange rate server.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/customers.php 2.3.1.src/admin/includes/languages/german/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Kunden');
-define('HEADING_TITLE_SEARCH', 'Suche:');
-
-define('TABLE_HEADING_FIRSTNAME', 'Vorname');
-define('TABLE_HEADING_LASTNAME', 'Nachname');
-define('TABLE_HEADING_ACCOUNT_CREATED', 'Zugang erstellt am');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_DATE_ACCOUNT_CREATED', 'Zugang erstellt am:');
-define('TEXT_DATE_ACCOUNT_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_DATE_LAST_LOGON', 'letzte Anmeldung:');
-define('TEXT_INFO_NUMBER_OF_LOGONS', 'Anzahl der Anmeldungen:');
-define('TEXT_INFO_COUNTRY', 'Land:');
-define('TEXT_INFO_NUMBER_OF_REVIEWS', 'Anzahl der Artikelbewertungen:');
-define('TEXT_DELETE_INTRO', 'Wollen Sie diesen Kunden wirklich l&ouml;schen?');
-define('TEXT_DELETE_REVIEWS', '%s Bewertung(en) l&ouml;schen');
-define('TEXT_INFO_HEADING_DELETE_CUSTOMER', 'Kunden l&ouml;schen');
-define('TYPE_BELOW', 'Bitte unten eingeben');
-define('PLEASE_SELECT', 'Auswhlen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/define_language.php 2.3.1.src/admin/includes/languages/german/define_language.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/define_language.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/define_language.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: define_language.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Sprache definieren');
-
-define('TEXT_FILE_DOES_NOT_EXIST', 'Datei nicht vorhanden.');
-
-define('ERROR_FILE_NOT_WRITEABLE', 'Fehler: Die Datei ist schreibgesch&uuml;tzt. Bitte korrigieren Sie die Zugriffsrechte f&uuml;r: %s');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/file_manager.php 2.3.1.src/admin/includes/languages/german/file_manager.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/file_manager.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/file_manager.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: file_manager.php 1817 2008-01-14 13:44:39Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Datei-Manager');
-
-define('TABLE_HEADING_FILENAME', 'Name');
-define('TABLE_HEADING_SIZE', 'Gr&ouml;sse');
-define('TABLE_HEADING_PERMISSIONS', 'Zugriffsrechte');
-define('TABLE_HEADING_USER', 'Benutzer');
-define('TABLE_HEADING_GROUP', 'Gruppe');
-define('TABLE_HEADING_LAST_MODIFIED', 'letzte &Auml;nderung');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_HEADING_UPLOAD', 'Upload');
-define('TEXT_FILE_NAME', 'Dateiname:');
-define('TEXT_FILE_SIZE', 'Gr&ouml;sse:');
-define('TEXT_FILE_CONTENTS', 'Inhalt:');
-define('TEXT_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_NEW_FOLDER', 'Neues Verzeichnis');
-define('TEXT_NEW_FOLDER_INTRO', 'Geben Sie den Namen f&uuml;r das neue Verzeichnis ein:');
-define('TEXT_DELETE_INTRO', 'Sind Sie sicher, dass Sie diese Datei l&ouml;schen m&ouml;chten?');
-define('TEXT_UPLOAD_INTRO', 'Bitte die Dateien ausw&auml;hlen, welche hochgeladen werden sollen.');
-
-define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Verzeichnis ist schreibgesch&uuml;tzt. Bitte korrigieren Sie die Zugriffsrechte f&uuml;r: %s !');
-define('ERROR_FILE_NOT_WRITEABLE', 'Fehler: Die Datei ist schreibgesch&uuml;tzt. Bitte korrigieren Sie die Zugriffsrechte f&uuml;r: %s !');
-define('ERROR_DIRECTORY_NOT_REMOVEABLE', 'Fehler: Das Verzeichnis kann nicht gel&ouml;scht werden. Bitte korrigieren Sie die Zugriffsrechte f&uuml;r: %s !');
-define('ERROR_FILE_NOT_REMOVEABLE', 'Fehler: Die Datei kann nicht gel&ouml;scht werden. Bitte korrigieren Sie die Zugriffsrechte f&uuml;r: %s !');
-define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Verzeichnis %s existiert nicht!');
-define('ERROR_FILENAME_EMPTY', 'Fehler: Bitte geben Sie einen Dateinamen an.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/geo_zones.php 2.3.1.src/admin/includes/languages/german/geo_zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/geo_zones.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/geo_zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,48 +0,0 @@
-<?php
-/*
-  $Id: geo_zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Steuerzonen');
-
-define('TABLE_HEADING_COUNTRY', 'Land');
-define('TABLE_HEADING_COUNTRY_ZONE', 'Bundesland');
-define('TABLE_HEADING_TAX_ZONES', 'Steuerzonen');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_HEADING_NEW_ZONE', 'Neue Steuerzone');
-define('TEXT_INFO_NEW_ZONE_INTRO', 'Bitte geben Sie die neue Steuerzone mit allen relevanten Daten ein');
-
-define('TEXT_INFO_HEADING_EDIT_ZONE', 'Steuerzone bearbeiten');
-define('TEXT_INFO_EDIT_ZONE_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch.');
-
-define('TEXT_INFO_HEADING_DELETE_ZONE', 'Steuerzone l&ouml;schen');
-define('TEXT_INFO_DELETE_ZONE_INTRO', 'Sind Sie sicher, dass Sie diese Steuerzone l&ouml;schen wollen?');
-
-define('TEXT_INFO_HEADING_NEW_SUB_ZONE', 'Neue Unterzone');
-define('TEXT_INFO_NEW_SUB_ZONE_INTRO', 'Bitte geben Sie die neue Unterzone mit allen relevanten Daten ein');
-
-define('TEXT_INFO_HEADING_EDIT_SUB_ZONE', 'Unterzone bearbeiten');
-define('TEXT_INFO_EDIT_SUB_ZONE_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch.');
-
-define('TEXT_INFO_HEADING_DELETE_SUB_ZONE', 'Unterzone l&ouml;schen');
-define('TEXT_INFO_DELETE_SUB_ZONE_INTRO', 'Sind Sie sicher, dass Sie diese Unterzone l&ouml;schen wollen?');
-
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_ZONE_NAME', 'Name der Steuerzone:');
-define('TEXT_INFO_NUMBER_ZONES', 'Anzahl der Steuerzonen:');
-define('TEXT_INFO_ZONE_DESCRIPTION', 'Beschreibung:');
-define('TEXT_INFO_COUNTRY', 'Land:');
-define('TEXT_INFO_COUNTRY_ZONE', 'Bundesland:');
-define('TYPE_BELOW', 'Alle Bundesl&auml;nder');
-define('PLEASE_SELECT', 'Alle Bundesl&auml;nder');
-define('TEXT_ALL_COUNTRIES', 'Alle L&auml;nder');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_back.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_back.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_back.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_back.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-yO *]zӥPƻԩW
ǵׯ׾Kkز_~[˶mkl]7tڽ;׭ۣ,`Å7M7È|T˘-_˼rΚ1,t̕OͺtЮEV}(۸s{wn޾q
|8uƼkΛCgޔsӧs=wnG}Oީ築W_i7ݿGOϿ(h&XQ4F(VQdv M͉(,+C:8<#A)N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_backup.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_backup.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_backup.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_backup.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9y^9Q?[ʔ鵧ךJmuիX&
ǵ+k^zٳh&ƶ-kn}T7r޽;޸mzLx{S0Ì?-<0Ii޼Κ?s':4iΟK=zs֭EˎԣU_=\qǍ+|9rN}׹eϮ:ԯsҫW=vm=G _Rh&6`RD(VhfXaRt ($M͊,0(/C:C<(<#AiN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_cancel.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_cancel.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_cancel.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_cancel.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:қpF}Js*գLʵׯ׮u׳hM˶-ڬʝKnعWn޾È_+񷰍CvdˑW69ĠAgFӧV7aKvկi㖝7߿NאON<9GW.}zsץW?Νc.~΍ƳOO_?}	X}җ7F(^CVMb(!ء#" RYu052҈7vC#<Ah-L6P6TViXf\v\f͘dihlYi#tix|P͠j衈&袌6N:<j饘f<#A*ꨤJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_confirm.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_confirm.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_confirm.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_confirm.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aU    <t   M~%W~U}Ipnݶihl   !   ,    U   'EBihl	tx|0P*ärUHtJZجv˝JѮxL.W0v`6]t`A{tr	rr

þƺrڥ֡r	P_A<HP`Bq@`ƌ;~H -S˗\j9'p &ϝ9w|I%ˢH*]TfӧrHJիXZ%kU9KٳhӪ]+V΁pʝKݻxLÈ #KL9
-D& X ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_copy.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_copy.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_copy.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_copy.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{ּ&TO &4ӦPJJpX^˺5ׯ`Ê+跳gE۵nծmںqޭyxpan^|x0aÊG.|Ten/_3͘C,:4iqUZsѬ_|zؗ۽Zo|-wpܢG&tܨ[ݫh篡>}\ӣ+=}w3(́&,FxT6Vhfbx6 ($h(x9`0(4hN:@8O:DCH&BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_copy_to.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_copy_to.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_copy_to.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_copy_to.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RמJ(S jzmk׭`ÊKٲ_ƻ۶}Kݻx;wo|oF8a
;n<pÌ/CLY2ǵzMz5oK6zԫQ&Ҧo};1ݥN|xƋ_͓Ggs֓c|t±S=x㊏{Oz7Up㿶_?~`X 8"UThaX!f!~ȍ(j"*x\͌4xM7ڨ;v=cB
-i#4Id72>)>RiXfWm`)׌ihc^͛p)tixWi矀*蠄j衈&jPͣF*餔Vj饘fN:l*ꨤj<#A꫰JN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_delete.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_delete.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_delete.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-&O *wmҦLJ}:UGiׯ`n*l٣Ҫvmkpۦ+7\pҽkmڣvmp#N.c/^<˘]|y3͞?ssfЧ9_iњᾆlҮWǻ7ky=ŏ+<yܢKvmzұg];~l_3O}ӣ_.ϗϿ Qh&6QD(VhfXQt ($M͊,0(/C:C<(<#AiN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_details.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_details.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_details.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_details.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA     <t   ~%WM~U}Ipihlݲn   !     ,    A   ` EBihl{J8iAmx|QG,}R l:ШtJJ˪v˥^Y`Lg@
( =׷dcm

mmddýпcӿmcm 
-AkSÇ<,p!`܈Qĉ?IImR\ɲ˗0ct͛8sɳOmJѣH*5zEPJJիXv`ÊB$\]vB  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_edit.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_edit.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_edit.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_edit.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ5
-(S ju뵯׺5,ٮfϪ]jpʍ{
nݹx;w/߿^FÆVl㯄C9o/eWM4kQV4ꯩY>M5ڴa6Uq.|Ǒ?xsq̋Cw.]ĳtЍ;uɯ]Up˟/Z}n_|( }w76^!6(arnxav8!$BxU7(*"X)x͋01~ec3?DiH&	U4PF)TViXVyU6\v`)did^͚lp)tiB6|矀*蠄j衄C:鼃裐F*Î@E馜v)9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_email.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_email.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_email.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_email.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-yeQ?[ʴӧ]k*өV&
ǵׯ`I:6kf&ƶ۷ߤJe{-.]t/ۤL`È'&mqcƐ'G,gLeqAmy2ry5kխ]۸s_
nwoqݛqI)_μ5ϟ;W.:՛k_wqKxɣ/=˟O_~mϿ T6h&"6F(VhRx9` ($hN:08O:DC8BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_file_manager.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_file_manager.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_file_manager.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_file_manager.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RמJ}@X^ۺ5W_z튕سhӢ۶}Kw.ݻuۊ߿VF0k!>U1ŏ'VLb[%7.Έ3OV՛Ӧz5ק[Zukۮ_o7oٺ*׎K|s̑??yΣO:؉c>w?*=7m? nUx
-Ƞ~NUdal!r!v8bx![)fXU78戣y:vã[Վ=X59dI>&$K:id:HXf\bdU͘dihlXjV͜tix|Ui#蠄j衈&袌6PͤVj饘f馜vN:|jꩨ<#A*무JN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_insert.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_insert.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_insert.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_insert.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9k^ymhϣ-ǔiѧךJUjժSjݪ4W׾;6,ٳhӒUmkn)]t待o^qz<Æ%l8qaĊ!GfرJi(ϛzӥQ&
zsfӬa>jԝE6o~8ÓG<r>ֹe;ݫgޝ<ynJW׺_/|׷>n'H~66F(!TVRdv ءRڔh(,M͌4h87C:D<#A5N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_invoice.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_invoice.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_invoice.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_invoice.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RמJ-@Xjzk׭`^Kٳa[˶۷}K7ܺx귿|-p^xqW7X2ă3kꭳϠC_<[ΣOViҭ=>:mUͻv.n8ƋN>r}K{uЁ+}s۝~wUpӫ_Zz᫗~ӇUq#h5"ȍ"Ƞ	6v%a.ȠXU7 ($^3$W +U0Ȣ$8:@)$C86H&L6PFdbRBYU6Xf\v`)`V͙hlp)B6x|矀*蠀C:C袌6Î@Ed饘f)9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_lock.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_lock.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_lock.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_lock.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-Z'xH"ҧPJJhX]˺5ׯ`Ê
kٳ߮=)ڦjӦm;,\s5kԛ߿ޮ˔_F`ō5*p-_Y\g̞9e˔O4\Ak~erޝZݾN\py3ʭsnמG.tԝ_ώ}F{/wۻ~o (5h&hT66F(Bh6fv rx9`c(,袊N:h88O:DC@)BSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_module_install.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_module_install.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_module_install.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_module_install.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89aa  h ƴ̴~%WM~@7`+2ȴIp˴ҼǪó^5U}Xzҿ:c*6Cz'+?in\~k=Cf
2$QL-.Y
2~(Wz6`>El-
-s%lBAaiRv33
-t%
-y'):h2\Vy	n#74=e@n@Fl@/ZTw4^9 <t                                                                        !  h ,    a   hd$Rgbgeg*3LϹdź'eg\%f\\]
=>4G] LOa!E&Lh1ď LiFǒ&Q,yrˑ,]IXe)8"DHɴ%JtjX2Śjצ=@#A+0X|@qÒ
-K׌Xw
w/޿z˗p߹a@$ʓE B{.|%a9FY0iÙiYkJVtx:۸ֽͬwo-Mw}?ܖПsBرyݷt/	yǧN
P ͸׿=JQh_^{a 
-`_fv!8_(b0,0"8^hc,#7@)D	H&BL6PF)HS cd\v`)dfBF80BlbR@ɝx'8F  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_module_remove.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_module_remove.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_module_remove.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_module_remove.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89aa  G ë~M~%WIpZZU}ѺƹĵXX,,99

7744˾RRKKMMi$$

((lhnCCÆ

ū <t                                                                                                                                                                           !  G ,    a   GC!
-FA
-		FDFŻC͸F;EE;<E:E v7AtT`@AA 3jǏE*эȑ$M4yʗ%S~y8,0`ͣHQzsiӧPq**ԩW&Mj&	 
-f|05nYN}+u/-jd@F4^0зEܗ2ɕ%_ޜ1gɒ Ө4ͺu"a={4mٷm][w߮]CBȓWH΃DrԧkW~|8ËO^94ӫ_Ͼ˟ZϿ (}`&6Fh/X ąfv (6., !h88
-G ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_move.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_move.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_move.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_move.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ6唪*ԞLʵkk^
K,ױfâM˖mppʕ{mnvꍋwݾ~ÈV\cƊ7~<7ʍ
?2ȒF՛ӨS_C[kӫ~
{׭smvlܩ*ȯW.yqΛ'nҫg;∃fsǮ=yw>xVp~7``~)ENVThV؅pM~(#8"$(d͌4h㌎ٸ5c\#?y>
-L(cPF)TVieYm\v`)d)fV٤lp)tƙ6x|矀*蠀
-E<$袌6裐F*餔F*9Nv駠Γ;ѩSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_banner.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_banner.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_banner.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_banner.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPd
- իW]úׯ`ZժUٳhR
Ƕm[nKݷx-o0`ÅaZXd˗#dT=7ӢQN}jקWfMtl۷i6ooT	>p#?r͉w,xtף/oޯWx<峟ǎlۻ*_n 
-X`~h` H7VX5jE!rá~vha+v(bR͌4xMZH78c?ֈ#<cdH
-餌NF)TViXRI6\v`)didR͚lp)tiTi|矀*蠄*P͢6裐F*餔VjN:\駠*<#AꪬJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_category.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_category.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_category.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_category.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP^@W]o+ׯ`~UlWhӪZ5[Z߆&ݻvŻ߿VFo
֪UŌ?F,qdƍ-g֜Ɖ9W&\՛i׼Ftխa>Z6ڴe=۵jثuVUqא+xˡ3?\:uӱczwܯ+}{u٣c;zOyUm _(W`
X7bxMh!n"~b%(b.ȢV͍7^c7Zሙ=#c;渣<J.=>#QicXf\v_Y6dihlI&fnifUix|矀Y6j衈&袌6裌
-E<Tj饘f馜v駠v*9NꪬΓ;
ѬjSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_country.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_country.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_country.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_country.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP^3@XjwZV[Ê,ٳef۷pu}{-ݻx._U	Lk#ܵ+c7V<aɎWf8eUMkGNի_6۴쮭g׶]wwqƃ?9ßGW9Ӆ>9t❿[okW}xUp˟Z|??_H8_U4rs̓]58^(Ja~Hah!BXU7,\bW-vV#2hc^82ݬL6PFdUTiXf\v`vYU6dihllV͜tix|B6j衈&袌6裌C:饘fÎ@E$ꨤZ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_currency.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_currency.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_currency.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_currency.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧGAE@X]o+ׯ`~zl׬gӊ]˶mppjݻx+.߽zÈ}S|b/Nqˎ#Wbɑ,pUoS_u֮YM;lثqώUkݾY];uUqȓ_C\\̝'N=t˟_ڕ[uٙN/쥣']{{wG^ N'`	2_BHNX*X7vxMh!$b /*V͎<^c7Z>#i?hdJ"$G&9O.9e\v`)&IV͙hlp'ilV͝x|矀*Uic衈&袌6裐FPͥf馜v駠*N:ꪬ<#Aj뭸JN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_file.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_file.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_file.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_file.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP^K@XjzZV[Êڵث`Ϫ[5۷p
-ܻxڝ7޾VFÅ}SLⲍ
;.8ɐ)3UMkPVzujҬan4jڸ_]~wqqǏG<ysʗ/:؅]9u㚯K]t͓7}xUp˟Z}p??矀W76
^`WJ!7bha>avxBh"Uu,5,vbY3Y;vC?,HH&L6IdUD)TViXf\fYU6`)dihhV͛p)tixB6*蠄j衈&袈C:褔VjÎ@E駠*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_folder.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_folder.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_folder.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_folder.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPm^)xXjvm֯`ÊʕXgӎ۷\ᾝK]nͻ^|[
ELXpÅ6<rdȏ-KvXsVM7ӢQN}4Ѧ=׬oޝ{umV	Np#?8Ɨo>=sԟK>ޟ7W٫w7=
-?W8`G "(Ẍ́VxrnjXh"v"8Vu#4^S2>6cY#=(\($6d@*9$1>)TViXfٍUt`)dihiU6lp)titZ͞|矀*蠄jB66裐F*餔Vj饔C:鼃駠*Î@Eꪬ*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_language.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_language.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_language.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_language.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧP}^@X^k֯`ÂݺUٳ=[5۷o½ݻv˷޾~Lo'FLVqd.<1bƊ-3N|XfɔWFtkPVzujӬa~=;uk[kmkߺIWGxkđS<r̡ONӟcnŇyҗ;z葽o}Up翶h` 7`.`_UTh\UbMv衉b a'haUhܸdc5Fv@vs^CiFHPTViE^UV͗`)di&לl~YU6p)tixxV͟*蠄j衈&B6F*餔Vj饘f馘C:騤jÎ@E꫰+9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_newsletter.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_newsletter.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_newsletter.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_newsletter.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,        +7*\ȰÇ#JdHn@s hȱǏ CIɓ!˗0cʌ  z8sɳϟ@
-JhP o]ʴӧMS
-Uz׆feukԤ]6,ٲhӪ]v[pמ+.ݹvJ.ؾ}L~FƏ,o߮eƼ[͝=s<-gѣQltkҙǊnYvl۠Y۾6޼]ÇWˡ3͝;]u̿gO^q⮡W~=zݷ>{go`sY>}%X	%_◟I^sM&"+x"04.c-ި=$8{q5F9I餒H>dQ&YU.)%V^d[Fy\ZM7׬Xn~'m閝pl{٦~gsY烉.gj)餔Vj饘f馜6*ꨤjꩨꪬ^b*무j뭸뮼ꫮ{i#k&6"E<Tkfv+N:Î@Md櫯SO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_product.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_product.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_product.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_product.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPs^9(S jwV[ÊKVk׳eӂlxWɝ+kt߾|+o81cg?l宊;nyeȑ5S8W^Zծ_Ö:vڴYu6o֮o˶[7+w-ysΗ7˳S޹KN9yؙn#W/:ٓw\" &`hH`w7v5v!H$+b#x3/vxU7<5>vcdC
-	$DxH2#I*	KR9dG:\v`)_^͙hlp)Wecx|矀Uj衈&袌6裐6*9`c饘f馜v駠<䨓;ꪬ:O:DPDj뭷N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_tax_class.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_tax_class.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_tax_class.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_tax_class.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89av    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    v    +7*\ȰÇ#*$Ns 2jȱǏ CIn3ɲ˗0A#͛8sɳϟ@
-	`͡H*]ʔgqGJNTq>/޵k]
Kٳa~M[cᾝkvkp_޽߿7}'Fo߮E<Zɕ-SLysg˜#Wͧ1WVZiט[oZmڷsӶmw޻q>m๑7uUkֱ_nvۻV|k=w/:/7]}__wu[5Nhbx!v!Jb#aH,XVpsM1~U#2X:ވ#>c@8BXL6I1nM7L9WV^%U^`jebRdhV)feJ	tix|6*蠄j衈&袌U6F*餔Vj饘f馜^6*ꨤjꩨꪬZ9`5#무j뭸뮼kN:j&Î@I$VkmBSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_tax_rate.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_tax_rate.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_tax_rate.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_tax_rate.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89av    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    v    +7*\ȰÇ#*$Ns 2jȱǏ CIn3ɲ˗0A#͛8sɳϟ@
-	`͡H*]ʔgqGJJUS jvMk^ÊKv+W_˪]6+ڵWɝunkv˗]w
-LX.`W)^|[cŏ1ɖVfɟ#sqh̞IN]װy6ڳaލؿq~{wqپ｜K8֫_ܫ<uɣ_{g?/޳{g|u\Mg߀Iw86x<aV(!R2f$2x7,xMp."4h#5:(#6?"y$0^͓P^e7\EyRJg[N%XnyYbdT	^)tixFm矀*蠄j衈&hWe裐F*餔Vj饘fiWi駠*ꨤjꩨjE63*무j뭸뮼*9Nk:O:DDF+&DN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_zone.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_zone.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_new_zone.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_new_zone.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89av    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    v    +7*\ȰÇ#*$Ns 2jȱǏ CIn3ɲ˗0A#͛8sɳϟ@
-	`͡H*]ʔgqGJPM>k]Kٳ~E˶,ضb}5ݯv˷߿^'.Lx׾EXZʕ'[reəCɧ;s֜t͜mF7۵sӾ{7nܹM\ŅV޻pȏǽUk׳n}ܹgiç>~=当W^\ußο~_wG{G8 w[#5C!VX!vza(b!~jXn͌HcHc6~c6:#=֨@⸤A:[uc5V^_eV7[]fe\ya~igy&aU|矀*蠃n͡&袌6裐F*餎nͥf馜v駠*ꨞnͩꪬ꫰>*묮E<뮼+<䨓;6F<#Aev9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_orders.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_orders.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_orders.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_orders.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ4EJ5'S jݚk\Æ+V+YeӪ]jp㾽ܻqw߿ÅVk㯐;Ƹa˓%OLWĠ_FiJFm:jխcۛWضe~5ǑKyϡ7g.qң.8ؗ/Ux'u߷_G}~~ꇟ UD(^3`X!jWJ衇RxU70(#_Řc77H^(8^#dF81PF)TYWm\v`)ZBF\^͚lp)tiWi|矀*蠄*P͢6裐F*餔VjN:\駠*<#AꪬJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_packingslip.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_packingslip.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_packingslip.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_packingslip.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:k<AUjsOTǵׯ׾;ٮaϪ]+)ppʝ{m]w[w߿v~Lk!,Uƌ!+~ň%WrφzMkV]j֤]~=zj۰kÖ;n	N''~\͙]ʯ_G=8w۟7n<̥Zxҿw_}H}x`[D(^C!7b8j(!FXvxb͋0(ytSc6?$Ax2&)J6PF)Tv6Xf\v`)`͙hlp)nicx|矀P͡&袌6裐F*N:L馜v<#AjꩨJN; ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_preview.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_preview.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_preview.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_preview.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-uymM^K4ҦPJetզ?zmp]Kkزhf۵n^6\tҕ.޽qꭰkFlƉ/^XrbǗgYܵΞ9yhСQN
tkЛ_^Ӫe筍sVp_|xqpƃO~|̙gFܮa׮Nuܲv[~.y῏߽v (h`V$6F`VThfvaVڄ($h(XM͋0(4h3C:鼃@i<#A%N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_reset.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_reset.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_reset.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_reset.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ4AthX^5ׯ]6lٳcѪ]{)ppʝ{mݻx͛w/߿~Lpk'x7Ō;~1Wˎf֌YqɆCFLFMz+׫^;vkղO=nn	N\Ǉ'OnrG|zqҏg~=8wԛ[/^ztk~zտw_?_~߂~̈́VxM^8VZrs!v(f#zX"nu#47#W\#5n>8d>g$<I2TViXfnm`)dihi[ٴp)tix6|矀*蠄j衄
-E<4裐F*餔Vj饘V*9N*ꨤΓ;ѪꪫSO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_restore.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_restore.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_restore.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_restore.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:hk@T@w-W_K+ٲgӪ֬ٵc\wKw/_
ܷ`Z]xƊ+FY2ˍ1G츲e͝3_-Ϟ;?5o_6ڳiƝٻem8n]UkΡCsӫg~ۥwݺv{oєK/|t/}i88"	B`X
^ f8V܄xM$(%rc#)b$5#8rU7@^BIeG
-YhF9d7EB$O2$eWbIRj?>)dihh͛p)tixZe矀*蠄j衈&jV4裐F*餔Vj饘V*9`駠*ꨤjꩨj<䨓;*무:O:DPD믿N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_save.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_save.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_save.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_save.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9y^9Q?[ʔ鵧ךJmuիX&
ǵ+k^zٳh&ƶ-kn}T7r޽;޸mzLx{S0Ì?-<0Ii޼Κ?s':4iΟK=zs֭EˎԣU_=\qǍ+|9rN}׹eϮ:ԯsҫW=vm=G _Rh&6`RD(VhfXaRt ($M͊,0(/C:C<(<#AiN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_search.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_search.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_search.gif	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_search.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{&tO *]z鵥P&}*եGiݺW\Ê+YG]۶lݪu:ݶw}_,8`o#N|8⦅	>*NYּ2Π?,ZeqO:Ҟ3ƼQps}
wܿ{78Ǎ>ʭsמG6ѫSo=v}O|fM]#tz۫7_Ͽ(h&XQ4F(VQdv M͉(,+C:8<#A)N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_select.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_select.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_select.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_select.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧ@
-'S jʕk]Êl<^Ǫ]jpʕuݻxڽ߷W	L0k'><o!7NxqŔKlBMzЧQVԫNM;6lإs*}_=\\ŏ7\rɑg<༯k.ϛw<;uk~G}N?|g_~gWq65B2XVȍ>av^͉(׬b7b((c3~+BiH&B^͓PF)TViXfWe`)dihiUڴp)tix)9`矀*蠄j衈&j<䨓;F*餔V:O:DPDv駟N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_send.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_send.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_send.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_send.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aA    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    A    +7*\ȰAr;ŋ3jȱnHIǲ˗0cʜI&+kɓq9{
-mymh̟ )]kLJ*իRu뵮_;6,ٳd~[vmi\n.\|m9MxpaĄ	ClRq3gY5q;<Ztḩ5cuiNKvԩU#ǻx=\qV7RnУC&:7ӯW>:vKWNۛg/?=Ͽ!̀h&"̓F(Vh"͆v (D<ؤ,0آ<䨓;20Γ;АD9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_send_mail.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_send_mail.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_send_mail.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_send_mail.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RhF}s*ULʵ׮׮+ٲh~=m׬ʝKwnXͫ_|
-È
k7Ǐ#7^ܸrǔ13yrŐw|9ӨSXMvkղaE-;7m߮s:ȓ+Nzsҡg9rЧ7.9haG]筷}ӳϿk߃
-
-*7f!ha"܈a%zb&r#xYuc8M<$8dX<#C.>FMRViXfRf͗`)dihYep)tixigV矀*蠄j衈*9`裐F*餔Vj饘fj<䨓;*ꨤ:O:DPDꫯN= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_unlock.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_unlock.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_unlock.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_unlock.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:ҧPd
- իX^ƵV׾KٱTé]˶kn㪅+ݻx߿^mp׾]">lXbǍ<reSƹϝ54gѦ=>MZ5iԯS^zTͻ\u_=\\q὏_9͕+M]wا?>K'ܹy쾩[Ͼ{ރ=^'߀Tqc&x5
-r> :h!f 6!Tu#$8bx"^C)rMb-vu/X"5h&@i"BiTmL6PFyMTViTe\v`)d)&Uڤlp)t)9`|矀*蠄*<䨓;6裐F:O:DPDf馛N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_update_currencies.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_update_currencies.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_update_currencies.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_update_currencies.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,        +7*\ȰÇ#JHqu͝Ǐ CIɓ(S\	XʜI͛#@ϟ@
-JѣH*]'<JJիCJ֯E^K,P`6޵nev\x˷o߻m
<aj)wm1cǍ/,˘3k\fΟCoNNm׮QV-i۫g6m߷[Z6۬..|vuCϝZoؽ]˾};vٵk5G/xٷW>{/Oި%΀^S8"H&x:	R.a^>~8!
-
F[8b"9$6Xj׀$NBdOJYeSbiQ^`bI%U^Zz٥\j&Z͜t^CvyyM~9hJ(騠(yZzZJZt5v
-ꧼu3
-~J*꬯6멫Z+jJk)&6묲>+Vkmjmv-ok覫nje+kZ,l'79`cgw ,$|<䨓;&0,Î@U<	N= ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_update.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_update.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_update.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_update.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:(kJqB75gըFǵW׮O,ٳ_͢]˶xZɝKnXu]7޾,WÈ#vqJqɔ3_1fƜ7;ZoZ^z5կa˞M[֯cnmv۷{uͻVqȓ+G~Mysq͟3wN}9إ'=zݭ?.{vاo.{z롷w|~iǿ] 8W"8`&HBa7f!7l bXva&a%(j͍85:<<c{?$8.i$Jd8HXf\ve7Zm#dihlV)tix|橕6*蠄j衈&袈
-E<D*餔Vj饘f馜f*9NjꩨΓ;ѫ*SO@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_upload.gif 2.3.1.src/admin/includes/languages/german/images/buttons/button_upload.gif
--- 2.2rc2a.cp.src/admin/includes/languages/german/images/buttons/button_upload.gif	2008-01-31 16:34:16.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/images/buttons/button_upload.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ai    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3    <tM~%WU}ݿIphiln~ÿ                              !   ,    i    +7*\ȰÇ['9 3jȱǏ C鱛H\ɲKG͛8sɳϟ<	ѣH:RrF9O iʵkk_
-kٱ\Ϣ]V+ppʝ;Z]xڥ7ܾ~È'ǌ
Cm2eɖ+CrfŠcFӧ&^n
k۱q?voNf
W|sq͍Cw}zų{rӅ3=<O{q˟O5˿| N% V4Bx
Nrvȡnx!#FhXu,5/658c77CHH&L6I$VD)TViXf\fU6`)dihhb͛p)tixB6*蠄j衈&袈C:褔VjÎ@E駠*9 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/index.php 2.3.1.src/admin/includes/languages/german/index.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/index.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/index.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,38 +0,0 @@
-<?php
-/*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2006 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Option w&auml;hlen ...');
-
-define('BOX_TITLE_ORDERS', 'Bestellungen');
-define('BOX_TITLE_STATISTICS', 'Statistik');
-
-define('BOX_ENTRY_SUPPORT_SITE', 'Support Seite');
-define('BOX_ENTRY_SUPPORT_FORUMS', 'Support Forum');
-define('BOX_ENTRY_CONTRIBUTIONS', 'Add-On Module');
-
-define('BOX_ENTRY_CUSTOMERS', 'Kunden:');
-define('BOX_ENTRY_PRODUCTS', 'Produkte:');
-define('BOX_ENTRY_REVIEWS', 'Bewertungen:');
-
-define('BOX_CONNECTION_PROTECTED', 'Sie sind gesichert durch eine %s sichere SSL Verbindung.');
-define('BOX_CONNECTION_UNPROTECTED', 'Sie sind <font color="#ff0000">nicht</font> durch eine sichere SSL Verbindung gesichert.');
-define('BOX_CONNECTION_UNKNOWN', 'unbekannt');
-
-define('CATALOG_CONTENTS', 'Inhalt');
-
-define('REPORTS_PRODUCTS', 'Produkte');
-define('REPORTS_ORDERS', 'Bestellungen');
-
-define('TOOLS_BACKUP', 'Datensicherung');
-define('TOOLS_BANNERS', 'Bannerverwaltung');
-define('TOOLS_FILES', 'Dateiverwaltung');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/invoice.php 2.3.1.src/admin/includes/languages/german/invoice.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/invoice.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/invoice.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-/*
-  $Id: invoice.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_COMMENTS', 'Kommentar');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Artikel-Nr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_TAX', 'MwSt.');
-define('TABLE_HEADING_TOTAL', 'Summe');
-define('TABLE_HEADING_PRICE_EXCLUDING_TAX', 'Preis (exkl.)');
-define('TABLE_HEADING_PRICE_INCLUDING_TAX', 'Preis (inkl.)');
-define('TABLE_HEADING_TOTAL_EXCLUDING_TAX', 'Summe (exkl.)');
-define('TABLE_HEADING_TOTAL_INCLUDING_TAX', 'Summe (inkl.)');
-
-define('ENTRY_SOLD_TO', 'Rechnungsanschrift:');
-define('ENTRY_SHIP_TO', 'Lieferanschrift:');
-define('ENTRY_PAYMENT_METHOD', 'Zahlungsweise:');
-define('ENTRY_SUB_TOTAL', 'Zwischensumme:');
-define('ENTRY_TAX', 'MwSt.:');
-define('ENTRY_SHIPPING', 'Versandkosten:');
-define('ENTRY_TOTAL', 'Gesamtsumme:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/languages.php 2.3.1.src/admin/includes/languages/german/languages.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/languages.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/languages.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: languages.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Sprachen');
-
-define('TABLE_HEADING_LANGUAGE_NAME', 'Name');
-define('TABLE_HEADING_LANGUAGE_CODE', 'Codierung');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_LANGUAGE_NAME', 'Name:');
-define('TEXT_INFO_LANGUAGE_CODE', 'Codierung:');
-define('TEXT_INFO_LANGUAGE_IMAGE', 'Symbol:');
-define('TEXT_INFO_LANGUAGE_DIRECTORY', 'Verzeichnis:');
-define('TEXT_INFO_LANGUAGE_SORT_ORDER', 'Sortierreihenfolge:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie die neue Sprache mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie die Sprache l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_LANGUAGE', 'Neue Sprache');
-define('TEXT_INFO_HEADING_EDIT_LANGUAGE', 'Sprache bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_LANGUAGE', 'Sprache l&ouml;schen');
-
-define('ERROR_REMOVE_DEFAULT_LANGUAGE', 'Fehler: Die Standardsprache darf nicht gel&ouml;scht werden. Bitte definieren Sie eine neue Standardsprache und wiederholen Sie den Vorgang.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/login.php 2.3.1.src/admin/includes/languages/german/login.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/login.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/login.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Administrator Login');
-
-define('TEXT_USERNAME', 'Username:');
-define('TEXT_PASSWORD', 'Password:');
-
-define('TEXT_CREATE_FIRST_ADMINISTRATOR', 'No administrators exist in the database table. Please fill in the following information to create the first administrator. (A manual login is still required after this step)');
-
-define('ERROR_INVALID_ADMINISTRATOR', 'Error: Invalid administrator login attempt.');
-
-define('BUTTON_LOGIN', 'Login');
-define('BUTTON_CREATE_ADMINISTRATOR', 'Create Administrator');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/mail.php 2.3.1.src/admin/includes/languages/german/mail.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/mail.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/mail.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: mail.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'eMail an Kunden versenden');
-
-define('TEXT_CUSTOMER', 'Kunde:');
-define('TEXT_SUBJECT', 'Betreff:');
-define('TEXT_FROM', 'Absender:');
-define('TEXT_MESSAGE', 'Nachricht:');
-define('TEXT_SELECT_CUSTOMER', 'Kunden ausw&auml;hlen');
-define('TEXT_ALL_CUSTOMERS', 'Alle Kunden');
-define('TEXT_NEWSLETTER_CUSTOMERS', 'An alle Newsletter-Abonnenten');
-
-define('NOTICE_EMAIL_SENT_TO', 'Hinweis: eMail wurde versendet an: %s');
-define('ERROR_NO_CUSTOMER_SELECTED', 'Fehler: Es wurde kein Kunde ausgew&auml;hlt.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/manufacturers.php 2.3.1.src/admin/includes/languages/german/manufacturers.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/manufacturers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/manufacturers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: manufacturers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Hersteller');
-
-define('TABLE_HEADING_MANUFACTURERS', 'Hersteller');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_HEADING_NEW_MANUFACTURER', 'Neuer Hersteller');
-define('TEXT_HEADING_EDIT_MANUFACTURER', 'Hersteller bearbeiten');
-define('TEXT_HEADING_DELETE_MANUFACTURER', 'Hersteller l&ouml;schen');
-
-define('TEXT_MANUFACTURERS', 'Hersteller:');
-define('TEXT_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_LAST_MODIFIED', 'letzte &Auml;nderung am:');
-define('TEXT_PRODUCTS', 'Artikel:');
-define('TEXT_IMAGE_NONEXISTENT', 'BILD NICHT VORHANDEN');
-
-define('TEXT_NEW_INTRO', 'Bitte geben Sie den neuen Hersteller mit allen relevanten Daten ein.');
-define('TEXT_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-
-define('TEXT_MANUFACTURERS_NAME', 'Herstellername:');
-define('TEXT_MANUFACTURERS_IMAGE', 'Herstellerbild:');
-define('TEXT_MANUFACTURERS_URL', 'Hersteller URL:');
-
-define('TEXT_DELETE_INTRO', 'Sind Sie sicher, dass Sie diesen Hersteller l&ouml;schen m&ouml;chten?');
-define('TEXT_DELETE_IMAGE', 'Hersteller Image l&ouml;schen?');
-define('TEXT_DELETE_PRODUCTS', 'Alle Artikel von diesem Hersteller l&ouml;schen? (inkl. Bewertungen, Angebote und Neuerscheinungen)');
-define('TEXT_DELETE_WARNING_PRODUCTS', '<b>WARNUNG:</b> Es existieren noch %s Artikel, welche mit diesem Hersteller verbunden sind!');
-
-define('ERROR_DIRECTORY_NOT_WRITEABLE', 'Fehler: Das Verzeichnis %s ist schreibgesch&uuml;tzt. Bitte korrigieren Sie die Zugriffsrechte zu diesem Verzeichnis!');
-define('ERROR_DIRECTORY_DOES_NOT_EXIST', 'Fehler: Das Verzeichnis %s existiert nicht!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/modules/index/customers.php 2.3.1.src/admin/includes/languages/german/modules/index/customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/modules/index/customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/modules/index/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define(ADMIN_INDEX_CUSTOMERS_TITLE, 'Customers');
-define(ADMIN_INDEX_CUSTOMERS_DATE, 'Date');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/modules/index/orders.php 2.3.1.src/admin/includes/languages/german/modules/index/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/modules/index/orders.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/modules/index/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('ADMIN_INDEX_ORDERS_TITLE', 'Orders');
-define('ADMIN_INDEX_ORDERS_TOTAL', 'Total');
-define('ADMIN_INDEX_ORDERS_DATE', 'Date');
-define('ADMIN_INDEX_ORDERS_STATUS', 'Status');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/modules/newsletters/newsletter.php 2.3.1.src/admin/includes/languages/german/modules/newsletters/newsletter.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/modules/newsletters/newsletter.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/modules/newsletters/newsletter.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-<?php
-/*
-  $Id: newsletter.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_COUNT_CUSTOMERS', 'Anzahl der Kunden, welche das Rundschreiben erhalten: %s');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/modules/newsletters/product_notification.php 2.3.1.src/admin/includes/languages/german/modules/newsletters/product_notification.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/modules/newsletters/product_notification.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/modules/newsletters/product_notification.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: product_notification.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_COUNT_CUSTOMERS', 'Anzahl der Kunden, welche das Rundschreiben erhalten: %s');
-define('TEXT_PRODUCTS', 'Produkte');
-define('TEXT_SELECTED_PRODUCTS', 'ausgew&auml;hlte Produkte');
-
-define('JS_PLEASE_SELECT_PRODUCTS', 'Bitte whlen Sie zumindest ein Produkt aus!');
-
-define('BUTTON_GLOBAL', 'Global');
-define('BUTTON_SELECT', '>>>');
-define('BUTTON_UNSELECT', '<<<');
-define('BUTTON_SUBMIT', 'Weiter');
-define('BUTTON_CANCEL', 'Abbrechen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/modules.php 2.3.1.src/admin/includes/languages/german/modules.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/modules.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/modules.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: modules.php 1802 2008-01-11 16:59:17Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE_MODULES_PAYMENT', 'Zahlungsweisen');
-define('HEADING_TITLE_MODULES_SHIPPING', 'Versandarten');
-define('HEADING_TITLE_MODULES_ORDER_TOTAL', 'Modul Zusammenfassung einer Bestellung');
-
-define('TABLE_HEADING_MODULES', 'Module');
-define('TABLE_HEADING_SORT_ORDER', 'Reihenfolge');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_VERSION', 'Version:');
-define('TEXT_INFO_ONLINE_STATUS', 'online status');
-
-define('TEXT_MODULE_DIRECTORY', 'Modul Verzeichnis:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/newsletters.php 2.3.1.src/admin/includes/languages/german/newsletters.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/newsletters.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/newsletters.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Rundschreiben Verwaltung');
-
-define('TABLE_HEADING_NEWSLETTERS', 'Rundschreiben');
-define('TABLE_HEADING_SIZE', 'Gr&ouml;sse');
-define('TABLE_HEADING_MODULE', 'Module');
-define('TABLE_HEADING_SENT', 'Gesendet');
-define('TABLE_HEADING_STATUS', 'Status');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_NEWSLETTER_MODULE', 'Module:');
-define('TEXT_NEWSLETTER_TITLE', 'Titel des Rundschreibens:');
-define('TEXT_NEWSLETTER_CONTENT', 'Inhalt:');
-
-define('TEXT_NEWSLETTER_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_NEWSLETTER_DATE_SENT', 'Datum gesendet:');
-
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie dieses Rundschreiben l&ouml;schen m&ouml;chten?');
-
-define('TEXT_PLEASE_WAIT', 'Bitte warten Sie .. eMails werden gesendet ..<br><br>Bitte unterbrechen Sie diesen Prozess nicht!');
-define('TEXT_FINISHED_SENDING_EMAILS', 'eMails wurden versendet!');
-
-define('ERROR_NEWSLETTER_TITLE', 'Fehler: Ein Titel f&uuml;r das Rundschreiben ist erforderlich.');
-define('ERROR_NEWSLETTER_MODULE', 'Fehler: Das Newsletter Modul wird ben&ouml;tigt.');
-define('ERROR_REMOVE_UNLOCKED_NEWSLETTER', 'Fehler: Bitte sperren Sie das Rundschreiben bevor Sie es l&ouml;schen.');
-define('ERROR_EDIT_UNLOCKED_NEWSLETTER', 'Fehler: Bitte sperren Sie das Rundschreiben bevor Sie es bearbeiten.');
-define('ERROR_SEND_UNLOCKED_NEWSLETTER', 'Fehler: Bitte sperren Sie das Rundschreiben bevor Sie es versenden.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/orders.php 2.3.1.src/admin/includes/languages/german/orders.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/orders.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,79 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Bestellungen');
-define('HEADING_TITLE_SEARCH', 'Bestell-Nr.:');
-define('HEADING_TITLE_STATUS', 'Status:');
-
-define('TABLE_HEADING_COMMENTS', 'Kommentar');
-define('TABLE_HEADING_CUSTOMERS', 'Kunde');
-define('TABLE_HEADING_ORDER_TOTAL', 'Gesamtwert');
-define('TABLE_HEADING_DATE_PURCHASED', 'Bestelldatum');
-define('TABLE_HEADING_STATUS', 'Status');
-define('TABLE_HEADING_ACTION', 'Aktion');
-define('TABLE_HEADING_QUANTITY', 'Anzahl');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Artikel-Nr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_TAX', 'MwSt.');
-define('TABLE_HEADING_TOTAL', 'Gesamtsumme');
-define('TABLE_HEADING_PRICE_EXCLUDING_TAX', 'Preis (exkl.)');
-define('TABLE_HEADING_PRICE_INCLUDING_TAX', 'Preis (inkl.)');
-define('TABLE_HEADING_TOTAL_EXCLUDING_TAX', 'Total (exkl.)');
-define('TABLE_HEADING_TOTAL_INCLUDING_TAX', 'Total (inkl.)');
-
-define('TABLE_HEADING_CUSTOMER_NOTIFIED', 'Kunde benachrichtigt');
-define('TABLE_HEADING_DATE_ADDED', 'hinzugef&uuml;gt am:');
-
-define('ENTRY_CUSTOMER', 'Kunde:');
-define('ENTRY_SOLD_TO', 'Kunde:');
-define('ENTRY_DELIVERY_TO', 'Lieferanschrift:');
-define('ENTRY_SHIP_TO', 'Lieferanschrift:');
-define('ENTRY_SHIPPING_ADDRESS', 'Versandadresse:');
-define('ENTRY_BILLING_ADDRESS', 'Rechnungsadresse:');
-define('ENTRY_PAYMENT_METHOD', 'Zahlungsweise:');
-define('ENTRY_CREDIT_CARD_TYPE', 'Kreditkartentyp:');
-define('ENTRY_CREDIT_CARD_OWNER', 'Kreditkarteninhaber:');
-define('ENTRY_CREDIT_CARD_NUMBER', 'Kerditkartennnummer:');
-define('ENTRY_CREDIT_CARD_EXPIRES', 'Kreditkarte l&auml;uft ab am:');
-define('ENTRY_SUB_TOTAL', 'Zwischensumme:');
-define('ENTRY_TAX', 'MwSt.:');
-define('ENTRY_SHIPPING', 'Versandkosten:');
-define('ENTRY_TOTAL', 'Gesamtsumme:');
-define('ENTRY_DATE_PURCHASED', 'Bestelldatum:');
-define('ENTRY_STATUS', 'Status:');
-define('ENTRY_DATE_LAST_UPDATED', 'letzte Aktualisierung am:');
-define('ENTRY_NOTIFY_CUSTOMER', 'Kunde benachrichtigen:');
-define('ENTRY_NOTIFY_COMMENTS', 'Kommentare mitsenden:');
-define('ENTRY_PRINTABLE', 'Rechnung drucken');
-
-define('TEXT_INFO_HEADING_DELETE_ORDER', 'Bestellung l&ouml;schen');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, das Sie diese Bestellung l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_RESTOCK_PRODUCT_QUANTITY', 'Artikelanzahl dem Lager gutschreiben');
-define('TEXT_DATE_ORDER_CREATED', 'erstellt am:');
-define('TEXT_DATE_ORDER_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_PAYMENT_METHOD', 'Zahlungsweise:');
-
-define('TEXT_ALL_ORDERS', 'Alle Bestellungen');
-define('TEXT_NO_ORDER_HISTORY', 'Keine Bestellhistorie verf&uuml;gbar');
-
-define('EMAIL_SEPARATOR', '------------------------------------------------------');
-define('EMAIL_TEXT_SUBJECT', 'Statusnderung Ihrer Bestellung');
-define('EMAIL_TEXT_ORDER_NUMBER', 'Bestell-Nr.:');
-define('EMAIL_TEXT_INVOICE_URL', 'Ihre Bestellung knnen Sie unter folgender Adresse einsehen:');
-define('EMAIL_TEXT_DATE_ORDERED', 'Bestelldatum:');
-define('EMAIL_TEXT_STATUS_UPDATE', 'Der Status Ihrer Bestellung wurde gendert.' . "\n\n" . 'Neuer Status: %s' . "\n\n" . 'Bei Fragen zu Ihrer Bestellung antworten Sie bitte auf diese eMail.' . "\n\n" . 'Mit freundlichen Grssen' . "\n");
-define('EMAIL_TEXT_COMMENTS_UPDATE', 'Anmerkungen und Kommentare zu Ihrer Bestellung:' . "\n\n%s\n\n");
-
-define('ERROR_ORDER_DOES_NOT_EXIST', 'Fehler: Die Bestellung existiert nicht!.');
-define('SUCCESS_ORDER_UPDATED', 'Hinweis: Die Bestellung wurde erfolgreich aktualisiert.');
-define('WARNING_ORDER_NOT_UPDATED', 'Hinweis: Es wurde nichts ge&auml;ndert. Daher wurde diese Bestellung nicht aktualisiert.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/orders_status.php 2.3.1.src/admin/includes/languages/german/orders_status.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/orders_status.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/orders_status.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,34 +0,0 @@
-<?php
-/*
-  $Id: orders_status.php 1816 2008-01-14 12:31:48Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Bestellstatus');
-
-define('TABLE_HEADING_ORDERS_STATUS', 'Bestellstatus');
-define('TABLE_HEADING_PUBLIC_STATUS', 'sichtbar f&uuml;r Kunde');
-define('TABLE_HEADING_DOWNLOADS_STATUS', 'Downloads freigegeben');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_ORDERS_STATUS_NAME', 'Bestellstatus:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie den neuen Bestellstatus mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie diesen Bestellstatus l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_ORDERS_STATUS', 'Neuer Bestellstatus');
-define('TEXT_INFO_HEADING_EDIT_ORDERS_STATUS', 'Bestellstatus bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_ORDERS_STATUS', 'Bestellstatus l&ouml;schen');
-
-define('TEXT_SET_PUBLIC_STATUS', 'Bestellung wird dem Kunden bei diesem Bestellstatus angezeigt');
-define('TEXT_SET_DOWNLOADS_STATUS', 'Virtuelle Produkte k&ouml;nnen bei diesem Status heruntergeladen werden');
-
-define('ERROR_REMOVE_DEFAULT_ORDER_STATUS', 'Fehler: Der Standard-Bestellstatus kann nicht gel&ouml;scht werden. Bitte definieren Sie einen neuen Standard-Bestellstatus und wiederholen Sie den Vorgang.');
-define('ERROR_STATUS_USED_IN_ORDERS', 'Fehler: Dieser Bestellstatus wird zur Zeit noch bei den Bestellungen verwendet.');
-define('ERROR_STATUS_USED_IN_HISTORY', 'Fehler: Dieser Bestellstatus wird zur Zeit noch in der Bestellhistorie verwendet.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/packingslip.php 2.3.1.src/admin/includes/languages/german/packingslip.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/packingslip.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/packingslip.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: packingslip.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TABLE_HEADING_COMMENTS', 'Kommentar');
-define('TABLE_HEADING_PRODUCTS_MODEL', 'Artikel-Nr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-
-define('ENTRY_SOLD_TO', 'Rechnungsanschrift:');
-define('ENTRY_SHIP_TO', 'Lieferanschrift:');
-define('ENTRY_PAYMENT_METHOD', 'Zahlungsweise:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/products_attributes.php 2.3.1.src/admin/includes/languages/german/products_attributes.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/products_attributes.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/products_attributes.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-<?php
-/*
-  $Id: products_attributes.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE_OPT', 'Artikelmerkmale');
-define('HEADING_TITLE_VAL', 'Optionswert');
-define('HEADING_TITLE_ATRIB', 'Artikelmerkmale');
-
-define('TABLE_HEADING_ID', 'ID');
-define('TABLE_HEADING_PRODUCT', 'Artikelname');
-define('TABLE_HEADING_OPT_NAME', 'Optionsname');
-define('TABLE_HEADING_OPT_VALUE', 'Optionswert');
-define('TABLE_HEADING_OPT_PRICE', 'Preis');
-define('TABLE_HEADING_OPT_PRICE_PREFIX', 'Vorzeichen (+/-)');
-define('TABLE_HEADING_ACTION', 'Aktion');
-define('TABLE_HEADING_DOWNLOAD', 'Downloadbare Produkte:');
-define('TABLE_TEXT_FILENAME', 'Dateiname:');
-define('TABLE_TEXT_MAX_DAYS', 'Zeitspanne:');
-define('TABLE_TEXT_MAX_COUNT', 'Maximale Anzahl zum Herunterladen:');
-
-define('MAX_ROW_LISTS_OPTIONS', 10);
-
-define('TEXT_WARNING_OF_DELETE', 'Mit dieser Option sind Artikel, sowie Optionsmerkmale verbunden - L&ouml;schen wird nicht empfohlen.');
-define('TEXT_OK_TO_DELETE', 'Mit dieser Option sind keine Artikel, sowie Optionsmerkmale verbunden - Sie kann gel&ouml;scht werden.');
-define('TEXT_OPTION_ID', 'Options ID');
-define('TEXT_OPTION_NAME', 'Optionsname');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/products_expected.php 2.3.1.src/admin/includes/languages/german/products_expected.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/products_expected.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/products_expected.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: products_expected.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'erwartete Artikel');
-
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_DATE_EXPECTED', 'verf&uuml;gbar ab:');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_DATE_EXPECTED', 'verf&uuml;gbar ab:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/reviews.php 2.3.1.src/admin/includes/languages/german/reviews.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/reviews.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,42 +0,0 @@
-<?php
-/*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Produktbewertungen');
-
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_RATING', 'Bewertung');
-define('TABLE_HEADING_DATE_ADDED', 'hinzugef&uuml;gt am');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('ENTRY_PRODUCT', 'Artikel:');
-define('ENTRY_FROM', 'von:');
-define('ENTRY_DATE', 'Datum:');
-define('ENTRY_REVIEW', 'Bewertung:');
-define('ENTRY_REVIEW_TEXT', '<small><font color="#ff0000"><b>HINWEIS:</b></font></small>&nbsp;HTML wird nicht konvertiert!&nbsp;');
-define('ENTRY_RATING', 'Bewertung:');
-
-define('TEXT_INFO_DELETE_REVIEW_INTRO', 'Sind Sie sicher, dass Sie diese Bewertung l&ouml;schen m&ouml;chten?');
-
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_IMAGE_NONEXISTENT', 'BILD EXISTIERT NICHT');
-define('TEXT_INFO_REVIEW_AUTHOR', 'geschrieben von:');
-define('TEXT_INFO_REVIEW_RATING', 'Bewertung:');
-define('TEXT_INFO_REVIEW_READ', 'gelesen :');
-define('TEXT_INFO_REVIEW_SIZE', 'Gr&ouml;sse:');
-define('TEXT_INFO_PRODUCTS_AVERAGE_RATING', 'durchschnittl. Wertung:');
-
-define('TEXT_OF_5_STARS', '%s von 5 Sternen!');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>GUT</b></font></small>');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>SCHLECHT</b></font></small>');
-define('TEXT_INFO_HEADING_DELETE_REVIEW', 'Bewertung l&ouml;schen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/server_info.php 2.3.1.src/admin/includes/languages/german/server_info.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/server_info.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/server_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,25 +0,0 @@
-<?php
-/*
-  $Id: server_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Server Information');
-
-define('TITLE_SERVER_HOST', 'Server Host:');
-define('TITLE_SERVER_OS', 'Server OS:');
-define('TITLE_SERVER_DATE', 'Server Datum:');
-define('TITLE_SERVER_UP_TIME', 'Server Up Time:');
-define('TITLE_HTTP_SERVER', 'HTTP Server:');
-define('TITLE_PHP_VERSION', 'PHP Version:');
-define('TITLE_ZEND_VERSION', 'Zend:');
-define('TITLE_DATABASE_HOST', 'Datenbank Host:');
-define('TITLE_DATABASE', 'Datenbank:');
-define('TITLE_DATABASE_DATE', 'Datenbank Datum:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/specials.php 2.3.1.src/admin/includes/languages/german/specials.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/specials.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/specials.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-<?php
-/*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Sonderangebote');
-
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_PRODUCTS_PRICE', 'Artikelpreis');
-define('TABLE_HEADING_STATUS', 'Status');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_SPECIALS_PRODUCT', 'Produkt:');
-define('TEXT_SPECIALS_SPECIAL_PRICE', 'Angebotspreis:');
-define('TEXT_SPECIALS_EXPIRES_DATE', 'G&uuml;ltig bis:<br><small>(dd.mm.yyyy)</small>');
-define('TEXT_SPECIALS_PRICE_TIP', '<b>Bemerkung:</b><ul><li>Sie k&ouml;nnen im Feld Angebotspreis auch prozentuale Werte angeben, z.B.: <b>20%</b></li><li>Wenn Sie einen neuen Preis eingeben, m&uuml;ssen die Nachkommastellen mit einem \'.\' getrennt werden, z.B.: <b>49.99</b></li><li>Lassen Sie das Feld <b>\'Gltig bis\'</b> leer, wenn der Angebotspreis zeitlich unbegrenzt gelten soll.</li></ul>');
-
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_NEW_PRICE', 'neuer Preis:');
-define('TEXT_INFO_ORIGINAL_PRICE', 'alter Preis:');
-define('TEXT_INFO_PERCENTAGE', 'Prozent:');
-define('TEXT_INFO_EXPIRES_DATE', 'G&uuml;ltig bis:');
-define('TEXT_INFO_STATUS_CHANGE', 'Status ge&auml;ndert:');
-
-define('TEXT_INFO_HEADING_DELETE_SPECIALS', 'Sonderangebot l&ouml;schen');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie das Sonderangebot l&ouml;schen m&ouml;chten?');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/stats_customers.php 2.3.1.src/admin/includes/languages/german/stats_customers.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/stats_customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/stats_customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Kunden mit den h&ouml;chsten Ums&auml;tzen');
-
-define('TABLE_HEADING_NUMBER', 'Nr.');
-define('TABLE_HEADING_CUSTOMERS', 'Kunde');
-define('TABLE_HEADING_TOTAL_PURCHASED', 'Gesamtsumme');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/stats_products_purchased.php 2.3.1.src/admin/includes/languages/german/stats_products_purchased.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/stats_products_purchased.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/stats_products_purchased.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_products_purchased.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'meist verkaufte Artikel');
-
-define('TABLE_HEADING_NUMBER', 'Nr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_PURCHASED', 'verkaufte Anzahl');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/stats_products_viewed.php 2.3.1.src/admin/includes/languages/german/stats_products_viewed.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/stats_products_viewed.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/stats_products_viewed.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: stats_products_viewed.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'meist besuchte Artikel');
-
-define('TABLE_HEADING_NUMBER', 'Nr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_VIEWED', 'Besucher');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/tax_classes.php 2.3.1.src/admin/includes/languages/german/tax_classes.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/tax_classes.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/tax_classes.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: tax_classes.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Steuerklassen');
-
-define('TABLE_HEADING_TAX_CLASSES', 'Steuerklassen');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_CLASS_TITLE', 'Name der Steuerklasse:');
-define('TEXT_INFO_CLASS_DESCRIPTION', 'Beschreibung:');
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie die neue Steuerklasse mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie diese Steuerklasse l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_TAX_CLASS', 'neue Steuerklasse');
-define('TEXT_INFO_HEADING_EDIT_TAX_CLASS', 'Steuerklasse bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_TAX_CLASS', 'Steuerklasse l&ouml;schen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/tax_rates.php 2.3.1.src/admin/includes/languages/german/tax_rates.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/tax_rates.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/tax_rates.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,36 +0,0 @@
-<?php
-/*
-  $Id: tax_rates.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Steuers&auml;tze');
-
-define('TABLE_HEADING_TAX_RATE_PRIORITY', 'Priorit&auml;t');
-define('TABLE_HEADING_TAX_CLASS_TITLE', 'Steuerklasse');
-define('TABLE_HEADING_COUNTRIES_NAME', 'Land');
-define('TABLE_HEADING_ZONE', 'Steuerzone');
-define('TABLE_HEADING_TAX_RATE', 'Steuersatz');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_DATE_ADDED', 'hinzugef&uuml;gt am:');
-define('TEXT_INFO_LAST_MODIFIED', 'letzte &Auml;nderung:');
-define('TEXT_INFO_CLASS_TITLE', 'Name der Steuerklasse:');
-define('TEXT_INFO_COUNTRY_NAME', 'Land:');
-define('TEXT_INFO_ZONE_NAME', 'Steuerzone:');
-define('TEXT_INFO_TAX_RATE', 'Steuersatz (%):');
-define('TEXT_INFO_TAX_RATE_PRIORITY', 'Tax rates at the same priority are added, others are compounded.<br><br>Priorit&auml;t:');
-define('TEXT_INFO_RATE_DESCRIPTION', 'Beschreibung:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie den neuen Steuersatz mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie diesen Steuersatz l&ouml;schen m&ouml;chten?');
-define('TEXT_INFO_HEADING_NEW_TAX_RATE', 'Neuer Steuersatz');
-define('TEXT_INFO_HEADING_EDIT_TAX_RATE', 'Steuersatz bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_TAX_RATE', 'Steuersatz l&ouml;schen');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/whos_online.php 2.3.1.src/admin/includes/languages/german/whos_online.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/whos_online.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/whos_online.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: whos_online.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Wer ist Online');
-
-define('TABLE_HEADING_ONLINE', 'Online');
-define('TABLE_HEADING_CUSTOMER_ID', 'ID');
-define('TABLE_HEADING_FULL_NAME', 'Name');
-define('TABLE_HEADING_IP_ADDRESS', 'IP Adresse');
-define('TABLE_HEADING_ENTRY_TIME', 'Startzeit');
-define('TABLE_HEADING_LAST_CLICK', 'Letzter Klick');
-define('TABLE_HEADING_LAST_PAGE_URL', 'Letzte URL');
-define('TABLE_HEADING_ACTION', 'Aktion');
-define('TABLE_HEADING_SHOPPING_CART', 'Warenkorb');
-define('TEXT_SHOPPING_CART_SUBTOTAL', 'Insgesamt');
-define('TEXT_NUMBER_OF_CUSTOMERS', 'Es sind zur Zeit %s Kunden online');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german/zones.php 2.3.1.src/admin/includes/languages/german/zones.php
--- 2.2rc2a.cp.src/admin/includes/languages/german/zones.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german/zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Bundesl&auml;nder');
-
-define('TABLE_HEADING_COUNTRY_NAME', 'Land');
-define('TABLE_HEADING_ZONE_NAME', 'Bundesland');
-define('TABLE_HEADING_ZONE_CODE', 'Code');
-define('TABLE_HEADING_ACTION', 'Aktion');
-
-define('TEXT_INFO_EDIT_INTRO', 'Bitte f&uuml;hren Sie alle notwendigen &Auml;nderungen durch');
-define('TEXT_INFO_ZONES_NAME', 'Name des Bundeslandes:');
-define('TEXT_INFO_ZONES_CODE', 'Code des Bundeslandes:');
-define('TEXT_INFO_COUNTRY_NAME', 'Land:');
-define('TEXT_INFO_INSERT_INTRO', 'Bitte geben Sie das neue Bundesland mit allen relevanten Daten ein');
-define('TEXT_INFO_DELETE_INTRO', 'Sind Sie sicher, dass Sie dieses Bundesland l&ouml;schen wollen?');
-define('TEXT_INFO_HEADING_NEW_ZONE', 'neues Bundesland');
-define('TEXT_INFO_HEADING_EDIT_ZONE', 'Bundesland bearbeiten');
-define('TEXT_INFO_HEADING_DELETE_ZONE', 'Bundesland l&ouml;schen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/languages/german.php 2.3.1.src/admin/includes/languages/german.php
--- 2.2rc2a.cp.src/admin/includes/languages/german.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/languages/german.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,297 +0,0 @@
-<?php
-/*
-  $Id: german.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-// look in your $PATH_LOCALE/locale directory for available locales..
-// on RedHat6.0 I used 'de_DE'
-// on FreeBSD 4.0 I use 'de_DE.ISO_8859-1'
-// this may not work under win32 environments..
-setlocale(LC_TIME, 'de_DE.ISO_8859-1');
-define('DATE_FORMAT_SHORT', '%d.%m.%Y');  // this is used for strftime()
-define('DATE_FORMAT_LONG', '%A, %d. %B %Y'); // this is used for strftime()
-define('DATE_FORMAT', 'd.m.Y');  // this is used for strftime()
-define('PHP_DATE_TIME_FORMAT', 'd.m.Y H:i:s'); // this is used for date()
-define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
-
-////
-// Return date in raw format
-// $date should be in format mm/dd/yyyy
-// raw date is in format YYYYMMDD, or DDMMYYYY
-function tep_date_raw($date, $reverse = false) {
-  if ($reverse) {
-    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
-  } else {
-    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
-  }
-}
-
-// Global entries for the <html> tag
-define('HTML_PARAMS','dir="ltr" lang="de"');
-
-// charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
-
-// page title
-define('TITLE', 'osCommerce Online Merchant Administration Tool');
-
-// header text in includes/header.php
-define('HEADER_TITLE_TOP', 'Administration');
-define('HEADER_TITLE_SUPPORT_SITE', 'Supportseite');
-define('HEADER_TITLE_ONLINE_CATALOG', 'Online Katalog');
-define('HEADER_TITLE_ADMINISTRATION', 'Administration');
-
-// text for gender
-define('MALE', 'Herr');
-define('FEMALE', 'Frau');
-
-// text for date of birth example
-define('DOB_FORMAT_STRING', 'tt.mm.jjjj');
-
-// configuration box text in includes/boxes/configuration.php
-define('BOX_HEADING_CONFIGURATION', 'Konfiguration');
-define('BOX_CONFIGURATION_MYSTORE', 'My Store');
-define('BOX_CONFIGURATION_LOGGING', 'Logging');
-define('BOX_CONFIGURATION_CACHE', 'Cache');
-define('BOX_CONFIGURATION_ADMINISTRATORS', 'Administratoren');
-
-// modules box text in includes/boxes/modules.php
-define('BOX_HEADING_MODULES', 'Module');
-define('BOX_MODULES_PAYMENT', 'Zahlungsweise');
-define('BOX_MODULES_SHIPPING', 'Versandart');
-define('BOX_MODULES_ORDER_TOTAL', 'Zusammenfassung');
-
-// categories box text in includes/boxes/catalog.php
-define('BOX_HEADING_CATALOG', 'Katalog');
-define('BOX_CATALOG_CATEGORIES_PRODUCTS', 'Kategorien / Artikel');
-define('BOX_CATALOG_CATEGORIES_PRODUCTS_ATTRIBUTES', 'Produktmerkmale');
-define('BOX_CATALOG_MANUFACTURERS', 'Hersteller');
-define('BOX_CATALOG_REVIEWS', 'Produktbewertungen');
-define('BOX_CATALOG_SPECIALS', 'Sonderangebote');
-define('BOX_CATALOG_PRODUCTS_EXPECTED', 'erwartete Artikel');
-
-// customers box text in includes/boxes/customers.php
-define('BOX_HEADING_CUSTOMERS', 'Kunden');
-define('BOX_CUSTOMERS_CUSTOMERS', 'Kunden');
-define('BOX_CUSTOMERS_ORDERS', 'Bestellungen');
-
-// taxes box text in includes/boxes/taxes.php
-define('BOX_HEADING_LOCATION_AND_TAXES', 'Land / Steuer');
-define('BOX_TAXES_COUNTRIES', 'Land');
-define('BOX_TAXES_ZONES', 'Bundesl&auml;nder');
-define('BOX_TAXES_GEO_ZONES', 'Steuerzonen');
-define('BOX_TAXES_TAX_CLASSES', 'Steuerklassen');
-define('BOX_TAXES_TAX_RATES', 'Steuers&auml;tze');
-
-// reports box text in includes/boxes/reports.php
-define('BOX_HEADING_REPORTS', 'Berichte');
-define('BOX_REPORTS_PRODUCTS_VIEWED', 'besuchte Artikel');
-define('BOX_REPORTS_PRODUCTS_PURCHASED', 'gekaufte Artikel');
-define('BOX_REPORTS_ORDERS_TOTAL', 'Kunden-Bestellstatistik');
-
-// tools text in includes/boxes/tools.php
-define('BOX_HEADING_TOOLS', 'Hilfsprogramme');
-define('BOX_TOOLS_BACKUP', 'Datenbanksicherung');
-define('BOX_TOOLS_BANNER_MANAGER', 'Banner Manager');
-define('BOX_TOOLS_CACHE', 'Cache Steuerung');
-define('BOX_TOOLS_DEFINE_LANGUAGE', 'Sprachen definieren');
-define('BOX_TOOLS_FILE_MANAGER', 'Datei-Manager');
-define('BOX_TOOLS_MAIL', 'eMail versenden');
-define('BOX_TOOLS_NEWSLETTER_MANAGER', 'Rundschreiben Manager');
-define('BOX_TOOLS_SERVER_INFO', 'Server Info');
-define('BOX_TOOLS_WHOS_ONLINE', 'Wer ist Online');
-
-// localizaion box text in includes/boxes/localization.php
-define('BOX_HEADING_LOCALIZATION', 'Sprachen/W&auml;hrungen');
-define('BOX_LOCALIZATION_CURRENCIES', 'W&auml;hrungen');
-define('BOX_LOCALIZATION_LANGUAGES', 'Sprachen');
-define('BOX_LOCALIZATION_ORDERS_STATUS', 'Bestellstatus');
-
-// javascript messages
-define('JS_ERROR', 'Während der Eingabe sind Fehler aufgetreten!\nBitte korrigieren Sie folgendes:\n\n');
-
-define('JS_OPTIONS_VALUE_PRICE', '* Sie müssen diesem Wert einen Preis zuordnen\n');
-define('JS_OPTIONS_VALUE_PRICE_PREFIX', '* Sie müssen ein Vorzeichen für den Preis angeben (+/-)\n');
-
-define('JS_PRODUCTS_NAME', '* Der neue Artikel muss einen Namen haben\n');
-define('JS_PRODUCTS_DESCRIPTION', '* Der neue Artikel muss eine Beschreibung haben\n');
-define('JS_PRODUCTS_PRICE', '* Der neue Artikel muss einen Preis haben\n');
-define('JS_PRODUCTS_WEIGHT', '* Der neue Artikel muss eine Gewichtsangabe haben\n');
-define('JS_PRODUCTS_QUANTITY', '* Sie müssen dem neuen Artikel eine verfügbare Anzahl zuordnen\n');
-define('JS_PRODUCTS_MODEL', '* Sie müssen dem neuen Artikel eine Artikel-Nr. zuordnen\n');
-define('JS_PRODUCTS_IMAGE', '* Sie müssen dem Artikel ein Bild zuordnen\n');
-
-define('JS_SPECIALS_PRODUCTS_PRICE', '* Es muss ein neuer Preis für diesen Artikel festgelegt werden\n');
-
-define('JS_GENDER', '* Die \'Anrede\' muss ausgewählt werden.\n');
-define('JS_FIRST_NAME', '* Der \'Vorname\' muss mindestens aus ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_LAST_NAME', '* Der \'Nachname\' muss mindestens aus ' . ENTRY_LAST_NAME_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_DOB', '* Das \'Geburtsdatum\' muss folgendes Format haben: xx.xx.xxxx (Tag/Jahr/Monat).\n');
-define('JS_EMAIL_ADDRESS', '* Die \'eMail-Adresse\' muss mindestens aus ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_ADDRESS', '* Die \'Strasse\' muss mindestens aus ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_POST_CODE', '* Die \'Postleitzahl\' muss mindestens aus ' . ENTRY_POSTCODE_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_CITY', '* Die \'Stadt\' muss mindestens aus ' . ENTRY_CITY_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_STATE', '* Das \'Bundesland\' muss ausgewählt werden.\n');
-define('JS_STATE_SELECT', '-- Wählen Sie oberhalb --');
-define('JS_ZONE', '* Das \'Bundesland\' muss aus der Liste für dieses Land ausgewählt werden.');
-define('JS_COUNTRY', '* Das \'Land\' muss ausgewählt werden.\n');
-define('JS_TELEPHONE', '* Die \'Telefonnummer\' muss aus mindestens ' . ENTRY_TELEPHONE_MIN_LENGTH . ' Zeichen bestehen.\n');
-define('JS_PASSWORD', '* Das \'Passwort\' sowie die \'Passwortbestätigung\' müssen übereinstimmen und aus mindestens ' . ENTRY_PASSWORD_MIN_LENGTH . ' Zeichen bestehen.\n');
-
-define('JS_ORDER_DOES_NOT_EXIST', 'Auftragsnummer %s existiert nicht!');
-
-define('CATEGORY_PERSONAL', 'Pers&ouml;nliche Daten');
-define('CATEGORY_ADDRESS', 'Adresse');
-define('CATEGORY_CONTACT', 'Kontakt');
-define('CATEGORY_COMPANY', 'Firma');
-define('CATEGORY_OPTIONS', 'Optionen');
-
-define('ENTRY_GENDER', 'Anrede:');
-define('ENTRY_GENDER_ERROR', '&nbsp;<span class="errorText">notwendige Eingabe</span>');
-define('ENTRY_FIRST_NAME', 'Vorname:');
-define('ENTRY_FIRST_NAME_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' Buchstaben</span>');
-define('ENTRY_LAST_NAME', 'Nachname:');
-define('ENTRY_LAST_NAME_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_LAST_NAME_MIN_LENGTH . ' Buchstaben</span>');
-define('ENTRY_DATE_OF_BIRTH', 'Geburtsdatum:');
-define('ENTRY_DATE_OF_BIRTH_ERROR', '&nbsp;<span class="errorText">(z.B. 21.05.1970)</span>');
-define('ENTRY_EMAIL_ADDRESS', 'eMail Adresse:');
-define('ENTRY_EMAIL_ADDRESS_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' Buchstaben</span>');
-define('ENTRY_EMAIL_ADDRESS_CHECK_ERROR', '&nbsp;<span class="errorText">ung&uuml;ltige eMail-Adresse!</span>');
-define('ENTRY_EMAIL_ADDRESS_ERROR_EXISTS', '&nbsp;<span class="errorText">Diese eMail-Adresse existiert schon!</span>');
-define('ENTRY_COMPANY', 'Firmenname:');
-define('ENTRY_STREET_ADDRESS', 'Strasse:');
-define('ENTRY_STREET_ADDRESS_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' Buchstaben</span>');
-define('ENTRY_SUBURB', 'weitere Anschrift:');
-define('ENTRY_POST_CODE', 'Postleitzahl:');
-define('ENTRY_POST_CODE_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_POSTCODE_MIN_LENGTH . ' Zahlen</span>');
-define('ENTRY_CITY', 'Stadt:');
-define('ENTRY_CITY_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_CITY_MIN_LENGTH . ' Buchstaben</span>');
-define('ENTRY_STATE', 'Bundesland:');
-define('ENTRY_STATE_ERROR', '&nbsp;<span class="errorText">notwendige Eingabe</font></small>');
-define('ENTRY_COUNTRY', 'Land:');
-define('ENTRY_TELEPHONE_NUMBER', 'Telefonnummer:');
-define('ENTRY_TELEPHONE_NUMBER_ERROR', '&nbsp;<span class="errorText">mindestens ' . ENTRY_TELEPHONE_MIN_LENGTH . ' Zahlen</span>');
-define('ENTRY_FAX_NUMBER', 'Telefaxnummer:');
-define('ENTRY_NEWSLETTER', 'Rundschreiben:');
-define('ENTRY_NEWSLETTER_YES', 'abonniert');
-define('ENTRY_NEWSLETTER_NO', 'nicht abonniert');
-
-// images
-define('IMAGE_ANI_SEND_EMAIL', 'eMail versenden');
-define('IMAGE_BACK', 'Zur&uuml;ck');
-define('IMAGE_BACKUP', 'Datensicherung');
-define('IMAGE_CANCEL', 'Abbruch');
-define('IMAGE_CONFIRM', 'Best&auml;tigen');
-define('IMAGE_COPY', 'Kopieren');
-define('IMAGE_COPY_TO', 'Kopieren nach');
-define('IMAGE_DETAILS', 'Details');
-define('IMAGE_DELETE', 'L&ouml;schen');
-define('IMAGE_EDIT', 'Bearbeiten');
-define('IMAGE_EMAIL', 'eMail versenden');
-define('IMAGE_FILE_MANAGER', 'Datei-Manager');
-define('IMAGE_ICON_STATUS_GREEN', 'aktiv');
-define('IMAGE_ICON_STATUS_GREEN_LIGHT', 'aktivieren');
-define('IMAGE_ICON_STATUS_RED', 'inaktiv');
-define('IMAGE_ICON_STATUS_RED_LIGHT', 'deaktivieren');
-define('IMAGE_ICON_INFO', 'Information');
-define('IMAGE_INSERT', 'Einf&uuml;gen');
-define('IMAGE_LOCK', 'Sperren');
-define('IMAGE_MODULE_INSTALL', 'Module Installieren');
-define('IMAGE_MODULE_REMOVE', 'Module Entfernen');
-define('IMAGE_MOVE', 'Verschieben');
-define('IMAGE_NEW_BANNER', 'Neuen Banner aufnehmen');
-define('IMAGE_NEW_CATEGORY', 'Neue Kategorie erstellen');
-define('IMAGE_NEW_COUNTRY', 'Neues Land aufnehmen');
-define('IMAGE_NEW_CURRENCY', 'Neue W&auml;hrung einf&uuml;gen');
-define('IMAGE_NEW_FILE', 'Neue Datei');
-define('IMAGE_NEW_FOLDER', 'Neues Verzeichnis');
-define('IMAGE_NEW_LANGUAGE', 'Neue Sprache anlegen');
-define('IMAGE_NEW_NEWSLETTER', 'Neues Rundschreiben');
-define('IMAGE_NEW_PRODUCT', 'Neuen Artikel aufnehmen');
-define('IMAGE_NEW_TAX_CLASS', 'Neue Steuerklasse erstellen');
-define('IMAGE_NEW_TAX_RATE', 'Neuen Steuersatz anlegen');
-define('IMAGE_NEW_TAX_ZONE', 'Neue Steuerzone erstellen');
-define('IMAGE_NEW_ZONE', 'Neues Bundesland einf&uuml;gen');
-define('IMAGE_ORDERS', 'Bestellungen');
-define('IMAGE_ORDERS_INVOICE', 'Rechnung');
-define('IMAGE_ORDERS_PACKINGSLIP', 'Lieferschein');
-define('IMAGE_PREVIEW', 'Vorschau');
-define('IMAGE_RESET', 'Zur&uuml;cksetzen');
-define('IMAGE_RESTORE', 'Zur&uuml;cksichern');
-define('IMAGE_SAVE', 'Speichern');
-define('IMAGE_SEARCH', 'Suchen');
-define('IMAGE_SELECT', 'Ausw&auml;hlen');
-define('IMAGE_SEND', 'Versenden');
-define('IMAGE_SEND_EMAIL', 'eMail versenden');
-define('IMAGE_UNLOCK', 'Entsperren');
-define('IMAGE_UPDATE', 'Aktualisieren');
-define('IMAGE_UPDATE_CURRENCIES', 'Wechselkurse aktualisieren');
-define('IMAGE_UPLOAD', 'Hochladen');
-
-define('ICON_CROSS', 'Falsch');
-define('ICON_CURRENT_FOLDER', 'aktueller Ordner');
-define('ICON_DELETE', 'L&ouml;schen');
-define('ICON_ERROR', 'Fehler');
-define('ICON_FILE', 'Datei');
-define('ICON_FILE_DOWNLOAD', 'Herunterladen');
-define('ICON_FOLDER', 'Ordner');
-define('ICON_LOCKED', 'Gesperrt');
-define('ICON_PREVIOUS_LEVEL', 'Vorherige Ebene');
-define('ICON_PREVIEW', 'Vorschau');
-define('ICON_STATISTICS', 'Statistik');
-define('ICON_SUCCESS', 'Erfolg');
-define('ICON_TICK', 'Wahr');
-define('ICON_UNLOCKED', 'Entsperrt');
-define('ICON_WARNING', 'Warnung');
-
-// constants for use in tep_prev_next_display function
-define('TEXT_RESULT_PAGE', 'Seite %s von %d');
-define('TEXT_DISPLAY_NUMBER_OF_BANNERS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Bannern)');
-define('TEXT_DISPLAY_NUMBER_OF_COUNTRIES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> L&auml;ndern)');
-define('TEXT_DISPLAY_NUMBER_OF_CUSTOMERS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Kunden)');
-define('TEXT_DISPLAY_NUMBER_OF_CURRENCIES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> W&auml;hrungen)');
-define('TEXT_DISPLAY_NUMBER_OF_LANGUAGES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Sprachen)');
-define('TEXT_DISPLAY_NUMBER_OF_MANUFACTURERS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Herstellern)');
-define('TEXT_DISPLAY_NUMBER_OF_NEWSLETTERS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Rundschreiben)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Bestellungen)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS_STATUS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Bestellstatus)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Artikeln)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_EXPECTED', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> erwarteten Artikeln)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Bewertungen)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Sonderangeboten)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_CLASSES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Steuerklassen)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_ZONES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Steuerzonen)');
-define('TEXT_DISPLAY_NUMBER_OF_TAX_RATES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Steuers&auml;tzen)');
-define('TEXT_DISPLAY_NUMBER_OF_ZONES', 'Angezeigt werden <b>%d</b> bis <b>%d</b> (von insgesamt <b>%d</b> Bundesl&auml;ndern)');
-
-define('PREVNEXT_BUTTON_PREV', '&lt;&lt;');
-define('PREVNEXT_BUTTON_NEXT', '&gt;&gt;');
-
-define('TEXT_DEFAULT', 'Standard');
-define('TEXT_SET_DEFAULT', 'als Standard definieren');
-define('TEXT_FIELD_REQUIRED', '&nbsp;<span class="fieldRequired">* erforderlich</span>');
-
-define('ERROR_NO_DEFAULT_CURRENCY_DEFINED', 'Fehler: Es wurde keine Standardw&auml;hrung definiert. Bitte definieren Sie unter Adminstration -> Sprachen/W&auml;hrungen -> W&auml;hrungen eine Standardw&auml;hrung.');
-
-define('TEXT_CACHE_CATEGORIES', 'Kategorien Box');
-define('TEXT_CACHE_MANUFACTURERS', 'Hersteller Box');
-define('TEXT_CACHE_ALSO_PURCHASED', 'Modul f&uuml;r ebenfalls gekaufte Artikel');
-
-define('TEXT_NONE', '--keine--');
-define('TEXT_TOP', 'Top');
-
-define('ERROR_DESTINATION_DOES_NOT_EXIST', 'Error: Destination does not exist.');
-define('ERROR_DESTINATION_NOT_WRITEABLE', 'Error: Destination not writeable.');
-define('ERROR_FILE_NOT_SAVED', 'Error: File upload not saved.');
-define('ERROR_FILETYPE_NOT_ALLOWED', 'Error: File upload type not allowed.');
-define('SUCCESS_FILE_SAVED_SUCCESSFULLY', 'Success: File upload saved successfully.');
-define('WARNING_NO_FILE_UPLOADED', 'Warning: No file uploaded.');
-define('WARNING_FILE_UPLOADS_DISABLED', 'Warning: File uploads are disabled in the php.ini configuration file.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_action_recorder.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_action_recorder.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_action_recorder {
+    var $code = 'action_recorder';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_ACTION_RECORDER_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_action_recorder() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'action_recorder/';
+      $this->title = MODULE_CFG_MODULE_ACTION_RECORDER_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_boxes.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_boxes.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_boxes.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_boxes.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_boxes {
+    var $code = 'boxes';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_BOXES_INSTALLED';
+    var $title;
+    var $template_integration = true;
+
+    function cfgm_boxes() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'boxes/';
+      $this->title = MODULE_CFG_MODULE_BOXES_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_dashboard.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_dashboard.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_dashboard.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_dashboard.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,27 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_dashboard {
+    var $code = 'dashboard';
+    var $directory;
+    var $language_directory;
+    var $key = 'MODULE_ADMIN_DASHBOARD_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_dashboard() {
+      $this->directory = DIR_FS_ADMIN . 'includes/modules/dashboard/';
+      $this->language_directory = DIR_FS_ADMIN . 'includes/languages/';
+      $this->title = MODULE_CFG_MODULE_DASHBOARD_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_header_tags.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_header_tags.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_header_tags.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_header_tags.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_header_tags {
+    var $code = 'header_tags';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_HEADER_TAGS_INSTALLED';
+    var $title;
+    var $template_integration = true;
+
+    function cfgm_header_tags() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'header_tags/';
+      $this->title = MODULE_CFG_MODULE_HEADER_TAGS_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_order_total.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_order_total.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_order_total.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_order_total.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_order_total {
+    var $code = 'order_total';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_ORDER_TOTAL_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_order_total() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'order_total/';
+      $this->title = MODULE_CFG_MODULE_ORDER_TOTAL_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_payment.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_payment.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_payment.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_payment.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_payment {
+    var $code = 'payment';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_PAYMENT_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_payment() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'payment/';
+      $this->title = MODULE_CFG_MODULE_PAYMENT_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_shipping.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_shipping.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_shipping.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_shipping {
+    var $code = 'shipping';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_SHIPPING_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_shipping() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'shipping/';
+      $this->title = MODULE_CFG_MODULE_SHIPPING_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_social_bookmarks.php 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_social_bookmarks.php
--- 2.2rc2a.cp.src/admin/includes/modules/cfg_modules/cfgm_social_bookmarks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/cfg_modules/cfgm_social_bookmarks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class cfgm_social_bookmarks {
+    var $code = 'social_bookmarks';
+    var $directory;
+    var $language_directory = DIR_FS_CATALOG_LANGUAGES;
+    var $key = 'MODULE_SOCIAL_BOOKMARKS_INSTALLED';
+    var $title;
+    var $template_integration = false;
+
+    function cfgm_social_bookmarks() {
+      $this->directory = DIR_FS_CATALOG_MODULES . 'social_bookmarks/';
+      $this->title = MODULE_CFG_MODULE_SOCIAL_BOOKMARKS_TITLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_admin_logins.php 2.3.1.src/admin/includes/modules/dashboard/d_admin_logins.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_admin_logins.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_admin_logins.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,73 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_admin_logins {
+    var $code = 'd_admin_logins';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_admin_logins() {
+      $this->title = MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent" width="20">&nbsp;</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent" align="right">' . MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_DATE . '</td>' .
+                '  </tr>';
+
+      $logins_query = tep_db_query("select id, user_name, success, date_added from " . TABLE_ACTION_RECORDER . " where module = 'ar_admin_login' order by date_added desc limit 6");
+      while ($logins = tep_db_fetch_array($logins_query)) {
+        $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                   '    <td class="dataTableContent" align="center">' . tep_image(DIR_WS_IMAGES . 'icons/' . (($logins['success'] == '1') ? 'tick.gif' : 'cross.gif')) . '</td>' .
+                   '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_ACTION_RECORDER, 'module=ar_admin_login&aID=' . (int)$logins['id']) . '">' . tep_output_string_protected($logins['user_name']) . '</a></td>' .
+                   '    <td class="dataTableContent" align="right">' . tep_date_short($logins['date_added']) . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Administrator Logins Module', 'MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_STATUS', 'True', 'Do you want to show the latest administrator logins on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_STATUS', 'MODULE_ADMIN_DASHBOARD_ADMIN_LOGINS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_customers.php 2.3.1.src/admin/includes/modules/dashboard/d_customers.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_customers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,71 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_customers {
+    var $code = 'd_customers';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_customers() {
+      $this->title = MODULE_ADMIN_DASHBOARD_CUSTOMERS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_CUSTOMERS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_CUSTOMERS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_CUSTOMERS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_CUSTOMERS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_CUSTOMERS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent" align="right">' . MODULE_ADMIN_DASHBOARD_CUSTOMERS_DATE . '</td>' .
+                '  </tr>';
+
+      $customers_query = tep_db_query("select c.customers_id, c.customers_lastname, c.customers_firstname, ci.customers_info_date_account_created from " . TABLE_CUSTOMERS . " c, " . TABLE_CUSTOMERS_INFO . " ci where c.customers_id = ci.customers_info_id order by ci.customers_info_date_account_created desc limit 6");
+      while ($customers = tep_db_fetch_array($customers_query)) {
+        $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                   '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_CUSTOMERS, 'cID=' . (int)$customers['customers_id'] . '&action=edit') . '">' . tep_output_string_protected($customers['customers_firstname'] . ' ' . $customers['customers_lastname']) . '</td>' .
+                   '    <td class="dataTableContent" align="right">' . tep_date_short($customers['customers_info_date_account_created']) . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_CUSTOMERS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Customers Module', 'MODULE_ADMIN_DASHBOARD_CUSTOMERS_STATUS', 'True', 'Do you want to show the newest customers on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_CUSTOMERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_CUSTOMERS_STATUS', 'MODULE_ADMIN_DASHBOARD_CUSTOMERS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_latest_addons.php 2.3.1.src/admin/includes/modules/dashboard/d_latest_addons.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_latest_addons.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_latest_addons.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,89 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_latest_addons {
+    var $code = 'd_latest_addons';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_latest_addons() {
+      $this->title = MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      if (!class_exists('lastRSS')) {
+        include(DIR_WS_CLASSES . 'rss.php');
+      }
+
+      $rss = new lastRSS;
+      $rss->items_limit = 5;
+      $rss->cache_dir = DIR_FS_CACHE;
+      $rss->cache_time = 86400;
+      $feed = $rss->get('http://feeds.feedburner.com/osCommerce_Contributions');
+
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent" align="right">' . MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_DATE . '</td>' .
+                '  </tr>';
+
+      if (is_array($feed) && !empty($feed)) {
+        foreach ($feed['items'] as $item) {
+          $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                     '    <td class="dataTableContent"><a href="' . $item['link'] . '" target="_blank">' . $item['title'] . '</a></td>' .
+                     '    <td class="dataTableContent" align="right" style="white-space: nowrap;">' . date("F j, Y", strtotime($item['pubDate'])) . '</td>' .
+                     '  </tr>';
+        }
+      } else {
+        $output .= '  <tr class="dataTableRow">' .
+                   '    <td class="dataTableContent" colspan="2">' . MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_FEED_ERROR . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '  <tr class="dataTableRow">' .
+                 '    <td class="dataTableContent" align="right" colspan="2"><a href="http://feeds.feedburner.com/osCommerce_Contributions" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_rss.png', MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_ICON_RSS) . '</a></td>' .
+                 '  </tr>' .
+                 '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Latest Add-Ons Module', 'MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_STATUS', 'True', 'Do you want to show the latest osCommerce Add-Ons on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_STATUS', 'MODULE_ADMIN_DASHBOARD_LATEST_ADDONS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_latest_news.php 2.3.1.src/admin/includes/modules/dashboard/d_latest_news.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_latest_news.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_latest_news.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,89 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_latest_news {
+    var $code = 'd_latest_news';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_latest_news() {
+      $this->title = MODULE_ADMIN_DASHBOARD_LATEST_NEWS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_LATEST_NEWS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_LATEST_NEWS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_LATEST_NEWS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      if (!class_exists('lastRSS')) {
+        include(DIR_WS_CLASSES . 'rss.php');
+      }
+
+      $rss = new lastRSS;
+      $rss->items_limit = 5;
+      $rss->cache_dir = DIR_FS_CACHE;
+      $rss->cache_time = 86400;
+      $feed = $rss->get('http://feeds.feedburner.com/osCommerceNewsAndBlogs');
+
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_LATEST_NEWS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent" align="right">' . MODULE_ADMIN_DASHBOARD_LATEST_NEWS_DATE . '</td>' .
+                '  </tr>';
+
+      if (is_array($feed) && !empty($feed)) {
+        foreach ($feed['items'] as $item) {
+          $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                     '    <td class="dataTableContent"><a href="' . $item['link'] . '" target="_blank">' . $item['title'] . '</a></td>' .
+                     '    <td class="dataTableContent" align="right" style="white-space: nowrap;">' . date("F j, Y", strtotime($item['pubDate'])) . '</td>' .
+                     '  </tr>';
+        }
+      } else {
+        $output .= '  <tr class="dataTableRow">' .
+                   '    <td class="dataTableContent" colspan="2">' . MODULE_ADMIN_DASHBOARD_LATEST_NEWS_FEED_ERROR . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '  <tr class="dataTableRow">' .
+                 '    <td class="dataTableContent" align="right" colspan="2"><a href="http://www.oscommerce.com/newsletter/subscribe" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_newsletter.png', MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_NEWSLETTER) . '</a>&nbsp;<a href="http://www.facebook.com/pages/osCommerce/33387373079" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_facebook.png', MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_FACEBOOK) . '</a>&nbsp;<a href="http://twitter.com/osCommerce" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_twitter.png', MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_TWITTER) . '</a>&nbsp;<a href="http://feeds.feedburner.com/osCommerceNewsAndBlogs" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_rss.png', MODULE_ADMIN_DASHBOARD_LATEST_NEWS_ICON_RSS) . '</a></td>' .
+                 '  </tr>' .
+                 '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Latest News Module', 'MODULE_ADMIN_DASHBOARD_LATEST_NEWS_STATUS', 'True', 'Do you want to show the latest osCommerce News on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_LATEST_NEWS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_LATEST_NEWS_STATUS', 'MODULE_ADMIN_DASHBOARD_LATEST_NEWS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_orders.php 2.3.1.src/admin/includes/modules/dashboard/d_orders.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_orders.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_orders.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,77 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_orders {
+    var $code = 'd_orders';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_orders() {
+      $this->title = MODULE_ADMIN_DASHBOARD_ORDERS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_ORDERS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_ORDERS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_ORDERS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_ORDERS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $languages_id;
+
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_ORDERS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_ORDERS_TOTAL . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_ORDERS_DATE . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_ORDERS_ORDER_STATUS . '</td>' .
+                '  </tr>';
+
+      $orders_query = tep_db_query("select o.orders_id, o.customers_name, greatest(o.date_purchased, ifnull(o.last_modified, 0)) as date_last_modified, s.orders_status_name, ot.text as order_total from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_TOTAL . " ot, " . TABLE_ORDERS_STATUS . " s where o.orders_id = ot.orders_id and ot.class = 'ot_total' and o.orders_status = s.orders_status_id and s.language_id = '" . (int)$languages_id . "' order by date_last_modified desc limit 6");
+      while ($orders = tep_db_fetch_array($orders_query)) {
+        $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                   '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_ORDERS, 'oID=' . (int)$orders['orders_id'] . '&action=edit') . '">' . tep_output_string_protected($orders['customers_name']) . '</td>' .
+                   '    <td class="dataTableContent">' . strip_tags($orders['order_total']) . '</td>' .
+                   '    <td class="dataTableContent">' . tep_date_short($orders['date_last_modified']) . '</td>' .
+                   '    <td class="dataTableContent">' . $orders['orders_status_name'] . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_ORDERS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Orders Module', 'MODULE_ADMIN_DASHBOARD_ORDERS_STATUS', 'True', 'Do you want to show the latest orders on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_ORDERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_ORDERS_STATUS', 'MODULE_ADMIN_DASHBOARD_ORDERS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_reviews.php 2.3.1.src/admin/includes/modules/dashboard/d_reviews.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_reviews.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,80 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_reviews {
+    var $code = 'd_reviews';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_reviews() {
+      $this->title = MODULE_ADMIN_DASHBOARD_REVIEWS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_REVIEWS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_REVIEWS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_REVIEWS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_REVIEWS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $languages_id;
+
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_REVIEWS_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_REVIEWS_DATE . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_REVIEWS_REVIEWER . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_REVIEWS_RATING . '</td>' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_REVIEWS_REVIEW_STATUS . '</td>' .
+                '  </tr>';
+
+      $reviews_query = tep_db_query("select r.reviews_id, r.date_added, pd.products_name, r.customers_name, r.reviews_rating, r.reviews_status from " . TABLE_REVIEWS . " r, " . TABLE_PRODUCTS_DESCRIPTION . " pd where pd.products_id = r.products_id and pd.language_id = '" . (int)$languages_id . "' order by r.date_added desc limit 6");
+      while ($reviews = tep_db_fetch_array($reviews_query)) {
+        $status_icon = ($reviews['reviews_status'] == '1') ? tep_image(DIR_WS_IMAGES . 'icon_status_green.gif', IMAGE_ICON_STATUS_GREEN, 10, 10) : tep_image(DIR_WS_IMAGES . 'icon_status_red.gif', IMAGE_ICON_STATUS_RED, 10, 10);
+        $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                   '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_REVIEWS, 'rID=' . (int)$reviews['reviews_id'] . '&action=edit') . '">' . $reviews['products_name'] . '</td>' .
+                   '    <td class="dataTableContent">' . tep_date_short($reviews['date_added']) . '</td>' .
+                   '    <td class="dataTableContent">' . tep_output_string_protected($reviews['customers_name']) . '</td>' .
+                   '    <td class="dataTableContent">' . tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif') . '</td>' .
+                   '    <td class="dataTableContent">' . $status_icon . '</td>' .
+                   '  </tr>';
+      }
+
+      $output .= '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_REVIEWS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Reviews Module', 'MODULE_ADMIN_DASHBOARD_REVIEWS_STATUS', 'True', 'Do you want to show the latest reviews on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_REVIEWS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_REVIEWS_STATUS', 'MODULE_ADMIN_DASHBOARD_REVIEWS_SORT_ORDER');
+    }
+  }
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_security_checks.php 2.3.1.src/admin/includes/modules/dashboard/d_security_checks.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_security_checks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_security_checks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,127 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_security_checks {
+    var $code = 'd_security_checks';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_security_checks() {
+      $this->title = MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $PHP_SELF;
+
+      $output = '';
+
+      $secCheck_types = array('info', 'warning', 'error');
+      $secCheck_messages = array();
+
+      $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
+      $secmodules_array = array();
+      if ($secdir = @dir(DIR_FS_ADMIN . 'includes/modules/security_check/')) {
+        while ($file = $secdir->read()) {
+          if (!is_dir(DIR_FS_ADMIN . 'includes/modules/security_check/' . $file)) {
+            if (substr($file, strrpos($file, '.')) == $file_extension) {
+              $secmodules_array[] = $file;
+            }
+          }
+        }
+        sort($secmodules_array);
+        $secdir->close();
+      }
+
+      foreach ($secmodules_array as $secmodule) {
+        include(DIR_FS_ADMIN . 'includes/modules/security_check/' . $secmodule);
+
+        $secclass = 'securityCheck_' . substr($secmodule, 0, strrpos($secmodule, '.'));
+        if (tep_class_exists($secclass)) {
+          $secCheck = new $secclass;
+
+          if ( !$secCheck->pass() ) {
+            if (!in_array($secCheck->type, $secCheck_types)) {
+              $secCheck->type = 'info';
+            }
+
+            $secCheck_messages[$secCheck->type][] = $secCheck->getMessage();
+          }
+        }
+      }
+
+      if (isset($secCheck_messages['error'])) {
+        $output .= '<div class="secError">';
+
+        foreach ($secCheck_messages['error'] as $error) {
+          $output .= '<p class="smallText">' . $error . '</p>';
+        }
+
+        $output .= '</div>';
+      }
+
+      if (isset($secCheck_messages['warning'])) {
+        $output .= '<div class="secWarning">';
+
+        foreach ($secCheck_messages['warning'] as $warning) {
+          $output .= '<p class="smallText">' . $warning . '</p>';
+        }
+
+        $output .= '</div>';
+      }
+
+      if (isset($secCheck_messages['info'])) {
+        $output .= '<div class="secInfo">';
+
+        foreach ($secCheck_messages['info'] as $info) {
+          $output .= '<p class="smallText">' . $info . '</p>';
+        }
+
+        $output .= '</div>';
+      }
+
+      if (empty($secCheck_messages)) {
+        $output .= '<div class="secSuccess"><p class="smallText">' . MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_SUCCESS . '</p></div>';
+      }
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Security Checks Module', 'MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_STATUS', 'True', 'Do you want to run the security checks for this installation?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_STATUS', 'MODULE_ADMIN_DASHBOARD_SECURITY_CHECKS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_total_customers.php 2.3.1.src/admin/includes/modules/dashboard/d_total_customers.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_total_customers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_total_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,147 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_total_customers {
+    var $code = 'd_total_customers';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_total_customers() {
+      $this->title = MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      $days = array();
+      for($i = 0; $i < 30; $i++) {
+        $days[date('Y-m-d', strtotime('-'. $i .' days'))] = 0;
+      }
+
+      $orders_query = tep_db_query("select date_format(customers_info_date_account_created, '%Y-%m-%d') as dateday, count(*) as total from " . TABLE_CUSTOMERS_INFO . " where date_sub(curdate(), interval 30 day) <= customers_info_date_account_created group by dateday");
+      while ($orders = tep_db_fetch_array($orders_query)) {
+        $days[$orders['dateday']] = $orders['total'];
+      }
+
+      $days = array_reverse($days, true);
+
+      $js_array = '';
+      foreach ($days as $date => $total) {
+        $js_array .= '[' . (mktime(0, 0, 0, substr($date, 5, 2), substr($date, 8, 2), substr($date, 0, 4))*1000) . ', ' . $total . '],';
+      }
+
+      if (!empty($js_array)) {
+        $js_array = substr($js_array, 0, -1);
+      }
+
+      $chart_label = tep_output_string(MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_CHART_LINK);
+      $chart_label_link = tep_href_link(FILENAME_CUSTOMERS);
+
+      $output = <<<EOD
+<div id="d_total_customers" style="width: 100%; height: 150px;"></div>
+<script type="text/javascript">
+$(function () {
+  var plot30 = [$js_array];
+  $.plot($('#d_total_customers'), [ {
+    label: '$chart_label',
+    data: plot30,
+    lines: { show: true, fill: true },
+    points: { show: true },
+    color: '#FF9966'
+  }], {
+    xaxis: {
+      ticks: 4,
+      mode: 'time'
+    },
+    yaxis: {
+      ticks: 3,
+      min: 0
+    },
+    grid: {
+      backgroundColor: { colors: ['#fff', '#eee'] },
+      hoverable: true
+    },
+    legend: {
+      labelFormatter: function(label, series) {
+        return '<a href="$chart_label_link">' + label + '</a>';
+      }
+    }
+  });
+});
+
+function showTooltip(x, y, contents) {
+  $('<div id="tooltip">' + contents + '</div>').css( {
+    position: 'absolute',
+    display: 'none',
+    top: y + 5,
+    left: x + 5,
+    border: '1px solid #fdd',
+    padding: '2px',
+    backgroundColor: '#fee',
+    opacity: 0.80
+  }).appendTo('body').fadeIn(200);
+}
+
+var monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
+
+var previousPoint = null;
+$('#d_total_customers').bind('plothover', function (event, pos, item) {
+  if (item) {
+    if (previousPoint != item.datapoint) {
+      previousPoint = item.datapoint;
+
+      $('#tooltip').remove();
+      var x = item.datapoint[0],
+          y = item.datapoint[1],
+          xdate = new Date(x);
+
+      showTooltip(item.pageX, item.pageY, y + ' for ' + monthNames[xdate.getMonth()] + '-' + xdate.getDate());
+    }
+  } else {
+    $('#tooltip').remove();
+    previousPoint = null;
+  }
+});
+</script>
+EOD;
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Total Customers Module', 'MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_STATUS', 'True', 'Do you want to show the total customers chart on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_STATUS', 'MODULE_ADMIN_DASHBOARD_TOTAL_CUSTOMERS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_total_revenue.php 2.3.1.src/admin/includes/modules/dashboard/d_total_revenue.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_total_revenue.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_total_revenue.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,147 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_total_revenue {
+    var $code = 'd_total_revenue';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_total_revenue() {
+      $this->title = MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      $days = array();
+      for($i = 0; $i < 30; $i++) {
+        $days[date('Y-m-d', strtotime('-'. $i .' days'))] = 0;
+      }
+
+      $orders_query = tep_db_query("select date_format(o.date_purchased, '%Y-%m-%d') as dateday, sum(ot.value) as total from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_TOTAL . " ot where date_sub(curdate(), interval 30 day) <= o.date_purchased and o.orders_id = ot.orders_id and ot.class = 'ot_total' group by dateday");
+      while ($orders = tep_db_fetch_array($orders_query)) {
+        $days[$orders['dateday']] = $orders['total'];
+      }
+
+      $days = array_reverse($days, true);
+
+      $js_array = '';
+      foreach ($days as $date => $total) {
+        $js_array .= '[' . (mktime(0, 0, 0, substr($date, 5, 2), substr($date, 8, 2), substr($date, 0, 4))*1000) . ', ' . $total . '],';
+      }
+
+      if (!empty($js_array)) {
+        $js_array = substr($js_array, 0, -1);
+      }
+
+      $chart_label = tep_output_string(MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_CHART_LINK);
+      $chart_label_link = tep_href_link(FILENAME_ORDERS);
+
+      $output = <<<EOD
+<div id="d_total_revenue" style="width: 100%; height: 150px;"></div>
+<script type="text/javascript">
+$(function () {
+  var plot30 = [$js_array];
+  $.plot($('#d_total_revenue'), [ {
+    label: '$chart_label',
+    data: plot30,
+    lines: { show: true, fill: true },
+    points: { show: true },
+    color: '#66CC33'
+  }], {
+    xaxis: {
+      ticks: 4,
+      mode: 'time'
+    },
+    yaxis: {
+      ticks: 3,
+      min: 0
+    },
+    grid: {
+      backgroundColor: { colors: ['#fff', '#eee'] },
+      hoverable: true
+    },
+    legend: {
+      labelFormatter: function(label, series) {
+        return '<a href="$chart_label_link">' + label + '</a>';
+      }
+    }
+  });
+});
+
+function showTooltip(x, y, contents) {
+  $('<div id="tooltip">' + contents + '</div>').css( {
+    position: 'absolute',
+    display: 'none',
+    top: y + 5,
+    left: x + 5,
+    border: '1px solid #fdd',
+    padding: '2px',
+    backgroundColor: '#fee',
+    opacity: 0.80
+  }).appendTo('body').fadeIn(200);
+}
+
+var monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
+
+var previousPoint = null;
+$('#d_total_revenue').bind('plothover', function (event, pos, item) {
+  if (item) {
+    if (previousPoint != item.datapoint) {
+      previousPoint = item.datapoint;
+
+      $('#tooltip').remove();
+      var x = item.datapoint[0],
+          y = item.datapoint[1],
+          xdate = new Date(x);
+
+      showTooltip(item.pageX, item.pageY, y + ' for ' + monthNames[xdate.getMonth()] + '-' + xdate.getDate());
+    }
+  } else {
+    $('#tooltip').remove();
+    previousPoint = null;
+  }
+});
+</script>
+EOD;
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Total Revenue Module', 'MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_STATUS', 'True', 'Do you want to show the total revenue chart on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_STATUS', 'MODULE_ADMIN_DASHBOARD_TOTAL_REVENUE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_version_check.php 2.3.1.src/admin/includes/modules/dashboard/d_version_check.php
--- 2.2rc2a.cp.src/admin/includes/modules/dashboard/d_version_check.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/dashboard/d_version_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,94 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class d_version_check {
+    var $code = 'd_version_check';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function d_version_check() {
+      $this->title = MODULE_ADMIN_DASHBOARD_VERSION_CHECK_TITLE;
+      $this->description = MODULE_ADMIN_DASHBOARD_VERSION_CHECK_DESCRIPTION;
+
+      if ( defined('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_STATUS') ) {
+        $this->sort_order = MODULE_ADMIN_DASHBOARD_VERSION_CHECK_SORT_ORDER;
+        $this->enabled = (MODULE_ADMIN_DASHBOARD_VERSION_CHECK_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      $cache_file = DIR_FS_CACHE . 'oscommerce_version_check.cache';
+      $current_version = tep_get_version();
+      $new_version = false;
+
+      if (file_exists($cache_file)) {
+        $date_last_checked = tep_datetime_short(date('Y-m-d H:i:s', filemtime($cache_file)));
+
+        $releases = unserialize(implode('', file($cache_file)));
+
+        foreach ($releases as $version) {
+          $version_array = explode('|', $version);
+
+          if (version_compare($current_version, $version_array[0], '<')) {
+            $new_version = true;
+            break;
+          }
+        }
+      } else {
+        $date_last_checked = MODULE_ADMIN_DASHBOARD_VERSION_CHECK_NEVER;
+      }
+
+      $output = '<table border="0" width="100%" cellspacing="0" cellpadding="4">' .
+                '  <tr class="dataTableHeadingRow">' .
+                '    <td class="dataTableHeadingContent">' . MODULE_ADMIN_DASHBOARD_VERSION_CHECK_TITLE . '</td>' .
+                '    <td class="dataTableHeadingContent" align="right">' . MODULE_ADMIN_DASHBOARD_VERSION_CHECK_DATE . '</td>' .
+                '  </tr>';
+
+      if ($new_version == true) {
+        $output .= '  <tr>' .
+                   '    <td class="messageStackWarning" colspan="2">' . tep_image(DIR_WS_ICONS . 'warning.gif', ICON_WARNING) . '&nbsp;<strong>' . MODULE_ADMIN_DASHBOARD_VERSION_CHECK_UPDATE_AVAILABLE . '</strong></td>' .
+                   '  </tr>';
+      }
+
+      $output .= '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
+                 '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_VERSION_CHECK) . '">' . MODULE_ADMIN_DASHBOARD_VERSION_CHECK_CHECK_NOW . '</a></td>' .
+                 '    <td class="dataTableContent" align="right">' . $date_last_checked . '</td>' .
+                 '  </tr>' .
+                 '</table>';
+
+      return $output;
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Version Check Module', 'MODULE_ADMIN_DASHBOARD_VERSION_CHECK_STATUS', 'True', 'Do you want to show the version check results on the dashboard?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_ADMIN_DASHBOARD_VERSION_CHECK_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ADMIN_DASHBOARD_VERSION_CHECK_STATUS', 'MODULE_ADMIN_DASHBOARD_VERSION_CHECK_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/index/customers.php 2.3.1.src/admin/includes/modules/index/customers.php
--- 2.2rc2a.cp.src/admin/includes/modules/index/customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/index/customers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: customers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-
-<table border="0" width="100%" cellspacing="0" cellpadding="4">
-  <tr class="dataTableHeadingRow">
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_CUSTOMERS_TITLE; ?></td>
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_CUSTOMERS_DATE; ?></td>
-  </tr>
-<?php
-  $customers_query = tep_db_query("select c.customers_id, c.customers_lastname, c.customers_firstname, ci.customers_info_date_account_created from " . TABLE_CUSTOMERS . " c, " . TABLE_CUSTOMERS_INFO . " ci where c.customers_id = ci.customers_info_id order by ci.customers_info_date_account_created desc limit 6");
-  while ($customers = tep_db_fetch_array($customers_query)) {
-    echo '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
-         '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_CUSTOMERS, 'cID=' . (int)$customers['customers_id'] . '&action=edit') . '">' . tep_output_string_protected($customers['customers_firstname'] . ' ' . $customers['customers_lastname']) . '</td>' .
-         '    <td class="dataTableContent">' . $customers['customers_info_date_account_created'] . '</td>' .
-         '  </tr>';
-  }
-?>
-</table>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/index/orders.php 2.3.1.src/admin/includes/modules/index/orders.php
--- 2.2rc2a.cp.src/admin/includes/modules/index/orders.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/index/orders.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-
-<table border="0" width="100%" cellspacing="0" cellpadding="4">
-  <tr class="dataTableHeadingRow">
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_ORDERS_TITLE; ?></td>
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_ORDERS_TOTAL; ?></td>
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_ORDERS_DATE; ?></td>
-    <td class="dataTableHeadingContent"><?php echo ADMIN_INDEX_ORDERS_STATUS; ?></td>
-  </tr>
-<?php
-  $orders_query = tep_db_query("select o.orders_id, o.customers_name, greatest(o.date_purchased, ifnull(o.last_modified, 0)) as date_last_modified, s.orders_status_name, ot.text as order_total from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_TOTAL . " ot, " . TABLE_ORDERS_STATUS . " s where o.orders_id = ot.orders_id and ot.class = 'ot_total' and o.orders_status = s.orders_status_id and s.language_id = '" . (int)$languages_id . "' order by date_last_modified desc limit 6");
-  while ($orders = tep_db_fetch_array($orders_query)) {
-    echo '  <tr class="dataTableRow" onmouseover="rowOverEffect(this);" onmouseout="rowOutEffect(this);">' .
-         '    <td class="dataTableContent"><a href="' . tep_href_link(FILENAME_ORDERS, 'oID=' . (int)$orders['orders_id'] . '&action=edit') . '">' . tep_output_string_protected($orders['customers_name']) . '</td>' .
-         '    <td class="dataTableContent">' . strip_tags($orders['order_total']) . '</td>' .
-         '    <td class="dataTableContent">' . $orders['date_last_modified'] . '</td>' .
-         '    <td class="dataTableContent">' . $orders['orders_status_name'] . '</td>' .
-         '  </tr>';
-  }
-?>
-</table>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/newsletters/newsletter.php 2.3.1.src/admin/includes/modules/newsletters/newsletter.php
--- 2.2rc2a.cp.src/admin/includes/modules/newsletters/newsletter.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/newsletters/newsletter.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: newsletter.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -31,13 +31,13 @@
 
       $confirm_string = '<table border="0" cellspacing="0" cellpadding="2">' . "\n" .
                         '  <tr>' . "\n" .
-                        '    <td class="main"><font color="#ff0000"><b>' . sprintf(TEXT_COUNT_CUSTOMERS, $mail['count']) . '</b></font></td>' . "\n" .
+                        '    <td class="main"><font color="#ff0000"><strong>' . sprintf(TEXT_COUNT_CUSTOMERS, $mail['count']) . '</strong></font></td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
-                        '    <td class="main"><b>' . $this->title . '</b></td>' . "\n" .
+                        '    <td class="main"><strong>' . $this->title . '</strong></td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
@@ -49,7 +49,7 @@
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
-                        '    <td align="right"><a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm_send') . '">' . tep_image_button('button_send.gif', IMAGE_SEND) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a></td>' . "\n" .
+                        '    <td class="smallText" align="right">' . tep_draw_button(IMAGE_SEND, 'mail-closed', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm_send'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'])) . '</td>' . "\n" .
                         '  </tr>' . "\n" .
                         '</table>';
 
@@ -59,8 +59,16 @@
     function send($newsletter_id) {
       $mail_query = tep_db_query("select customers_firstname, customers_lastname, customers_email_address from " . TABLE_CUSTOMERS . " where customers_newsletter = '1'");
 
-      $mimemessage = new email(array('X-Mailer: osCommerce bulk mailer'));
-      $mimemessage->add_text($this->content);
+      $mimemessage = new email(array('X-Mailer: osCommerce'));
+
+      // Build the text version
+      $text = strip_tags($this->content);
+      if (EMAIL_USE_HTML == 'true') {
+        $mimemessage->add_html($this->content, $text);
+      } else {
+        $mimemessage->add_text($text);
+      }
+
       $mimemessage->build_message();
       while ($mail = tep_db_fetch_array($mail_query)) {
         $mimemessage->send($mail['customers_firstname'] . ' ' . $mail['customers_lastname'], $mail['customers_email_address'], '', EMAIL_FROM, $this->title);
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/newsletters/product_notification.php 2.3.1.src/admin/includes/modules/newsletters/product_notification.php
--- 2.2rc2a.cp.src/admin/includes/modules/newsletters/product_notification.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/newsletters/product_notification.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_notification.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -29,7 +29,7 @@
                                   'text' => $products['products_name']);
       }
 
-$choose_audience_string = '<script language="javascript"><!--
+$choose_audience_string = '<script type="text/javascript"><!--
 function mover(move) {
   if (move == \'remove\') {
     for (x=0; x<(document.notifications.products.length); x++) {
@@ -73,19 +73,15 @@
 }
 //--></script>';
 
-      $global_button = '<script language="javascript"><!--' . "\n" .
-                       'document.write(\'<input type="button" value="' . BUTTON_GLOBAL . '" style="width: 8em;" onclick="document.location=\\\'' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm&global=true') . '\\\'">\');' . "\n" .
-                       '//--></script><noscript><a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm&global=true') . '">[ ' . BUTTON_GLOBAL . ' ]</a></noscript>';
-
-      $cancel_button = '<script language="javascript"><!--' . "\n" .
-                       'document.write(\'<input type="button" value="' . BUTTON_CANCEL . '" style="width: 8em;" onclick="document.location=\\\'' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '\\\'">\');' . "\n" .
-                       '//--></script><noscript><a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">[ ' . BUTTON_CANCEL . ' ]</a></noscript>';
+      $global_button = tep_draw_button(BUTTON_GLOBAL, 'circle-triangle-n', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm&global=true'), 'primary');
 
-      $choose_audience_string .= '<form name="notifications" action="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm') . '" method="post" onSubmit="return selectAll(\'notifications\', \'chosen[]\')"><table border="0" width="100%" cellspacing="0" cellpadding="2">' . "\n" .
+      $cancel_button = tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']));
+
+      $choose_audience_string .= '<form name="notifications" action="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm') . '" method="post" onsubmit="return selectAll(\'notifications\', \'chosen[]\')"><table border="0" width="100%" cellspacing="0" cellpadding="2">' . "\n" .
                                  '  <tr>' . "\n" .
-                                 '    <td align="center" class="main"><b>' . TEXT_PRODUCTS . '</b><br>' . tep_draw_pull_down_menu('products', $products_array, '', 'size="20" style="width: 20em;" multiple') . '</td>' . "\n" .
-                                 '    <td align="center" class="main">&nbsp;<br>' . $global_button . '<br><br><br><input type="button" value="' . BUTTON_SELECT . '" style="width: 8em;" onClick="mover(\'remove\');"><br><br><input type="button" value="' . BUTTON_UNSELECT . '" style="width: 8em;" onClick="mover(\'add\');"><br><br><br><input type="submit" value="' . BUTTON_SUBMIT . '" style="width: 8em;"><br><br>' . $cancel_button . '</td>' . "\n" .
-                                 '    <td align="center" class="main"><b>' . TEXT_SELECTED_PRODUCTS . '</b><br>' . tep_draw_pull_down_menu('chosen[]', array(), '', 'size="20" style="width: 20em;" multiple') . '</td>' . "\n" .
+                                 '    <td align="center" class="smallText"><strong>' . TEXT_PRODUCTS . '</strong><br />' . tep_draw_pull_down_menu('products', $products_array, '', 'size="20" style="width: 20em;" multiple') . '</td>' . "\n" .
+                                 '    <td align="center" class="smallText">&nbsp;<br />' . $global_button . '<br /><br /><br /><input type="button" value="' . BUTTON_SELECT . '" style="width: 8em;" onClick="mover(\'remove\');"><br /><br /><input type="button" value="' . BUTTON_UNSELECT . '" style="width: 8em;" onClick="mover(\'add\');"><br /><br /><br />' . tep_draw_button(IMAGE_SEND, 'mail-closed', null, 'primary') . '<br /><br />' . $cancel_button . '</td>' . "\n" .
+                                 '    <td align="center" class="smallText"><strong>' . TEXT_SELECTED_PRODUCTS . '</strong><br />' . tep_draw_pull_down_menu('chosen[]', array(), '', 'size="20" style="width: 20em;" multiple') . '</td>' . "\n" .
                                  '  </tr>' . "\n" .
                                  '</table></form>';
 
@@ -125,13 +121,13 @@
 
       $confirm_string = '<table border="0" cellspacing="0" cellpadding="2">' . "\n" .
                         '  <tr>' . "\n" .
-                        '    <td class="main"><font color="#ff0000"><b>' . sprintf(TEXT_COUNT_CUSTOMERS, sizeof($audience)) . '</b></font></td>' . "\n" .
+                        '    <td class="main"><font color="#ff0000"><strong>' . sprintf(TEXT_COUNT_CUSTOMERS, sizeof($audience)) . '</strong></font></td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
-                        '    <td class="main"><b>' . $this->title . '</b></td>' . "\n" .
+                        '    <td class="main"><strong>' . $this->title . '</strong></td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . "\n" .
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
@@ -143,7 +139,7 @@
                         '    <td>' . tep_draw_separator('pixel_trans.gif', '1', '10') . '</td>' . "\n" .
                         '  </tr>' . "\n" .
                         '  <tr>' . tep_draw_form('confirm', FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=confirm_send') . "\n" .
-                        '    <td align="right">';
+                        '    <td class="smallText" align="right">';
       if (sizeof($audience) > 0) {
         if (isset($HTTP_GET_VARS['global']) && ($HTTP_GET_VARS['global'] == 'true')) {
           $confirm_string .= tep_draw_hidden_field('global', 'true');
@@ -152,9 +148,9 @@
             $confirm_string .= tep_draw_hidden_field('chosen[]', $chosen[$i]);
           }
         }
-        $confirm_string .= tep_image_submit('button_send.gif', IMAGE_SEND) . ' ';
+        $confirm_string .= tep_draw_button(IMAGE_SEND, 'mail-closed', null, 'primary');
       }
-      $confirm_string .= '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=send') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a></td>' . "\n" .
+      $confirm_string .= tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'] . '&action=send')) . '</td>' . "\n" .
                          '  </tr>' . "\n" .
                          '</table>';
 
@@ -200,8 +196,16 @@
         }
       }
 
-      $mimemessage = new email(array('X-Mailer: osCommerce bulk mailer'));
-      $mimemessage->add_text($this->content);
+      $mimemessage = new email(array('X-Mailer: osCommerce'));
+
+      // Build the text version
+      $text = strip_tags($this->content);
+      if (EMAIL_USE_HTML == 'true') {
+        $mimemessage->add_html($this->content, $text);
+      } else {
+        $mimemessage->add_text($text);
+      }
+
       $mimemessage->build_message();
 
       reset($audience);
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/config_file_catalog.php 2.3.1.src/admin/includes/modules/security_check/config_file_catalog.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/config_file_catalog.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/config_file_catalog.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_config_file_catalog {
+    var $type = 'warning';
+
+    function securityCheck_config_file_catalog() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/config_file_catalog.php');
+    }
+
+    function pass() {
+      return (file_exists(DIR_FS_CATALOG . 'includes/configure.php') && !tep_is_writable(DIR_FS_CATALOG . 'includes/configure.php'));
+    }
+
+    function getMessage() {
+      return WARNING_CONFIG_FILE_WRITEABLE;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/default_currency.php 2.3.1.src/admin/includes/modules/security_check/default_currency.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/default_currency.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/default_currency.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_default_currency {
+    var $type = 'error';
+
+    function securityCheck_default_currency() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/default_currency.php');
+    }
+
+    function pass() {
+      return defined('DEFAULT_CURRENCY');
+    }
+
+    function getMessage() {
+      return ERROR_NO_DEFAULT_CURRENCY_DEFINED;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/default_language.php 2.3.1.src/admin/includes/modules/security_check/default_language.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/default_language.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/default_language.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_default_language {
+    var $type = 'error';
+
+    function securityCheck_default_language() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/default_language.php');
+    }
+
+    function pass() {
+      return defined('DEFAULT_LANGUAGE');
+    }
+
+    function getMessage() {
+      return ERROR_NO_DEFAULT_LANGUAGE_DEFINED;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/download_directory.php 2.3.1.src/admin/includes/modules/security_check/download_directory.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/download_directory.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/download_directory.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,39 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_download_directory {
+    var $type = 'warning';
+
+    function securityCheck_download_directory() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/download_directory.php');
+    }
+
+    function pass() {
+      if (DOWNLOAD_ENABLED != 'true') {
+        return true;
+      }
+
+//backwards compatibility <2.2RC3; DIR_FS_DOWNLOAD not in configure.php
+      if (!defined('DIR_FS_DOWNLOAD')) {
+        return true;
+      }
+
+      return is_dir(DIR_FS_DOWNLOAD);
+    }
+
+    function getMessage() {
+      return WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/file_uploads.php 2.3.1.src/admin/includes/modules/security_check/file_uploads.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/file_uploads.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/file_uploads.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_file_uploads {
+    var $type = 'warning';
+
+    function securityCheck_file_uploads() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/file_uploads.php');
+    }
+
+    function pass() {
+      return (bool)ini_get('file_uploads');
+    }
+
+    function getMessage() {
+      return WARNING_FILE_UPLOADS_DISABLED;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/install_directory.php 2.3.1.src/admin/includes/modules/security_check/install_directory.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/install_directory.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/install_directory.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_install_directory {
+    var $type = 'warning';
+
+    function securityCheck_install_directory() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/install_directory.php');
+    }
+
+    function pass() {
+      return !file_exists(DIR_FS_CATALOG . 'install');
+    }
+
+    function getMessage() {
+      return WARNING_INSTALL_DIRECTORY_EXISTS;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/session_auto_start.php 2.3.1.src/admin/includes/modules/security_check/session_auto_start.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/session_auto_start.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/session_auto_start.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,30 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_session_auto_start {
+    var $type = 'warning';
+
+    function securityCheck_session_auto_start() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/session_auto_start.php');
+    }
+
+    function pass() {
+      return ((bool)ini_get('session.auto_start') == false);
+    }
+
+    function getMessage() {
+      return WARNING_SESSION_AUTO_START;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/modules/security_check/session_storage.php 2.3.1.src/admin/includes/modules/security_check/session_storage.php
--- 2.2rc2a.cp.src/admin/includes/modules/security_check/session_storage.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/modules/security_check/session_storage.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,36 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class securityCheck_session_storage {
+    var $type = 'warning';
+
+    function securityCheck_session_storage() {
+      global $language;
+
+      include(DIR_FS_ADMIN . 'includes/languages/' . $language . '/modules/security_check/session_storage.php');
+    }
+
+    function pass() {
+      return ((STORE_SESSIONS != '') || (is_dir(tep_session_save_path()) && tep_is_writable(tep_session_save_path())));
+    }
+
+    function getMessage() {
+      if (STORE_SESSIONS == '') {
+        if (!is_dir(tep_session_save_path())) {
+          return WARNING_SESSION_DIRECTORY_NON_EXISTENT;
+        } elseif (!tep_is_writable(tep_session_save_path())) {
+          return WARNING_SESSION_DIRECTORY_NOT_WRITEABLE;
+        }
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/stylesheet.css 2.3.1.src/admin/includes/stylesheet.css
--- 2.2rc2a.cp.src/admin/includes/stylesheet.css	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/stylesheet.css	2010-11-15 03:42:36.000000000 -0600
@@ -1,39 +1,29 @@
 /*
-  $Id: stylesheet.css 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
 /* links */
-a:link { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #000000; font-weight: normal; text-decoration: none; }
-a:visited { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #000000; font-weight: normal; text-decoration: none; }
-a:active { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #000000; font-weight: normal; text-decoration: none; }
-a:hover { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #000000; font-weight: normal; text-decoration: underline; }
-
-a.headerLink:link { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ffffff; font-weight: bold; text-decoration: none; }
-a.headerLink:visited { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ffffff; font-weight: bold; text-decoration: none; }
-a.headerLink:active { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ffffff; font-weight: bold; text-decoration: none; }
-a.headerLink:hover { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ffffff; font-weight: bold; text-decoration: underline; }
-
-a.menuBoxHeadingLink:link { font-size: 10px; color: #616060; font-weight: bold; text-decoration: none; }
-a.menuBoxHeadingLink:visited { font-size: 10px; color: #616060; font-weight: bold; text-decoration: none; }
-a.menuBoxHeadingLink:active { font-size: 10px; color: #616060; font-weight: bold; text-decoration: none; }
-a.menuBoxHeadingLink:hover { font-size: 10px; color: #616060; font-weight: bold; text-decoration: none; }
-
-a.menuBoxContentLink:link { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; font-weight: normal; text-decoration: none; }
-a.menuBoxContentLink:visited { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; font-weight: normal; text-decoration: none; }
-a.menuBoxContentLink:active { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; font-weight: normal; text-decoration: none; }
-a.menuBoxContentLink:hover { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; font-weight: normal; text-decoration: underline; }
-
-a.splitPageLink:link { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #0000FF; font-weight: normal; text-decoration: none; }
-a.splitPageLink:visited { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #0000FF; font-weight: normal; text-decoration: none; }
-a.splitPageLink:active { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #0000FF; font-weight: normal; text-decoration: none; }
-a.splitPageLink:hover { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #0000FF; font-weight: normal; text-decoration: underline; background-color: #FFFF33; }
+a { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #000000; font-weight: normal; text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+a.headerLink { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ffffff; font-weight: bold; text-decoration: none; }
+a.headerLink:hover { text-decoration: underline; }
+
+a.menuBoxHeadingLink { font-size: 10px; color: #616060; font-weight: bold; text-decoration: none; }
+a.menuBoxHeadingLink:hover { }
+
+a.menuBoxContentLink { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; font-weight: normal; text-decoration: none; }
+a.menuBoxContentLink:hover { text-decoration: underline; }
+
+a.splitPageLink { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #0000FF; font-weight: normal; text-decoration: none; }
+a.splitPageLink:hover { text-decoration: underline; background-color: #FFFF33; }
 
 /* menu box */
 .menuBoxHeading { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #616060; background-color: #ffffff; }
@@ -84,3 +74,75 @@
 .main { font-family: Verdana, Arial, sans-serif; font-size: 12px; }
 .errorText { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ff0000; }
 
+/* new messageStack styles */
+.secInfo, .secSuccess, .secWarning, .secError {
+  border: 1px solid;
+  margin: 10px 0px;
+  padding: 5px 10px 5px 50px;
+  background-repeat: no-repeat;
+  background-position: 10px center;
+  border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+}
+
+.secInfo {
+  border-color: #00529B;
+  background-image: url('../images/ms_info.png');
+  background: url('../images/ms_info.png') no-repeat 10px center, url('../images/ms_info_bg.png') repeat-x; /* css3 multiple backgrounds */
+  background-color: #BDE5F8;
+}
+
+.secSuccess {
+  border-color: #4F8A10;
+  background-image: url('../images/ms_success.png');
+  background: url('../images/ms_success.png') no-repeat 10px center, url('../images/ms_success_bg.png') repeat-x; /* css3 multiple backgrounds */
+  background-color: #DFF2BF;
+}
+
+.secWarning {
+  border-color: #9F6000;
+  background-color: #FEEFB3;
+  background-image: url('../images/ms_warning.png');
+  background: url('../images/ms_warning.png') no-repeat 10px center, url('../images/ms_warning_bg.png') repeat-x; /* css3 multiple backgrounds */
+  background-color: #FEEFB3;
+}
+
+.secError {
+  border-color: #D8000C;
+  background-image: url('../images/ms_error.png');
+  background: url('../images/ms_error.png') no-repeat 10px center, url('../images/ms_error_bg.png') repeat-x; /* css3 multiple backgrounds */
+  background-color: #FFBABA;
+}
+
+.secInfo p, .secSuccess p, .secWarning p, .secError p {
+  padding: 2px;
+}
+
+#adminAppMenu {
+  float: left;
+  width: 150px;
+  padding: 5px;
+}
+
+#adminAppMenu h3 {
+}
+
+#adminAppMenu ul {
+  list-style: none;
+  margin: -5px 0 -5px -10px;
+  padding: 0;
+}
+
+#contentText {
+  margin-left: 160px;
+}
+
+/* Custom jQuery UI */
+.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 11px; }
+
+/* buttons */
+
+.tdbLink a { }
+
+.tdbLink button { }
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/template_bottom.php 2.3.1.src/admin/includes/template_bottom.php
--- 2.2rc2a.cp.src/admin/includes/template_bottom.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/template_bottom.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,21 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+?>
+
+</div>
+
+<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
+
+<br />
+
+</body>
+</html>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/template_top.php 2.3.1.src/admin/includes/template_top.php
--- 2.2rc2a.cp.src/admin/includes/template_top.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/includes/template_top.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,60 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html <?php echo HTML_PARAMS; ?>>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
+<meta name="robots" content="noindex,nofollow">
+<title><?php echo TITLE; ?></title>
+<base href="<?php echo HTTP_SERVER . DIR_WS_ADMIN; ?>" />
+<!--[if IE]><script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/excanvas.min.js'); ?>"></script><![endif]-->
+<link rel="stylesheet" type="text/css" href="<?php echo tep_catalog_href_link('ext/jquery/ui/redmond/jquery-ui-1.8.6.css'); ?>">
+<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/jquery-1.4.2.min.js'); ?>"></script>
+<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/jquery-ui-1.8.6.min.js'); ?>"></script>
+
+<?php
+  if (tep_not_null(JQUERY_DATEPICKER_I18N_CODE)) {
+?>
+<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/jquery/ui/i18n/jquery.ui.datepicker-' . JQUERY_DATEPICKER_I18N_CODE . '.js'); ?>"></script>
+<script type="text/javascript">
+$.datepicker.setDefaults($.datepicker.regional['<?php echo JQUERY_DATEPICKER_I18N_CODE; ?>']);
+</script>
+<?php
+  }
+?>
+
+<script type="text/javascript" src="<?php echo tep_catalog_href_link('ext/flot/jquery.flot.js'); ?>"></script>
+<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
+<script type="text/javascript" src="includes/general.js"></script>
+</head>
+<body>
+
+<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
+
+<?php
+  if (tep_session_is_registered('admin')) {
+    include(DIR_WS_INCLUDES . 'column_left.php');
+  } else {
+?>
+
+<style>
+#contentText {
+  margin-left: 0;
+}
+</style>
+
+<?php
+  }
+?>
+
+<div id="contentText">
diff -x .svn -aruN 2.2rc2a.cp.src/admin/includes/tld.txt 2.3.1.src/admin/includes/tld.txt
--- 2.2rc2a.cp.src/admin/includes/tld.txt	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/includes/tld.txt	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-# $Id: tld.txt 1739 2007-12-20 00:52:16Z hpdl $
-#
-# osCommerce, Open Source E-Commerce Solutions
-# http://www.oscommerce.com
-#
-# Copyright (c) 2003 osCommerce
-#
-# Released under the GNU General Public License
-#
-
-# Original 7 TLDs
-com     # all are eligible to register
-edu     # degree-granting educational institutions of higher education
-gov     # United States Government
-int     # organizations established by international treaties
-mil     # United States Military
-net     # all are eligible to register
-org     # noncommercial community, all are eligible to register
-
-# Recent additions
-aero    # members of the air-transport industry
-biz     # businesses
-coop    # cooperative associations
-info    # all are eligible to register
-museum  # museums
-name    # individuals
-pro     # credentialed professionals
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/admin/index.php 2.3.1.src/admin/index.php
--- 2.2rc2a.cp.src/admin/index.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/index.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -22,101 +22,84 @@
       $languages_selected = $languages[$i]['code'];
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<meta name="robots" content="noindex,nofollow">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2" height="40">
           <tr>
             <td class="pageHeading"><?php echo STORE_NAME; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_draw_form('adminlanguage', FILENAME_DEFAULT, '', 'get') . tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"') . tep_hide_session_id() . '</form>'; ?></td>
+
+<?php
+  if (sizeof($languages_array) > 1) {
+?>
+
+            <td class="pageHeading" align="right"><?php echo tep_draw_form('adminlanguage', FILENAME_DEFAULT, '', 'get') . tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onchange="this.form.submit();"') . tep_hide_session_id() . '</form>'; ?></td>
+
+<?php
+  }
+?>
+
           </tr>
         </table></td>
       </tr>
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
-  $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
-  $files = array();
-  if ($dir = @dir(DIR_FS_ADMIN . 'includes/modules/index')) {
-    while ($file = $dir->read()) {
-      if (!is_dir($module_directory . $file)) {
-        if (substr($file, strrpos($file, '.')) == $file_extension) {
-          $files[] = $file;
-        }
-      }
-    }
-    sort($files);
-    $dir->close();
-  }
+  if ( defined('MODULE_ADMIN_DASHBOARD_INSTALLED') && tep_not_null(MODULE_ADMIN_DASHBOARD_INSTALLED) ) {
+    $adm_array = explode(';', MODULE_ADMIN_DASHBOARD_INSTALLED);
 
-  $col = 0;
+    $col = 0;
 
-  for ($i=0, $n=sizeof($files); $i<$n; $i++) {
-    if (file_exists(DIR_WS_LANGUAGES . $language . '/modules/index/' . $files[$i])) {
-      include(DIR_WS_LANGUAGES . $language . '/modules/index/' . $files[$i]);
-    }
+    for ( $i=0, $n=sizeof($adm_array); $i<$n; $i++ ) {
+      $adm = $adm_array[$i];
 
-    if ($col < 1) {
-      echo '          <tr>' . "\n";
-    }
+      $class = substr($adm, 0, strrpos($adm, '.'));
+
+      if ( !class_exists($class) ) {
+        include(DIR_WS_LANGUAGES . $language . '/modules/dashboard/' . $adm);
+        include(DIR_WS_MODULES . 'dashboard/' . $class . '.php');
+      }
 
-    $col++;
+      $ad = new $class();
 
-    if ($col <= 2) {
-      echo '            <td width="50%" valign="top">' . "\n";
-    }
+      if ( $ad->isEnabled() ) {
+        if ($col < 1) {
+          echo '          <tr>' . "\n";
+        }
 
-    include('includes/modules/index/' . $files[$i]);
+        $col++;
 
-    if ($col <= 2) {
-      echo '            </td>' . "\n";
-    }
+        if ($col <= 2) {
+          echo '            <td width="50%" valign="top">' . "\n";
+        }
 
-    if ( !isset($files[$i+1]) || ($col == 2) ) {
-      if ( !isset($files[$i+1]) && ($col == 1) ) {
-        echo '            <td width="50%" valign="top">&nbsp;</td>' . "\n";
-      }
+        echo $ad->getOutput();
 
-      $col = 0;
+        if ($col <= 2) {
+          echo '            </td>' . "\n";
+        }
+
+        if ( !isset($adm_array[$i+1]) || ($col == 2) ) {
+          if ( !isset($adm_array[$i+1]) && ($col == 1) ) {
+            echo '            <td width="50%" valign="top">&nbsp;</td>' . "\n";
+          }
 
-      echo '  </tr>' . "\n";
+          $col = 0;
+
+          echo '  </tr>' . "\n";
+        }
+      }
     }
   }
 ?>
         </table></td>
       </tr>
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/invoice.php 2.3.1.src/admin/invoice.php
--- 2.2rc2a.cp.src/admin/invoice.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/invoice.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: invoice.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,14 +21,14 @@
   include(DIR_WS_CLASSES . 'order.php');
   $order = new order($oID);
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
 <title><?php echo TITLE; ?></title>
 <link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
 </head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
+<body>
 
 <!-- body_text //-->
 <table border="0" width="100%" cellspacing="0" cellpadding="2">
@@ -48,10 +48,10 @@
       <tr>
         <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td>
+            <td class="main"><strong><?php echo ENTRY_SOLD_TO; ?></strong></td>
           </tr>
           <tr>
-            <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br>'); ?></td>
+            <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br />'); ?></td>
           </tr>
           <tr>
             <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
@@ -65,10 +65,10 @@
         </table></td>
         <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><b><?php echo ENTRY_SHIP_TO; ?></b></td>
+            <td class="main"><strong><?php echo ENTRY_SHIP_TO; ?></strong></td>
           </tr>
           <tr>
-            <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
+            <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br />'); ?></td>
           </tr>
         </table></td>
       </tr>
@@ -80,7 +80,7 @@
   <tr>
     <td><table border="0" cellspacing="0" cellpadding="2">
       <tr>
-        <td class="main"><b><?php echo ENTRY_PAYMENT_METHOD; ?></b></td>
+        <td class="main"><strong><?php echo ENTRY_PAYMENT_METHOD; ?></strong></td>
         <td class="main"><?php echo $order->info['payment_method']; ?></td>
       </tr>
     </table></td>
@@ -107,7 +107,7 @@
 
       if (isset($order->products[$i]['attributes']) && (($k = sizeof($order->products[$i]['attributes'])) > 0)) {
         for ($j = 0; $j < $k; $j++) {
-          echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
+          echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
           if ($order->products[$i]['attributes'][$j]['price'] != '0') echo ' (' . $order->products[$i]['attributes'][$j]['prefix'] . $currencies->format($order->products[$i]['attributes'][$j]['price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . ')';
           echo '</i></small></nobr>';
         }
@@ -116,10 +116,10 @@
       echo '        </td>' . "\n" .
            '        <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n";
       echo '        <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" .
-           '        <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '        <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '        <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '        <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n";
+           '        <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '        <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '        <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '        <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n";
       echo '      </tr>' . "\n";
     }
 ?>
@@ -140,7 +140,7 @@
 </table>
 <!-- body_text_eof //-->
 
-<br>
+<br />
 </body>
 </html>
 <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/languages.php 2.3.1.src/admin/languages.php
--- 2.2rc2a.cp.src/admin/languages.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/languages.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: languages.php 1755 2007-12-21 14:02:36Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -117,30 +117,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -175,7 +156,7 @@
     }
 
     if (DEFAULT_LANGUAGE == $languages['code']) {
-      echo '                <td class="dataTableContent"><b>' . $languages['name'] . ' (' . TEXT_DEFAULT . ')</b></td>' . "\n";
+      echo '                <td class="dataTableContent"><strong>' . $languages['name'] . ' (' . TEXT_DEFAULT . ')</strong></td>' . "\n";
     } else {
       echo '                <td class="dataTableContent">' . $languages['name'] . '</td>' . "\n";
     }
@@ -196,7 +177,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td align="right" colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=new') . '">' . tep_image_button('button_new_language.gif', IMAGE_NEW_LANGUAGE) . '</a>'; ?></td>
+                    <td class="smallText" align="right" colspan="2"><?php echo tep_draw_button(IMAGE_NEW_LANGUAGE, 'plus', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -210,48 +191,48 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_LANGUAGE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_LANGUAGE . '</strong>');
 
       $contents = array('form' => tep_draw_form('languages', FILENAME_LANGUAGES, 'action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_NAME . '<br>' . tep_draw_input_field('name'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_CODE . '<br>' . tep_draw_input_field('code'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_IMAGE . '<br>' . tep_draw_input_field('image', 'icon.gif'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br>' . tep_draw_input_field('directory'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_SORT_ORDER . '<br>' . tep_draw_input_field('sort_order'));
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . ' <a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $HTTP_GET_VARS['lID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_NAME . '<br />' . tep_draw_input_field('name'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_CODE . '<br />' . tep_draw_input_field('code'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_IMAGE . '<br />' . tep_draw_input_field('image', 'icon.gif'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br />' . tep_draw_input_field('directory'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_SORT_ORDER . '<br />' . tep_draw_input_field('sort_order'));
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $HTTP_GET_VARS['lID'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_LANGUAGE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_LANGUAGE . '</strong>');
 
       $contents = array('form' => tep_draw_form('languages', FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_NAME . '<br>' . tep_draw_input_field('name', $lInfo->name));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_CODE . '<br>' . tep_draw_input_field('code', $lInfo->code));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_IMAGE . '<br>' . tep_draw_input_field('image', $lInfo->image));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br>' . tep_draw_input_field('directory', $lInfo->directory));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_SORT_ORDER . '<br>' . tep_draw_input_field('sort_order', $lInfo->sort_order));
-      if (DEFAULT_LANGUAGE != $lInfo->code) $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_NAME . '<br />' . tep_draw_input_field('name', $lInfo->name));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_CODE . '<br />' . tep_draw_input_field('code', $lInfo->code));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_IMAGE . '<br />' . tep_draw_input_field('image', $lInfo->image));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br />' . tep_draw_input_field('directory', $lInfo->directory));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_SORT_ORDER . '<br />' . tep_draw_input_field('sort_order', $lInfo->sort_order));
+      if (DEFAULT_LANGUAGE != $lInfo->code) $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_LANGUAGE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_LANGUAGE . '</strong>');
 
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $lInfo->name . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . (($remove_language) ? '<a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=deleteconfirm') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>' : '') . ' <a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $lInfo->name . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . (($remove_language) ? tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=deleteconfirm'), 'primary') : '') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id)));
       break;
     default:
       if (is_object($lInfo)) {
-        $heading[] = array('text' => '<b>' . $lInfo->name . '</b>');
+        $heading[] = array('text' => '<strong>' . $lInfo->name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a> <a href="' . tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $lInfo->directory) . '">' . tep_image_button('button_details.gif', IMAGE_DETAILS) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_NAME . ' ' . $lInfo->name);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_LANGUAGES, 'page=' . $HTTP_GET_VARS['page'] . '&lID=' . $lInfo->languages_id . '&action=delete')) . tep_draw_button(IMAGE_DETAILS, 'info', tep_href_link(FILENAME_DEFINE_LANGUAGE, 'lngdir=' . $lInfo->directory)));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_NAME . ' ' . $lInfo->name);
         $contents[] = array('text' => TEXT_INFO_LANGUAGE_CODE . ' ' . $lInfo->code);
-        $contents[] = array('text' => '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $lInfo->directory . '/images/' . $lInfo->image, $lInfo->name));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br>' . DIR_WS_CATALOG_LANGUAGES . '<b>' . $lInfo->directory . '</b>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_LANGUAGE_SORT_ORDER . ' ' . $lInfo->sort_order);
+        $contents[] = array('text' => '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $lInfo->directory . '/images/' . $lInfo->image, $lInfo->name));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_DIRECTORY . '<br />' . DIR_WS_CATALOG_LANGUAGES . '<strong>' . $lInfo->directory . '</strong>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_LANGUAGE_SORT_ORDER . ' ' . $lInfo->sort_order);
       }
       break;
   }
@@ -268,16 +249,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/login.php 2.3.1.src/admin/login.php
--- 2.2rc2a.cp.src/admin/login.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/login.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,61 +1,94 @@
 <?php
 /*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
+  $login_request = true;
+
   require('includes/application_top.php');
   require('includes/functions/password_funcs.php');
 
   $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
 
+// prepare to logout an active administrator if the login page is accessed again
+  if (tep_session_is_registered('admin')) {
+    $action = 'logoff';
+  }
+
   if (tep_not_null($action)) {
     switch ($action) {
       case 'process':
-        $username = tep_db_prepare_input($HTTP_POST_VARS['username']);
-        $password = tep_db_prepare_input($HTTP_POST_VARS['password']);
+        if (tep_session_is_registered('redirect_origin') && isset($redirect_origin['auth_user'])) {
+          $username = tep_db_prepare_input($redirect_origin['auth_user']);
+          $password = tep_db_prepare_input($redirect_origin['auth_pw']);
+        } else {
+          $username = tep_db_prepare_input($HTTP_POST_VARS['username']);
+          $password = tep_db_prepare_input($HTTP_POST_VARS['password']);
+        }
+
+        $actionRecorder = new actionRecorderAdmin('ar_admin_login', null, $username);
 
-        $check_query = tep_db_query("select id, user_name, user_password from " . TABLE_ADMINISTRATORS . " where user_name = '" . tep_db_input($username) . "'");
+        if ($actionRecorder->canPerform()) {
+          $check_query = tep_db_query("select id, user_name, user_password from " . TABLE_ADMINISTRATORS . " where user_name = '" . tep_db_input($username) . "'");
 
-        if (tep_db_num_rows($check_query) == 1) {
-          $check = tep_db_fetch_array($check_query);
+          if (tep_db_num_rows($check_query) == 1) {
+            $check = tep_db_fetch_array($check_query);
 
-          if (tep_validate_password($password, $check['user_password'])) {
-            tep_session_register('admin');
+            if (tep_validate_password($password, $check['user_password'])) {
+// migrate old hashed password to new phpass password
+              if (tep_password_type($check['user_password']) != 'phpass') {
+                tep_db_query("update " . TABLE_ADMINISTRATORS . " set user_password = '" . tep_encrypt_password($password) . "' where id = '" . (int)$check['id'] . "'");
+              }
 
-            $admin = array('id' => $check['id'],
-                           'username' => $check['user_name']);
+              tep_session_register('admin');
 
-            if (tep_session_is_registered('redirect_origin')) {
-              $page = $redirect_origin['page'];
-              $get_string = '';
+              $admin = array('id' => $check['id'],
+                             'username' => $check['user_name']);
 
-              if (function_exists('http_build_query')) {
-                $get_string = http_build_query($redirect_origin['get']);
-              }
+              $actionRecorder->_user_id = $admin['id'];
+              $actionRecorder->record();
+
+              if (tep_session_is_registered('redirect_origin')) {
+                $page = $redirect_origin['page'];
+                $get_string = '';
+
+                if (function_exists('http_build_query')) {
+                  $get_string = http_build_query($redirect_origin['get']);
+                }
 
-              tep_session_unregister('redirect_origin');
+                tep_session_unregister('redirect_origin');
 
-              tep_redirect(tep_href_link($page, $get_string));
-            } else {
-              tep_redirect(tep_href_link(FILENAME_DEFAULT));
+                tep_redirect(tep_href_link($page, $get_string));
+              } else {
+                tep_redirect(tep_href_link(FILENAME_DEFAULT));
+              }
             }
           }
+
+          $messageStack->add(ERROR_INVALID_ADMINISTRATOR, 'error');
+        } else {
+          $messageStack->add(sprintf(ERROR_ACTION_RECORDER, (defined('MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES') ? (int)MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES : 5)));
         }
 
-        $messageStack->add(ERROR_INVALID_ADMINISTRATOR, 'error');
+        $actionRecorder->record(false);
 
         break;
 
       case 'logoff':
-        tep_session_unregister('selected_box');
         tep_session_unregister('admin');
+
+        if (isset($HTTP_SERVER_VARS['PHP_AUTH_USER']) && !empty($HTTP_SERVER_VARS['PHP_AUTH_USER']) && isset($HTTP_SERVER_VARS['PHP_AUTH_PW']) && !empty($HTTP_SERVER_VARS['PHP_AUTH_PW'])) {
+          tep_session_register('auth_ignore');
+          $auth_ignore = true;
+        }
+
         tep_redirect(tep_href_link(FILENAME_DEFAULT));
 
         break;
@@ -67,7 +100,7 @@
           $username = tep_db_prepare_input($HTTP_POST_VARS['username']);
           $password = tep_db_prepare_input($HTTP_POST_VARS['password']);
 
-          tep_db_query('insert into ' . TABLE_ADMINISTRATORS . ' (user_name, user_password) values ("' . $username . '", "' . tep_encrypt_password($password) . '")');
+          tep_db_query("insert into " . TABLE_ADMINISTRATORS . " (user_name, user_password) values ('" . tep_db_input($username) . "', '" . tep_db_input(tep_encrypt_password($password)) . "')");
         }
 
         tep_redirect(tep_href_link(FILENAME_LOGIN));
@@ -91,28 +124,26 @@
   if (tep_db_num_rows($admins_check_query) < 1) {
     $messageStack->add(TEXT_CREATE_FIRST_ADMINISTRATOR, 'warning');
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<meta name="robots" content="noindex,nofollow">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
 
-<!-- body //-->
 <table border="0" width="100%" cellspacing="2" cellpadding="2">
   <tr>
     <td><table border="0" width="100%" cellspacing="0" cellpadding="0" height="40">
       <tr>
         <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-        <td class="pageHeading" align="right"><?php echo tep_draw_form('adminlanguage', FILENAME_DEFAULT, '', 'get') . tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"') . tep_hide_session_id() . '</form>'; ?></td>
+
+<?php
+  if (sizeof($languages_array) > 1) {
+?>
+
+        <td class="pageHeading" align="right"><?php echo tep_draw_form('adminlanguage', FILENAME_DEFAULT, '', 'get') . tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onchange="this.form.submit();"') . tep_hide_session_id() . '</form>'; ?></td>
+
+<?php
+  }
+?>
+
       </tr>
     </table></td>
   </tr>
@@ -124,20 +155,20 @@
   $contents = array();
 
   if (tep_db_num_rows($admins_check_query) > 0) {
-    $heading[] = array('text' => '<b>' . HEADING_TITLE . '</b>');
+    $heading[] = array('text' => '<strong>' . HEADING_TITLE . '</strong>');
 
     $contents = array('form' => tep_draw_form('login', FILENAME_LOGIN, 'action=process'));
-    $contents[] = array('text' => TEXT_USERNAME . '<br>' . tep_draw_input_field('username'));
-    $contents[] = array('text' => '<br>' . TEXT_PASSWORD . '<br>' . tep_draw_password_field('password'));
-    $contents[] = array('align' => 'center', 'text' => '<br><input type="submit" value="' . BUTTON_LOGIN . '" />');
+    $contents[] = array('text' => TEXT_USERNAME . '<br />' . tep_draw_input_field('username'));
+    $contents[] = array('text' => '<br />' . TEXT_PASSWORD . '<br />' . tep_draw_password_field('password'));
+    $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(BUTTON_LOGIN, 'key'));
   } else {
-    $heading[] = array('text' => '<b>' . HEADING_TITLE . '</b>');
+    $heading[] = array('text' => '<strong>' . HEADING_TITLE . '</strong>');
 
     $contents = array('form' => tep_draw_form('login', FILENAME_LOGIN, 'action=create'));
     $contents[] = array('text' => TEXT_CREATE_FIRST_ADMINISTRATOR);
-    $contents[] = array('text' => '<br>' . TEXT_USERNAME . '<br>' . tep_draw_input_field('username'));
-    $contents[] = array('text' => '<br>' . TEXT_PASSWORD . '<br>' . tep_draw_password_field('password'));
-    $contents[] = array('align' => 'center', 'text' => '<br><input type="submit" value="' . BUTTON_CREATE_ADMINISTRATOR . '" />');
+    $contents[] = array('text' => '<br />' . TEXT_USERNAME . '<br />' . tep_draw_input_field('username'));
+    $contents[] = array('text' => '<br />' . TEXT_PASSWORD . '<br />' . tep_draw_password_field('password'));
+    $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(BUTTON_CREATE_ADMINISTRATOR, 'key'));
   }
 
   $box = new box;
@@ -147,12 +178,8 @@
     </td>
   </tr>
 </table>
-<!-- body_eof //-->
 
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/mail.php 2.3.1.src/admin/mail.php
--- 2.2rc2a.cp.src/admin/mail.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/mail.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: mail.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -38,8 +38,15 @@
 
     //Let's build a message object using the email class
     $mimemessage = new email(array('X-Mailer: osCommerce'));
-    // add the message to the object
-    $mimemessage->add_text($message);
+
+    // Build the text version
+    $text = strip_tags($message);
+    if (EMAIL_USE_HTML == 'true') {
+      $mimemessage->add_html($message, $text);
+    } else {
+      $mimemessage->add_text($message);
+    }
+
     $mimemessage->build_message();
     while ($mail = tep_db_fetch_array($mail_query)) {
       $mimemessage->send($mail['customers_firstname'] . ' ' . $mail['customers_lastname'], $mail['customers_email_address'], '', $from, $subject);
@@ -55,29 +62,11 @@
   if (isset($HTTP_GET_VARS['mail_sent_to'])) {
     $messageStack->add(sprintf(NOTICE_EMAIL_SENT_TO, $HTTP_GET_VARS['mail_sent_to']), 'success');
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="0">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -108,31 +97,31 @@
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TEXT_CUSTOMER; ?></b><br><?php echo $mail_sent_to; ?></td>
+                <td class="smallText"><strong><?php echo TEXT_CUSTOMER; ?></strong><br /><?php echo $mail_sent_to; ?></td>
               </tr>
               <tr>
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TEXT_FROM; ?></b><br><?php echo htmlspecialchars(stripslashes($HTTP_POST_VARS['from'])); ?></td>
+                <td class="smallText"><strong><?php echo TEXT_FROM; ?></strong><br /><?php echo htmlspecialchars(stripslashes($HTTP_POST_VARS['from'])); ?></td>
               </tr>
               <tr>
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TEXT_SUBJECT; ?></b><br><?php echo htmlspecialchars(stripslashes($HTTP_POST_VARS['subject'])); ?></td>
+                <td class="smallText"><strong><?php echo TEXT_SUBJECT; ?></strong><br /><?php echo htmlspecialchars(stripslashes($HTTP_POST_VARS['subject'])); ?></td>
               </tr>
               <tr>
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TEXT_MESSAGE; ?></b><br><?php echo nl2br(htmlspecialchars(stripslashes($HTTP_POST_VARS['message']))); ?></td>
+                <td class="smallText"><strong><?php echo TEXT_MESSAGE; ?></strong><br /><?php echo nl2br(htmlspecialchars(stripslashes($HTTP_POST_VARS['message']))); ?></td>
               </tr>
               <tr>
                 <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td>
+                <td class="smallText" align="right">
 <?php
 /* Re-Post all POST'ed variables */
     reset($HTTP_POST_VARS);
@@ -141,13 +130,10 @@
         echo tep_draw_hidden_field($key, htmlspecialchars(stripslashes($value)));
       }
     }
+
+    echo tep_draw_button(IMAGE_SEND_EMAIL, 'mail-closed', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_MAIL));
 ?>
-                <table border="0" width="100%" cellpadding="0" cellspacing="2">
-                  <tr>
-                    <td><?php echo tep_image_submit('button_back.gif', IMAGE_BACK, 'name="back"'); ?></td>
-                    <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_MAIL) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a> ' . tep_image_submit('button_send_mail.gif', IMAGE_SEND_EMAIL); ?></td>
-                  </tr>
-                </table></td>
+                </td>
               </tr>
             </table></td>
           </form></tr>
@@ -199,25 +185,18 @@
                 <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
               </tr>
               <tr>
-                <td colspan="2" align="right"><?php echo tep_image_submit('button_send_mail.gif', IMAGE_SEND_EMAIL); ?></td>
+                <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_PREVIEW, 'document', null, 'primary'); ?></td>
               </tr>
             </table></td>
           </form></tr>
 <?php
   }
 ?>
-<!-- body_text_eof //-->
         </table></td>
       </tr>
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/manufacturers.php 2.3.1.src/admin/manufacturers.php
--- 2.2rc2a.cp.src/admin/manufacturers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/manufacturers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: manufacturers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -38,8 +38,11 @@
           tep_db_perform(TABLE_MANUFACTURERS, $sql_data_array, 'update', "manufacturers_id = '" . (int)$manufacturers_id . "'");
         }
 
-        if ($manufacturers_image = new upload('manufacturers_image', DIR_FS_CATALOG_IMAGES)) {
-          tep_db_query("update " . TABLE_MANUFACTURERS . " set manufacturers_image = '" . $manufacturers_image->filename . "' where manufacturers_id = '" . (int)$manufacturers_id . "'");
+        $manufacturers_image = new upload('manufacturers_image');
+        $manufacturers_image->set_destination(DIR_FS_CATALOG_IMAGES);
+
+        if ($manufacturers_image->parse() && $manufacturers_image->save()) {
+          tep_db_query("update " . TABLE_MANUFACTURERS . " set manufacturers_image = '" . tep_db_input($manufacturers_image->filename) . "' where manufacturers_id = '" . (int)$manufacturers_id . "'");
         }
 
         $languages = tep_get_languages();
@@ -99,30 +102,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -176,7 +160,7 @@
   if (empty($action)) {
 ?>
               <tr>
-                <td align="right" colspan="2" class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=new') . '">' . tep_image_button('button_insert.gif', IMAGE_INSERT) . '</a>'; ?></td>
+                <td align="right" colspan="2" class="smallText"><?php echo tep_draw_button(IMAGE_INSERT, 'plus', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=new')); ?></td>
               </tr>
 <?php
   }
@@ -188,63 +172,63 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_HEADING_NEW_MANUFACTURER . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_HEADING_NEW_MANUFACTURER . '</strong>');
 
       $contents = array('form' => tep_draw_form('manufacturers', FILENAME_MANUFACTURERS, 'action=insert', 'post', 'enctype="multipart/form-data"'));
       $contents[] = array('text' => TEXT_NEW_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_NAME . '<br>' . tep_draw_input_field('manufacturers_name'));
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_IMAGE . '<br>' . tep_draw_file_field('manufacturers_image'));
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_NAME . '<br />' . tep_draw_input_field('manufacturers_name'));
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_IMAGE . '<br />' . tep_draw_file_field('manufacturers_image'));
 
       $manufacturer_inputs_string = '';
       $languages = tep_get_languages();
       for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-        $manufacturer_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('manufacturers_url[' . $languages[$i]['id'] . ']');
+        $manufacturer_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('manufacturers_url[' . $languages[$i]['id'] . ']');
       }
 
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_URL . $manufacturer_inputs_string);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_save.gif', IMAGE_SAVE) . ' <a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $HTTP_GET_VARS['mID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_URL . $manufacturer_inputs_string);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $HTTP_GET_VARS['mID'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_HEADING_EDIT_MANUFACTURER . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_HEADING_EDIT_MANUFACTURER . '</strong>');
 
       $contents = array('form' => tep_draw_form('manufacturers', FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=save', 'post', 'enctype="multipart/form-data"'));
       $contents[] = array('text' => TEXT_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_NAME . '<br>' . tep_draw_input_field('manufacturers_name', $mInfo->manufacturers_name));
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_IMAGE . '<br>' . tep_draw_file_field('manufacturers_image') . '<br>' . $mInfo->manufacturers_image);
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_NAME . '<br />' . tep_draw_input_field('manufacturers_name', $mInfo->manufacturers_name));
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_IMAGE . '<br />' . tep_draw_file_field('manufacturers_image') . '<br />' . $mInfo->manufacturers_image);
 
       $manufacturer_inputs_string = '';
       $languages = tep_get_languages();
       for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-        $manufacturer_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('manufacturers_url[' . $languages[$i]['id'] . ']', tep_get_manufacturer_url($mInfo->manufacturers_id, $languages[$i]['id']));
+        $manufacturer_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('manufacturers_url[' . $languages[$i]['id'] . ']', tep_get_manufacturer_url($mInfo->manufacturers_id, $languages[$i]['id']));
       }
 
-      $contents[] = array('text' => '<br>' . TEXT_MANUFACTURERS_URL . $manufacturer_inputs_string);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_save.gif', IMAGE_SAVE) . ' <a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_MANUFACTURERS_URL . $manufacturer_inputs_string);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_HEADING_DELETE_MANUFACTURER . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_HEADING_DELETE_MANUFACTURER . '</strong>');
 
       $contents = array('form' => tep_draw_form('manufacturers', FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $mInfo->manufacturers_name . '</b>');
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('delete_image', '', true) . ' ' . TEXT_DELETE_IMAGE);
+      $contents[] = array('text' => '<br /><strong>' . $mInfo->manufacturers_name . '</strong>');
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('delete_image', '', true) . ' ' . TEXT_DELETE_IMAGE);
 
       if ($mInfo->products_count > 0) {
-        $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('delete_products') . ' ' . TEXT_DELETE_PRODUCTS);
-        $contents[] = array('text' => '<br>' . sprintf(TEXT_DELETE_WARNING_PRODUCTS, $mInfo->products_count));
+        $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('delete_products') . ' ' . TEXT_DELETE_PRODUCTS);
+        $contents[] = array('text' => '<br />' . sprintf(TEXT_DELETE_WARNING_PRODUCTS, $mInfo->products_count));
       }
 
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id)));
       break;
     default:
       if (isset($mInfo) && is_object($mInfo)) {
-        $heading[] = array('text' => '<b>' . $mInfo->manufacturers_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $mInfo->manufacturers_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_DATE_ADDED . ' ' . tep_date_short($mInfo->date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_MANUFACTURERS, 'page=' . $HTTP_GET_VARS['page'] . '&mID=' . $mInfo->manufacturers_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_DATE_ADDED . ' ' . tep_date_short($mInfo->date_added));
         if (tep_not_null($mInfo->last_modified)) $contents[] = array('text' => TEXT_LAST_MODIFIED . ' ' . tep_date_short($mInfo->last_modified));
-        $contents[] = array('text' => '<br>' . tep_info_image($mInfo->manufacturers_image, $mInfo->manufacturers_name));
-        $contents[] = array('text' => '<br>' . TEXT_PRODUCTS . ' ' . $mInfo->products_count);
+        $contents[] = array('text' => '<br />' . tep_info_image($mInfo->manufacturers_image, $mInfo->manufacturers_name));
+        $contents[] = array('text' => '<br />' . TEXT_PRODUCTS . ' ' . $mInfo->products_count);
       }
       break;
   }
@@ -261,16 +245,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/modules.php 2.3.1.src/admin/modules.php
--- 2.2rc2a.cp.src/admin/modules.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/modules.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: modules.php 1802 2008-01-11 16:59:17Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -14,35 +14,25 @@
 
   $set = (isset($HTTP_GET_VARS['set']) ? $HTTP_GET_VARS['set'] : '');
 
-  if (tep_not_null($set)) {
-    switch ($set) {
-      case 'shipping':
-        $module_type = 'shipping';
-        $module_directory = DIR_FS_CATALOG_MODULES . 'shipping/';
-        $module_key = 'MODULE_SHIPPING_INSTALLED';
-        define('HEADING_TITLE', HEADING_TITLE_MODULES_SHIPPING);
-        break;
-      case 'ordertotal':
-        $module_type = 'order_total';
-        $module_directory = DIR_FS_CATALOG_MODULES . 'order_total/';
-        $module_key = 'MODULE_ORDER_TOTAL_INSTALLED';
-        define('HEADING_TITLE', HEADING_TITLE_MODULES_ORDER_TOTAL);
-        break;
-      case 'payment':
-      default:
-        $module_type = 'payment';
-        $module_directory = DIR_FS_CATALOG_MODULES . 'payment/';
-        $module_key = 'MODULE_PAYMENT_INSTALLED';
-        define('HEADING_TITLE', HEADING_TITLE_MODULES_PAYMENT);
-        break;
-    }
+  $modules = $cfgModules->getAll();
+
+  if (empty($set) || !$cfgModules->exists($set)) {
+    $set = $modules[0]['code'];
   }
 
+  $module_type = $cfgModules->get($set, 'code');
+  $module_directory = $cfgModules->get($set, 'directory');
+  $module_language_directory = $cfgModules->get($set, 'language_directory');
+  $module_key = $cfgModules->get($set, 'key');;
+  define('HEADING_TITLE', $cfgModules->get($set, 'title'));
+  $template_integration = $cfgModules->get($set, 'template_integration');
+
   $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
 
   if (tep_not_null($action)) {
     switch ($action) {
       case 'save':
+        reset($HTTP_POST_VARS['configuration']);
         while (list($key, $value) = each($HTTP_POST_VARS['configuration'])) {
           tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . $value . "' where configuration_key = '" . $key . "'");
         }
@@ -57,43 +47,68 @@
           $module = new $class;
           if ($action == 'install') {
             $module->install();
+
+            $modules_installed = explode(';', constant($module_key));
+            $modules_installed[] = $class . $file_extension;
+            tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
+            tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class));
           } elseif ($action == 'remove') {
             $module->remove();
+
+            $modules_installed = explode(';', constant($module_key));
+            unset($modules_installed[array_search($class . $file_extension, $modules_installed)]);
+            tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $modules_installed) . "' where configuration_key = '" . $module_key . "'");
+            tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set));
           }
         }
         tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class));
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
+  $modules_installed = (defined($module_key) ? explode(';', constant($module_key)) : array());
+  $new_modules_counter = 0;
+
+  $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
+  $directory_array = array();
+  if ($dir = @dir($module_directory)) {
+    while ($file = $dir->read()) {
+      if (!is_dir($module_directory . $file)) {
+        if (substr($file, strrpos($file, '.')) == $file_extension) {
+          if (isset($HTTP_GET_VARS['list']) && ($HTTP_GET_VARS['list'] = 'new')) {
+            if (!in_array($file, $modules_installed)) {
+              $directory_array[] = $file;
+            }
+          } else {
+            if (in_array($file, $modules_installed)) {
+              $directory_array[] = $file;
+            } else {
+              $new_modules_counter++;
+            }
+          }
+        }
+      }
+    }
+    sort($directory_array);
+    $dir->close();
+  }
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
             <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
             <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
+<?php
+  if (isset($HTTP_GET_VARS['list'])) {
+    echo '            <td class="smallText" align="right">' . tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_MODULES, 'set=' . $set)) . '</td>';
+  } else {
+    echo '            <td class="smallText" align="right">' . tep_draw_button(IMAGE_MODULE_INSTALL . ' (' . $new_modules_counter . ')', 'plus', tep_href_link(FILENAME_MODULES, 'set=' . $set . '&list=new')) . '</td>';
+  }
+?>
           </tr>
         </table></td>
       </tr>
@@ -107,32 +122,18 @@
                 <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
               </tr>
 <?php
-  $file_extension = substr($PHP_SELF, strrpos($PHP_SELF, '.'));
-  $directory_array = array();
-  if ($dir = @dir($module_directory)) {
-    while ($file = $dir->read()) {
-      if (!is_dir($module_directory . $file)) {
-        if (substr($file, strrpos($file, '.')) == $file_extension) {
-          $directory_array[] = $file;
-        }
-      }
-    }
-    sort($directory_array);
-    $dir->close();
-  }
-
   $installed_modules = array();
   for ($i=0, $n=sizeof($directory_array); $i<$n; $i++) {
     $file = $directory_array[$i];
 
-    include(DIR_FS_CATALOG_LANGUAGES . $language . '/modules/' . $module_type . '/' . $file);
+    include($module_language_directory . $language . '/modules/' . $module_type . '/' . $file);
     include($module_directory . $file);
 
     $class = substr($file, 0, strrpos($file, '.'));
     if (tep_class_exists($class)) {
       $module = new $class;
       if ($module->check() > 0) {
-        if ($module->sort_order > 0) {
+        if (($module->sort_order > 0) && !isset($installed_modules[$module->sort_order])) {
           $installed_modules[$module->sort_order] = $file;
         } else {
           $installed_modules[] = $file;
@@ -144,7 +145,8 @@
                              'title' => $module->title,
                              'description' => $module->description,
                              'status' => $module->check(),
-                             'signature' => (isset($module->signature) ? $module->signature : null));
+                             'signature' => (isset($module->signature) ? $module->signature : null),
+                             'api_version' => (isset($module->api_version) ? $module->api_version : null));
 
         $module_keys = $module->keys();
 
@@ -172,26 +174,43 @@
           echo '              <tr id="defaultSelected" class="dataTableRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">' . "\n";
         }
       } else {
-        echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class) . '\'">' . "\n";
+        echo '              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="document.location.href=\'' . tep_href_link(FILENAME_MODULES, 'set=' . $set . (isset($HTTP_GET_VARS['list']) ? '&list=new' : '') . '&module=' . $class) . '\'">' . "\n";
       }
 ?>
                 <td class="dataTableContent"><?php echo $module->title; ?></td>
                 <td class="dataTableContent" align="right"><?php if (is_numeric($module->sort_order)) echo $module->sort_order; ?></td>
-                <td class="dataTableContent" align="right"><?php if (isset($mInfo) && is_object($mInfo) && ($class == $mInfo->code) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif'); } else { echo '<a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $class) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
+                <td class="dataTableContent" align="right"><?php if (isset($mInfo) && is_object($mInfo) && ($class == $mInfo->code) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif'); } else { echo '<a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . (isset($HTTP_GET_VARS['list']) ? '&list=new' : '') . '&module=' . $class) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
               </tr>
 <?php
     }
   }
 
-  ksort($installed_modules);
-  $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = '" . $module_key . "'");
-  if (tep_db_num_rows($check_query)) {
-    $check = tep_db_fetch_array($check_query);
-    if ($check['configuration_value'] != implode(';', $installed_modules)) {
-      tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $installed_modules) . "', last_modified = now() where configuration_key = '" . $module_key . "'");
+  if (!isset($HTTP_GET_VARS['list'])) {
+    ksort($installed_modules);
+    $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = '" . $module_key . "'");
+    if (tep_db_num_rows($check_query)) {
+      $check = tep_db_fetch_array($check_query);
+      if ($check['configuration_value'] != implode(';', $installed_modules)) {
+        tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $installed_modules) . "', last_modified = now() where configuration_key = '" . $module_key . "'");
+      }
+    } else {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Installed Modules', '" . $module_key . "', '" . implode(';', $installed_modules) . "', 'This is automatically updated. No need to edit.', '6', '0', now())");
+    }
+
+    if ($template_integration == true) {
+      $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'TEMPLATE_BLOCK_GROUPS'");
+      if (tep_db_num_rows($check_query)) {
+        $check = tep_db_fetch_array($check_query);
+        $tbgroups_array = explode(';', $check['configuration_value']);
+        if (!in_array($module_type, $tbgroups_array)) {
+          $tbgroups_array[] = $module_type;
+          sort($tbgroups_array);
+          tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . implode(';', $tbgroups_array) . "', last_modified = now() where configuration_key = 'TEMPLATE_BLOCK_GROUPS'");
+        }
+      } else {
+        tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Installed Template Block Groups', 'TEMPLATE_BLOCK_GROUPS', '" . $module_type . "', 'This is automatically updated. No need to edit.', '6', '0', now())");
+      }
     }
-  } else {
-    tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Installed Modules', '" . $module_key . "', '" . implode(';', $installed_modules) . "', 'This is automatically updated. No need to edit.', '6', '0', now())");
   }
 ?>
               <tr>
@@ -207,36 +226,36 @@
       $keys = '';
       reset($mInfo->keys);
       while (list($key, $value) = each($mInfo->keys)) {
-        $keys .= '<b>' . $value['title'] . '</b><br>' . $value['description'] . '<br>';
+        $keys .= '<strong>' . $value['title'] . '</strong><br />' . $value['description'] . '<br />';
 
         if ($value['set_function']) {
           eval('$keys .= ' . $value['set_function'] . "'" . $value['value'] . "', '" . $key . "');");
         } else {
           $keys .= tep_draw_input_field('configuration[' . $key . ']', $value['value']);
         }
-        $keys .= '<br><br>';
+        $keys .= '<br /><br />';
       }
-      $keys = substr($keys, 0, strrpos($keys, '<br><br>'));
+      $keys = substr($keys, 0, strrpos($keys, '<br /><br />'));
 
-      $heading[] = array('text' => '<b>' . $mInfo->title . '</b>');
+      $heading[] = array('text' => '<strong>' . $mInfo->title . '</strong>');
 
       $contents = array('form' => tep_draw_form('modules', FILENAME_MODULES, 'set=' . $set . '&module=' . $HTTP_GET_VARS['module'] . '&action=save'));
       $contents[] = array('text' => $keys);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $HTTP_GET_VARS['module']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $HTTP_GET_VARS['module'])));
       break;
     default:
-      $heading[] = array('text' => '<b>' . $mInfo->title . '</b>');
+      $heading[] = array('text' => '<strong>' . $mInfo->title . '</strong>');
 
       if ($mInfo->status == '1') {
         $keys = '';
         reset($mInfo->keys);
         while (list(, $value) = each($mInfo->keys)) {
-          $keys .= '<b>' . $value['title'] . '</b><br>';
+          $keys .= '<strong>' . $value['title'] . '</strong><br />';
           if ($value['use_function']) {
             $use_function = $value['use_function'];
-            if (ereg('->', $use_function)) {
+            if (preg_match('/->/', $use_function)) {
               $class_method = explode('->', $use_function);
-              if (!is_object(${$class_method[0]})) {
+              if (!isset(${$class_method[0]}) || !is_object(${$class_method[0]})) {
                 include(DIR_WS_CLASSES . $class_method[0] . '.php');
                 ${$class_method[0]} = new $class_method[0]();
               }
@@ -247,26 +266,36 @@
           } else {
             $keys .= $value['value'];
           }
-          $keys .= '<br><br>';
+          $keys .= '<br /><br />';
         }
-        $keys = substr($keys, 0, strrpos($keys, '<br><br>'));
+        $keys = substr($keys, 0, strrpos($keys, '<br /><br />'));
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $mInfo->code . '&action=remove') . '">' . tep_image_button('button_module_remove.gif', IMAGE_MODULE_REMOVE) . '</a> <a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . (isset($HTTP_GET_VARS['module']) ? '&module=' . $HTTP_GET_VARS['module'] : '') . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a>');
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_MODULES, 'set=' . $set . (isset($HTTP_GET_VARS['module']) ? '&module=' . $HTTP_GET_VARS['module'] : '') . '&action=edit')) . tep_draw_button(IMAGE_MODULE_REMOVE, 'minus', tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $mInfo->code . '&action=remove')));
 
         if (isset($mInfo->signature) && (list($scode, $smodule, $sversion, $soscversion) = explode('|', $mInfo->signature))) {
-          $contents[] = array('text' => '<br>' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<b>' . TEXT_INFO_VERSION . '</b> ' . $sversion . ' (<a href="http://sig.oscommerce.com/' . $mInfo->signature . '" target="_blank">' . TEXT_INFO_ONLINE_STATUS . '</a>)');
+          $contents[] = array('text' => '<br />' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<strong>' . TEXT_INFO_VERSION . '</strong> ' . $sversion . ' (<a href="http://sig.oscommerce.com/' . $mInfo->signature . '" target="_blank">' . TEXT_INFO_ONLINE_STATUS . '</a>)');
         }
 
-        $contents[] = array('text' => '<br>' . $mInfo->description);
-        $contents[] = array('text' => '<br>' . $keys);
-      } else {
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $mInfo->code . '&action=install') . '">' . tep_image_button('button_module_install.gif', IMAGE_MODULE_INSTALL) . '</a>');
-
-        if (isset($mInfo->signature) && (list($scode, $smodule, $sversion, $soscversion) = explode('|', $mInfo->signature))) {
-          $contents[] = array('text' => '<br>' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<b>' . TEXT_INFO_VERSION . '</b> ' . $sversion . ' (<a href="http://sig.oscommerce.com/' . $mInfo->signature . '" target="_blank">' . TEXT_INFO_ONLINE_STATUS . '</a>)');
+        if (isset($mInfo->api_version)) {
+          $contents[] = array('text' => tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<strong>' . TEXT_INFO_API_VERSION . '</strong> ' . $mInfo->api_version);
         }
 
-        $contents[] = array('text' => '<br>' . $mInfo->description);
+        $contents[] = array('text' => '<br />' . $mInfo->description);
+        $contents[] = array('text' => '<br />' . $keys);
+      } elseif (isset($HTTP_GET_VARS['list']) && ($HTTP_GET_VARS['list'] == 'new')) {
+        if (isset($mInfo)) {
+          $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_MODULE_INSTALL, 'plus', tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $mInfo->code . '&action=install')));
+
+          if (isset($mInfo->signature) && (list($scode, $smodule, $sversion, $soscversion) = explode('|', $mInfo->signature))) {
+            $contents[] = array('text' => '<br />' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<strong>' . TEXT_INFO_VERSION . '</strong> ' . $sversion . ' (<a href="http://sig.oscommerce.com/' . $mInfo->signature . '" target="_blank">' . TEXT_INFO_ONLINE_STATUS . '</a>)');
+          }
+
+          if (isset($mInfo->api_version)) {
+            $contents[] = array('text' => tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '&nbsp;<strong>' . TEXT_INFO_API_VERSION . '</strong> ' . $mInfo->api_version);
+          }
+
+          $contents[] = array('text' => '<br />' . $mInfo->description);
+        }
       }
       break;
   }
@@ -283,16 +312,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/newsletters.php 2.3.1.src/admin/newsletters.php
--- 2.2rc2a.cp.src/admin/newsletters.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/newsletters.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: newsletters.php 1751 2007-12-21 05:26:09Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -95,31 +95,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<div id="spiffycalendar" class="text"></div>
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -200,7 +180,7 @@
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main" align="right"><?php echo (($form_action == 'insert') ? tep_image_submit('button_save.gif', IMAGE_SAVE) : tep_image_submit('button_update.gif', IMAGE_UPDATE)). '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_NEWSLETTERS, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . (isset($HTTP_GET_VARS['nID']) ? 'nID=' . $HTTP_GET_VARS['nID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+            <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_NEWSLETTERS, (isset($HTTP_GET_VARS['page']) ? 'page=' . $HTTP_GET_VARS['page'] . '&' : '') . (isset($HTTP_GET_VARS['nID']) ? 'nID=' . $HTTP_GET_VARS['nID'] : ''))); ?></td>
           </tr>
         </table></td>
       </form></tr>
@@ -214,13 +194,13 @@
     $nInfo = new objectInfo($newsletter);
 ?>
       <tr>
-        <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+        <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'])); ?></td>
       </tr>
       <tr>
         <td><tt><?php echo nl2br($nInfo->content); ?></tt></td>
       </tr>
       <tr>
-        <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+        <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'])); ?></td>
       </tr>
 <?php
   } elseif ($action == 'send') {
@@ -274,7 +254,7 @@
         <td><table border="0" cellspacing="0" cellpadding="2">
           <tr>
             <td class="main" valign="middle"><?php echo tep_image(DIR_WS_IMAGES . 'ani_send_email.gif', IMAGE_ANI_SEND_EMAIL); ?></td>
-            <td class="main" valign="middle"><b><?php echo TEXT_PLEASE_WAIT; ?></b></td>
+            <td class="main" valign="middle"><strong><?php echo TEXT_PLEASE_WAIT; ?></strong></td>
           </tr>
         </table></td>
       </tr>
@@ -287,13 +267,13 @@
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td class="main"><font color="#ff0000"><b><?php echo TEXT_FINISHED_SENDING_EMAILS; ?></b></font></td>
+        <td class="main"><font color="#ff0000"><strong><?php echo TEXT_FINISHED_SENDING_EMAILS; ?></strong></font></td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td><?php echo '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+        <td class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'])); ?></td>
       </tr>
 <?php
   } else {
@@ -342,7 +322,7 @@
                     <td class="smallText" align="right"><?php echo $newsletters_split->display_links($newsletters_query_numrows, MAX_DISPLAY_SEARCH_RESULTS, MAX_DISPLAY_PAGE_LINKS, $HTTP_GET_VARS['page']); ?></td>
                   </tr>
                   <tr>
-                    <td align="right" colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'action=new') . '">' . tep_image_button('button_new_newsletter.gif', IMAGE_NEW_NEWSLETTER) . '</a>'; ?></td>
+                    <td class="smallText" align="right" colspan="2"><?php echo tep_draw_button(IMAGE_NEW_NEWSLETTER, 'plus', tep_href_link(FILENAME_NEWSLETTERS, 'action=new')); ?></td>
                   </tr>
                 </table></td>
               </tr>
@@ -353,23 +333,23 @@
 
   switch ($action) {
     case 'delete':
-      $heading[] = array('text' => '<b>' . $nInfo->title . '</b>');
+      $heading[] = array('text' => '<strong>' . $nInfo->title . '</strong>');
 
       $contents = array('form' => tep_draw_form('newsletters', FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $nInfo->title . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $nInfo->title . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $HTTP_GET_VARS['nID'])));
       break;
     default:
-      if (is_object($nInfo)) {
-        $heading[] = array('text' => '<b>' . $nInfo->title . '</b>');
+      if (isset($nInfo) && is_object($nInfo)) {
+        $heading[] = array('text' => '<strong>' . $nInfo->title . '</strong>');
 
         if ($nInfo->locked > 0) {
-          $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=new') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=preview') . '">' . tep_image_button('button_preview.gif', IMAGE_PREVIEW) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=send') . '">' . tep_image_button('button_send.gif', IMAGE_SEND) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=unlock') . '">' . tep_image_button('button_unlock.gif', IMAGE_UNLOCK) . '</a>');
+          $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=new')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=delete')) . tep_draw_button(IMAGE_PREVIEW, 'document', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=preview')) . tep_draw_button(IMAGE_SEND, 'mail-closed', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=send')) . tep_draw_button(IMAGE_UNLOCK, 'unlocked', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=unlock')));
         } else {
-          $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=preview') . '">' . tep_image_button('button_preview.gif', IMAGE_PREVIEW) . '</a> <a href="' . tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=lock') . '">' . tep_image_button('button_lock.gif', IMAGE_LOCK) . '</a>');
+          $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_PREVIEW, 'document', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=preview')) . tep_draw_button(IMAGE_LOCK, 'locked', tep_href_link(FILENAME_NEWSLETTERS, 'page=' . $HTTP_GET_VARS['page'] . '&nID=' . $nInfo->newsletters_id . '&action=lock')));
         }
-        $contents[] = array('text' => '<br>' . TEXT_NEWSLETTER_DATE_ADDED . ' ' . tep_date_short($nInfo->date_added));
+        $contents[] = array('text' => '<br />' . TEXT_NEWSLETTER_DATE_ADDED . ' ' . tep_date_short($nInfo->date_added));
         if ($nInfo->status == '1') $contents[] = array('text' => TEXT_NEWSLETTER_DATE_SENT . ' ' . tep_date_short($nInfo->date_sent));
       }
       break;
@@ -390,16 +370,9 @@
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/orders.php 2.3.1.src/admin/orders.php
--- 2.2rc2a.cp.src/admin/orders.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/orders.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: orders.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -89,32 +89,11 @@
   }
 
   include(DIR_WS_CLASSES . 'order.php');
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php
-  require(DIR_WS_INCLUDES . 'header.php');
-?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
 <?php
   if (($action == 'edit') && ($order_exists == true)) {
     $order = new order($oID);
@@ -124,7 +103,7 @@
           <tr>
             <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
             <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', 1, HEADING_IMAGE_HEIGHT); ?></td>
-            <td class="pageHeading" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('action'))) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+            <td class="smallText" align="right"><?php echo tep_draw_button(IMAGE_ORDERS_INVOICE, 'document', tep_href_link(FILENAME_ORDERS_INVOICE, 'oID=' . $HTTP_GET_VARS['oID']), null, array('newwindow' => true)) . tep_draw_button(IMAGE_ORDERS_PACKINGSLIP, 'document', tep_href_link(FILENAME_ORDERS_PACKINGSLIP, 'oID=' . $HTTP_GET_VARS['oID']), null, array('newwindow' => true)) . tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('action')))); ?></td>
           </tr>
         </table></td>
       </tr>
@@ -136,31 +115,31 @@
           <tr>
             <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
               <tr>
-                <td class="main" valign="top"><b><?php echo ENTRY_CUSTOMER; ?></b></td>
-                <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br>'); ?></td>
+                <td class="main" valign="top"><strong><?php echo ENTRY_CUSTOMER; ?></strong></td>
+                <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->customer, 1, '', '<br />'); ?></td>
               </tr>
               <tr>
                 <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
               </tr>
               <tr>
-                <td class="main"><b><?php echo ENTRY_TELEPHONE_NUMBER; ?></b></td>
+                <td class="main"><strong><?php echo ENTRY_TELEPHONE_NUMBER; ?></strong></td>
                 <td class="main"><?php echo $order->customer['telephone']; ?></td>
               </tr>
               <tr>
-                <td class="main"><b><?php echo ENTRY_EMAIL_ADDRESS; ?></b></td>
+                <td class="main"><strong><?php echo ENTRY_EMAIL_ADDRESS; ?></strong></td>
                 <td class="main"><?php echo '<a href="mailto:' . $order->customer['email_address'] . '"><u>' . $order->customer['email_address'] . '</u></a>'; ?></td>
               </tr>
             </table></td>
             <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
               <tr>
-                <td class="main" valign="top"><b><?php echo ENTRY_SHIPPING_ADDRESS; ?></b></td>
-                <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
+                <td class="main" valign="top"><strong><?php echo ENTRY_SHIPPING_ADDRESS; ?></strong></td>
+                <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br />'); ?></td>
               </tr>
             </table></td>
             <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
               <tr>
-                <td class="main" valign="top"><b><?php echo ENTRY_BILLING_ADDRESS; ?></b></td>
-                <td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, '', '<br>'); ?></td>
+                <td class="main" valign="top"><strong><?php echo ENTRY_BILLING_ADDRESS; ?></strong></td>
+                <td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, '', '<br />'); ?></td>
               </tr>
             </table></td>
           </tr>
@@ -172,7 +151,7 @@
       <tr>
         <td><table border="0" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><b><?php echo ENTRY_PAYMENT_METHOD; ?></b></td>
+            <td class="main"><strong><?php echo ENTRY_PAYMENT_METHOD; ?></strong></td>
             <td class="main"><?php echo $order->info['payment_method']; ?></td>
           </tr>
 <?php
@@ -224,7 +203,7 @@
 
       if (isset($order->products[$i]['attributes']) && (sizeof($order->products[$i]['attributes']) > 0)) {
         for ($j = 0, $k = sizeof($order->products[$i]['attributes']); $j < $k; $j++) {
-          echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
+          echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
           if ($order->products[$i]['attributes'][$j]['price'] != '0') echo ' (' . $order->products[$i]['attributes'][$j]['prefix'] . $currencies->format($order->products[$i]['attributes'][$j]['price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . ')';
           echo '</i></small></nobr>';
         }
@@ -233,10 +212,10 @@
       echo '            </td>' . "\n" .
            '            <td class="dataTableContent" valign="top">' . $order->products[$i]['model'] . '</td>' . "\n" .
            '            <td class="dataTableContent" align="right" valign="top">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n" .
-           '            <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '            <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '            <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n" .
-           '            <td class="dataTableContent" align="right" valign="top"><b>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</b></td>' . "\n";
+           '            <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '            <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true), true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '            <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n" .
+           '            <td class="dataTableContent" align="right" valign="top"><strong>' . $currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax'], true) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . '</strong></td>' . "\n";
       echo '          </tr>' . "\n";
     }
 ?>
@@ -260,10 +239,10 @@
       <tr>
         <td class="main"><table border="1" cellspacing="0" cellpadding="5">
           <tr>
-            <td class="smallText" align="center"><b><?php echo TABLE_HEADING_DATE_ADDED; ?></b></td>
-            <td class="smallText" align="center"><b><?php echo TABLE_HEADING_CUSTOMER_NOTIFIED; ?></b></td>
-            <td class="smallText" align="center"><b><?php echo TABLE_HEADING_STATUS; ?></b></td>
-            <td class="smallText" align="center"><b><?php echo TABLE_HEADING_COMMENTS; ?></b></td>
+            <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_DATE_ADDED; ?></strong></td>
+            <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_CUSTOMER_NOTIFIED; ?></strong></td>
+            <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_STATUS; ?></strong></td>
+            <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_COMMENTS; ?></strong></td>
           </tr>
 <?php
     $orders_history_query = tep_db_query("select orders_status_id, date_added, customer_notified, comments from " . TABLE_ORDERS_STATUS_HISTORY . " where orders_id = '" . tep_db_input($oID) . "' order by date_added");
@@ -290,7 +269,7 @@
         </table></td>
       </tr>
       <tr>
-        <td class="main"><br><b><?php echo TABLE_HEADING_COMMENTS; ?></b></td>
+        <td class="main"><br /><strong><?php echo TABLE_HEADING_COMMENTS; ?></strong></td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
@@ -306,20 +285,17 @@
           <tr>
             <td><table border="0" cellspacing="0" cellpadding="2">
               <tr>
-                <td class="main"><b><?php echo ENTRY_STATUS; ?></b> <?php echo tep_draw_pull_down_menu('status', $orders_statuses, $order->info['orders_status']); ?></td>
+                <td class="main"><strong><?php echo ENTRY_STATUS; ?></strong> <?php echo tep_draw_pull_down_menu('status', $orders_statuses, $order->info['orders_status']); ?></td>
               </tr>
               <tr>
-                <td class="main"><b><?php echo ENTRY_NOTIFY_CUSTOMER; ?></b> <?php echo tep_draw_checkbox_field('notify', '', true); ?></td>
-                <td class="main"><b><?php echo ENTRY_NOTIFY_COMMENTS; ?></b> <?php echo tep_draw_checkbox_field('notify_comments', '', true); ?></td>
+                <td class="main"><strong><?php echo ENTRY_NOTIFY_CUSTOMER; ?></strong> <?php echo tep_draw_checkbox_field('notify', '', true); ?></td>
+                <td class="main"><strong><?php echo ENTRY_NOTIFY_COMMENTS; ?></strong> <?php echo tep_draw_checkbox_field('notify_comments', '', true); ?></td>
               </tr>
             </table></td>
-            <td valign="top"><?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?></td>
+            <td class="smallText" valign="top"><?php echo tep_draw_button(IMAGE_UPDATE, 'disk', null, 'primary'); ?></td>
           </tr>
         </table></td>
       </form></tr>
-      <tr>
-        <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ORDERS_INVOICE, 'oID=' . $HTTP_GET_VARS['oID']) . '" TARGET="_blank">' . tep_image_button('button_invoice.gif', IMAGE_ORDERS_INVOICE) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS_PACKINGSLIP, 'oID=' . $HTTP_GET_VARS['oID']) . '" TARGET="_blank">' . tep_image_button('button_packingslip.gif', IMAGE_ORDERS_PACKINGSLIP) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('action'))) . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
-      </tr>
 <?php
   } else {
 ?>
@@ -333,7 +309,7 @@
                 <td class="smallText" align="right"><?php echo HEADING_TITLE_SEARCH . ' ' . tep_draw_input_field('oID', '', 'size="12"') . tep_draw_hidden_field('action', 'edit'); ?></td>
               <?php echo tep_hide_session_id(); ?></form></tr>
               <tr><?php echo tep_draw_form('status', FILENAME_ORDERS, '', 'get'); ?>
-                <td class="smallText" align="right"><?php echo HEADING_TITLE_STATUS . ' ' . tep_draw_pull_down_menu('status', array_merge(array(array('id' => '', 'text' => TEXT_ALL_ORDERS)), $orders_statuses), '', 'onChange="this.form.submit();"'); ?></td>
+                <td class="smallText" align="right"><?php echo HEADING_TITLE_STATUS . ' ' . tep_draw_pull_down_menu('status', array_merge(array(array('id' => '', 'text' => TEXT_ALL_ORDERS)), $orders_statuses), '', 'onchange="this.form.submit();"'); ?></td>
               <?php echo tep_hide_session_id(); ?></form></tr>
             </table></td>
           </tr>
@@ -397,22 +373,22 @@
 
   switch ($action) {
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_ORDER . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_ORDER . '</strong>');
 
       $contents = array('form' => tep_draw_form('orders', FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=deleteconfirm'));
-      $contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br><br><b>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</b>');
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('restock') . ' ' . TEXT_INFO_RESTOCK_PRODUCT_QUANTITY);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => TEXT_INFO_DELETE_INTRO . '<br /><br /><strong>' . $cInfo->customers_firstname . ' ' . $cInfo->customers_lastname . '</strong>');
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('restock') . ' ' . TEXT_INFO_RESTOCK_PRODUCT_QUANTITY);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id)));
       break;
     default:
       if (isset($oInfo) && is_object($oInfo)) {
-        $heading[] = array('text' => '<b>[' . $oInfo->orders_id . ']&nbsp;&nbsp;' . tep_datetime_short($oInfo->date_purchased) . '</b>');
+        $heading[] = array('text' => '<strong>[' . $oInfo->orders_id . ']&nbsp;&nbsp;' . tep_datetime_short($oInfo->date_purchased) . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ORDERS_INVOICE, 'oID=' . $oInfo->orders_id) . '" TARGET="_blank">' . tep_image_button('button_invoice.gif', IMAGE_ORDERS_INVOICE) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS_PACKINGSLIP, 'oID=' . $oInfo->orders_id) . '" TARGET="_blank">' . tep_image_button('button_packingslip.gif', IMAGE_ORDERS_PACKINGSLIP) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_DATE_ORDER_CREATED . ' ' . tep_date_short($oInfo->date_purchased));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_ORDERS, tep_get_all_get_params(array('oID', 'action')) . 'oID=' . $oInfo->orders_id . '&action=delete')));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_ORDERS_INVOICE, 'document', tep_href_link(FILENAME_ORDERS_INVOICE, 'oID=' . $oInfo->orders_id), null, array('newwindow' => true)) . tep_draw_button(IMAGE_ORDERS_PACKINGSLIP, 'document', tep_href_link(FILENAME_ORDERS_PACKINGSLIP, 'oID=' . $oInfo->orders_id), null, array('newwindow' => true)));
+        $contents[] = array('text' => '<br />' . TEXT_DATE_ORDER_CREATED . ' ' . tep_date_short($oInfo->date_purchased));
         if (tep_not_null($oInfo->last_modified)) $contents[] = array('text' => TEXT_DATE_ORDER_LAST_MODIFIED . ' ' . tep_date_short($oInfo->last_modified));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_PAYMENT_METHOD . ' '  . $oInfo->payment_method);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_PAYMENT_METHOD . ' '  . $oInfo->payment_method);
       }
       break;
   }
@@ -432,16 +408,9 @@
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/orders_status.php 2.3.1.src/admin/orders_status.php
--- 2.2rc2a.cp.src/admin/orders_status.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/orders_status.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: orders_status.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -91,30 +91,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -149,7 +130,7 @@
     }
 
     if (DEFAULT_ORDERS_STATUS_ID == $orders_status['orders_status_id']) {
-      echo '                <td class="dataTableContent"><b>' . $orders_status['orders_status_name'] . ' (' . TEXT_DEFAULT . ')</b></td>' . "\n";
+      echo '                <td class="dataTableContent"><strong>' . $orders_status['orders_status_name'] . ' (' . TEXT_DEFAULT . ')</strong></td>' . "\n";
     } else {
       echo '                <td class="dataTableContent">' . $orders_status['orders_status_name'] . '</td>' . "\n";
     }
@@ -171,7 +152,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_insert.gif', IMAGE_INSERT) . '</a>'; ?></td>
+                    <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_INSERT, 'plus', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -185,7 +166,7 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_ORDERS_STATUS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_ORDERS_STATUS . '</strong>');
 
       $contents = array('form' => tep_draw_form('status', FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
@@ -193,17 +174,17 @@
       $orders_status_inputs_string = '';
       $languages = tep_get_languages();
       for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-        $orders_status_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('orders_status_name[' . $languages[$i]['id'] . ']');
+        $orders_status_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('orders_status_name[' . $languages[$i]['id'] . ']');
       }
 
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ORDERS_STATUS_NAME . $orders_status_inputs_string);
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('public_flag', '1') . ' ' . TEXT_SET_PUBLIC_STATUS);
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ORDERS_STATUS_NAME . $orders_status_inputs_string);
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('public_flag', '1') . ' ' . TEXT_SET_PUBLIC_STATUS);
       $contents[] = array('text' => tep_draw_checkbox_field('downloads_flag', '1') . ' ' . TEXT_SET_DOWNLOADS_STATUS);
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . ' <a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_ORDERS_STATUS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_ORDERS_STATUS . '</strong>');
 
       $contents = array('form' => tep_draw_form('status', FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id  . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
@@ -211,33 +192,33 @@
       $orders_status_inputs_string = '';
       $languages = tep_get_languages();
       for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-        $orders_status_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('orders_status_name[' . $languages[$i]['id'] . ']', tep_get_orders_status_name($oInfo->orders_status_id, $languages[$i]['id']));
+        $orders_status_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_draw_input_field('orders_status_name[' . $languages[$i]['id'] . ']', tep_get_orders_status_name($oInfo->orders_status_id, $languages[$i]['id']));
       }
 
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ORDERS_STATUS_NAME . $orders_status_inputs_string);
-      $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('public_flag', '1', $oInfo->public_flag) . ' ' . TEXT_SET_PUBLIC_STATUS);
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ORDERS_STATUS_NAME . $orders_status_inputs_string);
+      $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('public_flag', '1', $oInfo->public_flag) . ' ' . TEXT_SET_PUBLIC_STATUS);
       $contents[] = array('text' => tep_draw_checkbox_field('downloads_flag', '1', $oInfo->downloads_flag) . ' ' . TEXT_SET_DOWNLOADS_STATUS);
-      if (DEFAULT_ORDERS_STATUS_ID != $oInfo->orders_status_id) $contents[] = array('text' => '<br>' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      if (DEFAULT_ORDERS_STATUS_ID != $oInfo->orders_status_id) $contents[] = array('text' => '<br />' . tep_draw_checkbox_field('default') . ' ' . TEXT_SET_DEFAULT);
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_ORDERS_STATUS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_ORDERS_STATUS . '</strong>');
 
       $contents = array('form' => tep_draw_form('status', FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id  . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $oInfo->orders_status_name . '</b>');
-      if ($remove_status) $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $oInfo->orders_status_name . '</strong>');
+      if ($remove_status) $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id)));
       break;
     default:
       if (isset($oInfo) && is_object($oInfo)) {
-        $heading[] = array('text' => '<b>' . $oInfo->orders_status_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $oInfo->orders_status_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_ORDERS_STATUS, 'page=' . $HTTP_GET_VARS['page'] . '&oID=' . $oInfo->orders_status_id . '&action=delete')));
 
         $orders_status_inputs_string = '';
         $languages = tep_get_languages();
         for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
-          $orders_status_inputs_string .= '<br>' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_get_orders_status_name($oInfo->orders_status_id, $languages[$i]['id']);
+          $orders_status_inputs_string .= '<br />' . tep_image(DIR_WS_CATALOG_LANGUAGES . $languages[$i]['directory'] . '/images/' . $languages[$i]['image'], $languages[$i]['name']) . '&nbsp;' . tep_get_orders_status_name($oInfo->orders_status_id, $languages[$i]['id']);
         }
 
         $contents[] = array('text' => $orders_status_inputs_string);
@@ -257,16 +238,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/packingslip.php 2.3.1.src/admin/packingslip.php
--- 2.2rc2a.cp.src/admin/packingslip.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/packingslip.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: packingslip.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,14 +21,14 @@
   include(DIR_WS_CLASSES . 'order.php');
   $order = new order($oID);
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
 <title><?php echo TITLE; ?></title>
 <link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
 </head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
+<body>
 <!-- body_text //-->
 <table border="0" width="100%" cellspacing="0" cellpadding="2">
   <tr>
@@ -47,10 +47,10 @@
       <tr>
         <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><b><?php echo ENTRY_SOLD_TO; ?></b></td>
+            <td class="main"><strong><?php echo ENTRY_SOLD_TO; ?></strong></td>
           </tr>
           <tr>
-            <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br>'); ?></td>
+            <td class="main"><?php echo tep_address_format($order->customer['format_id'], $order->billing, 1, '', '<br />'); ?></td>
           </tr>
           <tr>
             <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
@@ -64,10 +64,10 @@
         </table></td>
         <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><b><?php echo ENTRY_SHIP_TO; ?></b></td>
+            <td class="main"><strong><?php echo ENTRY_SHIP_TO; ?></strong></td>
           </tr>
           <tr>
-            <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br>'); ?></td>
+            <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, '', '<br />'); ?></td>
           </tr>
         </table></td>
       </tr>
@@ -79,7 +79,7 @@
   <tr>
     <td><table border="0" cellspacing="0" cellpadding="2">
       <tr>
-        <td class="main"><b><?php echo ENTRY_PAYMENT_METHOD; ?></b></td>
+        <td class="main"><strong><?php echo ENTRY_PAYMENT_METHOD; ?></strong></td>
         <td class="main"><?php echo $order->info['payment_method']; ?></td>
       </tr>
     </table></td>
@@ -101,7 +101,7 @@
 
       if (isset($order->products[$i]['attributes']) && (sizeof($order->products[$i]['attributes']) > 0)) {
         for ($j=0, $k=sizeof($order->products[$i]['attributes']); $j<$k; $j++) {
-          echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
+          echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'];
           echo '</i></small></nobr>';
         }
       }
@@ -115,7 +115,7 @@
   </tr>
 </table>
 <!-- body_text_eof //-->
-<br>
+<br />
 </body>
 </html>
 <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/popup_image.php 2.3.1.src/admin/popup_image.php
--- 2.2rc2a.cp.src/admin/popup_image.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/popup_image.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: popup_image.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -32,11 +32,11 @@
     }
   }
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
 <title><?php echo $page_title; ?></title>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 var i=0;
 
 function resize() {
diff -x .svn -aruN 2.2rc2a.cp.src/admin/products_attributes.php 2.3.1.src/admin/products_attributes.php
--- 2.2rc2a.cp.src/admin/products_attributes.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/products_attributes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: products_attributes.php 1776 2008-01-09 20:41:00Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -149,29 +149,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="0">
 <!-- options and values//-->
       <tr>
         <td width="100%"><table width="100%" border="0" cellspacing="0" cellpadding="0">
@@ -220,19 +202,19 @@
                     <td colspan="3"><?php echo tep_black_line(); ?></td>
                   </tr>
                   <tr>
-                    <td colspan="3" class="main"><br><?php echo TEXT_WARNING_OF_DELETE; ?></td>
+                    <td colspan="3" class="main"><br /><?php echo TEXT_WARNING_OF_DELETE; ?></td>
                   </tr>
                   <tr>
-                    <td align="right" colspan="3" class="main"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a>&nbsp;</td>
+                    <td align="right" colspan="3" class="smallText"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
                   </tr>
 <?php
     } else {
 ?>
                   <tr>
-                    <td class="main" colspan="3"><br><?php echo TEXT_OK_TO_DELETE; ?></td>
+                    <td class="main" colspan="3"><br /><?php echo TEXT_OK_TO_DELETE; ?></td>
                   </tr>
                   <tr>
-                    <td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option&option_id=' . $HTTP_GET_VARS['option_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_delete.gif', ' delete '); ?></a>&nbsp;&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a>&nbsp;</td>
+                    <td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option&option_id=' . $HTTP_GET_VARS['option_id'] . '&' . $page_info, 'NONSSL'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
                   </tr>
 <?php
     }
@@ -281,19 +263,19 @@
         for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {
           $option_name = tep_db_query("select products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . $options_values['products_options_id'] . "' and language_id = '" . $languages[$i]['id'] . "'");
           $option_name = tep_db_fetch_array($option_name);
-          $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20" value="' . $option_name['products_options_name'] . '">&nbsp;<br>';
+          $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20" value="' . $option_name['products_options_name'] . '">&nbsp;<br />';
         }
 ?>
                 <td align="center" class="smallText">&nbsp;<?php echo $options_values['products_options_id']; ?><input type="hidden" name="option_id" value="<?php echo $options_values['products_options_id']; ?>">&nbsp;</td>
                 <td class="smallText"><?php echo $inputs; ?></td>
-                <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?>&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
         echo '</form>' . "\n";
       } else {
 ?>
                 <td align="center" class="smallText">&nbsp;<?php echo $options_values["products_options_id"]; ?>&nbsp;</td>
                 <td class="smallText">&nbsp;<?php echo $options_values["products_options_name"]; ?>&nbsp;</td>
-                <td align="center" class="smallText">&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
       }
 ?>
@@ -315,12 +297,12 @@
       echo '<form name="options" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_options&' . $page_info, 'NONSSL') . '" method="post"><input type="hidden" name="products_options_id" value="' . $next_id . '">';
       $inputs = '';
       for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {
-        $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20">&nbsp;<br>';
+        $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20">&nbsp;<br />';
       }
 ?>
                 <td align="center" class="smallText">&nbsp;<?php echo $next_id; ?>&nbsp;</td>
                 <td class="smallText"><?php echo $inputs; ?></td>
-                <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_INSERT, 'plus'); ?>&nbsp;</td>
 <?php
       echo '</form>';
 ?>
@@ -377,19 +359,19 @@
                     <td colspan="3"><?php echo tep_black_line(); ?></td>
                   </tr>
                   <tr>
-                    <td class="main" colspan="3"><br><?php echo TEXT_WARNING_OF_DELETE; ?></td>
+                    <td class="main" colspan="3"><br /><?php echo TEXT_WARNING_OF_DELETE; ?></td>
                   </tr>
                   <tr>
-                    <td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a>&nbsp;</td>
+                    <td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
                   </tr>
 <?php
     } else {
 ?>
                   <tr>
-                    <td class="main" colspan="3"><br><?php echo TEXT_OK_TO_DELETE; ?></td>
+                    <td class="main" colspan="3"><br /><?php echo TEXT_OK_TO_DELETE; ?></td>
                   </tr>
                   <tr>
-                    <td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_value&value_id=' . $HTTP_GET_VARS['value_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_delete.gif', ' delete '); ?></a>&nbsp;&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a>&nbsp;</td>
+                    <td class="smallText" align="right" colspan="3"><br /><?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_value&value_id=' . $HTTP_GET_VARS['value_id'] . '&' . $page_info, 'NONSSL'), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
                   </tr>
 <?php
     }
@@ -441,7 +423,7 @@
         for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {
           $value_name = tep_db_query("select products_options_values_name from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$values_values['products_options_values_id'] . "' and language_id = '" . (int)$languages[$i]['id'] . "'");
           $value_name = tep_db_fetch_array($value_name);
-          $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15" value="' . $value_name['products_options_values_name'] . '">&nbsp;<br>';
+          $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15" value="' . $value_name['products_options_values_name'] . '">&nbsp;<br />';
         }
 ?>
                 <td align="center" class="smallText">&nbsp;<?php echo $values_values['products_options_values_id']; ?><input type="hidden" name="value_id" value="<?php echo $values_values['products_options_values_id']; ?>">&nbsp;</td>
@@ -458,7 +440,7 @@
 ?>
                 </select>&nbsp;</td>
                 <td class="smallText"><?php echo $inputs; ?></td>
-                <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?>&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
         echo '</form>';
       } else {
@@ -466,7 +448,7 @@
                 <td align="center" class="smallText">&nbsp;<?php echo $values_values["products_options_values_id"]; ?>&nbsp;</td>
                 <td align="center" class="smallText">&nbsp;<?php echo $options_name; ?>&nbsp;</td>
                 <td class="smallText">&nbsp;<?php echo $values_name; ?>&nbsp;</td>
-                <td align="center" class="smallText">&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
       }
       $max_values_id_query = tep_db_query("select max(products_options_values_id) + 1 as next_id from " . TABLE_PRODUCTS_OPTIONS_VALUES);
@@ -495,12 +477,12 @@
 
       $inputs = '';
       for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {
-        $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15">&nbsp;<br>';
+        $inputs .= $languages[$i]['code'] . ':&nbsp;<input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15">&nbsp;<br />';
       }
 ?>
                 </select>&nbsp;</td>
                 <td class="smallText"><input type="hidden" name="value_id" value="<?php echo $next_id; ?>"><?php echo $inputs; ?></td>
-                <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?>&nbsp;</td>
+                <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_INSERT, 'plus'); ?>&nbsp;</td>
 <?php
       echo '</form>';
 ?>
@@ -616,7 +598,7 @@
             </select>&nbsp;</td>
             <td align="right" class="smallText">&nbsp;<input type="text" name="value_price" value="<?php echo $attributes_values['options_values_price']; ?>" size="6">&nbsp;</td>
             <td align="center" class="smallText">&nbsp;<input type="text" name="price_prefix" value="<?php echo $attributes_values['price_prefix']; ?>" size="2">&nbsp;</td>
-            <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?>&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a>&nbsp;</td>
+            <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
       if (DOWNLOAD_ENABLED == 'true') {
         $download_query_raw ="select products_attributes_filename, products_attributes_maxdays, products_attributes_maxcount 
@@ -653,13 +635,13 @@
 <?php
     } elseif (($action == 'delete_product_attribute') && ($HTTP_GET_VARS['attribute_id'] == $attributes_values['products_attributes_id'])) {
 ?>
-            <td class="smallText">&nbsp;<b><?php echo $attributes_values["products_attributes_id"]; ?></b>&nbsp;</td>
-            <td class="smallText">&nbsp;<b><?php echo $products_name_only; ?></b>&nbsp;</td>
-            <td class="smallText">&nbsp;<b><?php echo $options_name; ?></b>&nbsp;</td>
-            <td class="smallText">&nbsp;<b><?php echo $values_name; ?></b>&nbsp;</td>
-            <td align="right" class="smallText">&nbsp;<b><?php echo $attributes_values["options_values_price"]; ?></b>&nbsp;</td>
-            <td align="center" class="smallText">&nbsp;<b><?php echo $attributes_values["price_prefix"]; ?></b>&nbsp;</td>
-            <td align="center" class="smallText">&nbsp;<b><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_attribute&attribute_id=' . $HTTP_GET_VARS['attribute_id'] . '&' . $page_info) . '">'; ?><?php echo tep_image_button('button_confirm.gif', IMAGE_CONFIRM); ?></a>&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a>&nbsp;</b></td>
+            <td class="smallText">&nbsp;<strong><?php echo $attributes_values["products_attributes_id"]; ?></strong>&nbsp;</td>
+            <td class="smallText">&nbsp;<strong><?php echo $products_name_only; ?></strong>&nbsp;</td>
+            <td class="smallText">&nbsp;<strong><?php echo $options_name; ?></strong>&nbsp;</td>
+            <td class="smallText">&nbsp;<strong><?php echo $values_name; ?></strong>&nbsp;</td>
+            <td align="right" class="smallText">&nbsp;<strong><?php echo $attributes_values["options_values_price"]; ?></strong>&nbsp;</td>
+            <td align="center" class="smallText">&nbsp;<strong><?php echo $attributes_values["price_prefix"]; ?></strong>&nbsp;</td>
+            <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_attribute&attribute_id=' . $HTTP_GET_VARS['attribute_id'] . '&' . $page_info), 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
     } else {
 ?>
@@ -669,7 +651,7 @@
             <td class="smallText">&nbsp;<?php echo $values_name; ?>&nbsp;</td>
             <td align="right" class="smallText">&nbsp;<?php echo $attributes_values["options_values_price"]; ?>&nbsp;</td>
             <td align="center" class="smallText">&nbsp;<?php echo $attributes_values["price_prefix"]; ?>&nbsp;</td>
-            <td align="center" class="smallText">&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>&nbsp;&nbsp;<?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a>&nbsp;</td>
+            <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL')); ?>&nbsp;</td>
 <?php
     }
     $max_attributes_id_query = tep_db_query("select max(products_attributes_id) + 1 as next_id from " . TABLE_PRODUCTS_ATTRIBUTES);
@@ -712,7 +694,7 @@
             </select>&nbsp;</td>
             <td align="right" class="smallText">&nbsp;<input type="text" name="value_price" size="6">&nbsp;</td>
             <td align="right" class="smallText">&nbsp;<input type="text" name="price_prefix" size="2" value="+">&nbsp;</td>
-            <td align="center" class="smallText">&nbsp;<?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?>&nbsp;</td>
+            <td align="center" class="smallText">&nbsp;<?php echo tep_draw_button(IMAGE_INSERT, 'plus'); ?>&nbsp;</td>
           </tr>
 <?php
       if (DOWNLOAD_ENABLED == 'true') {
@@ -747,14 +729,9 @@
           </tr>
         </table></form></td>
       </tr>
-    </table></td>
-<!-- products_attributes_eof //-->
-  </tr>
-</table>
-<!-- body_text_eof //-->
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/products_expected.php 2.3.1.src/admin/products_expected.php
--- 2.2rc2a.cp.src/admin/products_expected.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/products_expected.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: products_expected.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,30 +13,11 @@
   require('includes/application_top.php');
 
   tep_db_query("update " . TABLE_PRODUCTS . " set products_date_available = '' where to_days(now()) > to_days(products_date_available)");
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -90,10 +71,10 @@
   $contents = array();
 
   if (isset($pInfo) && is_object($pInfo)) {
-    $heading[] = array('text' => '<b>' . $pInfo->products_name . '</b>');
+    $heading[] = array('text' => '<strong>' . $pInfo->products_name . '</strong>');
 
-    $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_CATEGORIES, 'pID=' . $pInfo->products_id . '&action=new_product') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a>');
-    $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_EXPECTED . ' ' . tep_date_short($pInfo->products_date_available));
+    $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_CATEGORIES, 'pID=' . $pInfo->products_id . '&action=new_product')));
+    $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_EXPECTED . ' ' . tep_date_short($pInfo->products_date_available));
   }
 
   if ( (tep_not_null($heading)) && (tep_not_null($contents)) ) {
@@ -108,16 +89,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/reviews.php 2.3.1.src/admin/reviews.php
--- 2.2rc2a.cp.src/admin/reviews.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -16,12 +16,22 @@
 
   if (tep_not_null($action)) {
     switch ($action) {
+      case 'setflag':
+        if ( ($HTTP_GET_VARS['flag'] == '0') || ($HTTP_GET_VARS['flag'] == '1') ) {
+          if (isset($HTTP_GET_VARS['rID'])) {
+            tep_set_review_status($HTTP_GET_VARS['rID'], $HTTP_GET_VARS['flag']);
+          }
+        }
+
+        tep_redirect(tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $HTTP_GET_VARS['rID']));
+        break;
       case 'update':
         $reviews_id = tep_db_prepare_input($HTTP_GET_VARS['rID']);
         $reviews_rating = tep_db_prepare_input($HTTP_POST_VARS['reviews_rating']);
         $reviews_text = tep_db_prepare_input($HTTP_POST_VARS['reviews_text']);
+        $reviews_status = tep_db_prepare_input($HTTP_POST_VARS['reviews_status']);
 
-        tep_db_query("update " . TABLE_REVIEWS . " set reviews_rating = '" . tep_db_input($reviews_rating) . "', last_modified = now() where reviews_id = '" . (int)$reviews_id . "'");
+        tep_db_query("update " . TABLE_REVIEWS . " set reviews_rating = '" . tep_db_input($reviews_rating) . "', reviews_status = '" . tep_db_input($reviews_status) . "', last_modified = now() where reviews_id = '" . (int)$reviews_id . "'");
         tep_db_query("update " . TABLE_REVIEWS_DESCRIPTION . " set reviews_text = '" . tep_db_input($reviews_text) . "' where reviews_id = '" . (int)$reviews_id . "'");
 
         tep_redirect(tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $reviews_id));
@@ -36,30 +46,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -72,7 +63,7 @@
   if ($action == 'edit') {
     $rID = tep_db_prepare_input($HTTP_GET_VARS['rID']);
 
-    $reviews_query = tep_db_query("select r.reviews_id, r.products_id, r.customers_name, r.date_added, r.last_modified, r.reviews_read, rd.reviews_text, r.reviews_rating from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$rID . "' and r.reviews_id = rd.reviews_id");
+    $reviews_query = tep_db_query("select r.reviews_id, r.products_id, r.customers_name, r.date_added, r.last_modified, r.reviews_read, rd.reviews_text, r.reviews_rating, r.reviews_status from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$rID . "' and r.reviews_id = rd.reviews_id");
     $reviews = tep_db_fetch_array($reviews_query);
 
     $products_query = tep_db_query("select products_image from " . TABLE_PRODUCTS . " where products_id = '" . (int)$reviews['products_id'] . "'");
@@ -83,19 +74,32 @@
 
     $rInfo_array = array_merge($reviews, $products, $products_name);
     $rInfo = new objectInfo($rInfo_array);
+
+    if (!isset($rInfo->reviews_status)) $rInfo->reviews_status = '1';
+    switch ($rInfo->reviews_status) {
+      case '0': $in_status = false; $out_status = true; break;
+      case '1':
+      default: $in_status = true; $out_status = false;
+    }
 ?>
       <tr><?php echo tep_draw_form('review', FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $HTTP_GET_VARS['rID'] . '&action=preview'); ?>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
-            <td class="main" valign="top"><b><?php echo ENTRY_PRODUCT; ?></b> <?php echo $rInfo->products_name; ?><br><b><?php echo ENTRY_FROM; ?></b> <?php echo $rInfo->customers_name; ?><br><br><b><?php echo ENTRY_DATE; ?></b> <?php echo tep_date_short($rInfo->date_added); ?></td>
+            <td class="main" valign="top"><strong><?php echo ENTRY_PRODUCT; ?></strong> <?php echo $rInfo->products_name; ?><br /><strong><?php echo ENTRY_FROM; ?></strong> <?php echo $rInfo->customers_name; ?><br /><br /><strong><?php echo ENTRY_DATE; ?></strong> <?php echo tep_date_short($rInfo->date_added); ?></td>
             <td class="main" align="right" valign="top"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $rInfo->products_image, $rInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"'); ?></td>
           </tr>
+          <tr>
+            <td class="main" colspan="2"><strong><?php echo TEXT_INFO_REVIEW_STATUS; ?></strong> <?php echo tep_draw_separator('pixel_trans.gif', '24', '15') . '&nbsp;' . tep_draw_radio_field('reviews_status', '1', $in_status) . '&nbsp;' . TEXT_REVIEW_PUBLISHED . '&nbsp;' . tep_draw_radio_field('reviews_status', '0', $out_status) . '&nbsp;' . TEXT_REVIEW_NOT_PUBLISHED; ?></td>
+          </tr>
         </table></td>
       </tr>
       <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
         <td><table witdh="100%" border="0" cellspacing="0" cellpadding="0">
           <tr>
-            <td class="main" valign="top"><b><?php echo ENTRY_REVIEW; ?></b><br><br><?php echo tep_draw_textarea_field('reviews_text', 'soft', '60', '15', $rInfo->reviews_text); ?></td>
+            <td class="main" valign="top"><strong><?php echo ENTRY_REVIEW; ?></strong><br /><br /><?php echo tep_draw_textarea_field('reviews_text', 'soft', '60', '15', $rInfo->reviews_text); ?></td>
           </tr>
           <tr>
             <td class="smallText" align="right"><?php echo ENTRY_REVIEW_TEXT; ?></td>
@@ -106,13 +110,13 @@
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td class="main"><b><?php echo ENTRY_RATING; ?></b>&nbsp;<?php echo TEXT_BAD; ?>&nbsp;<?php for ($i=1; $i<=5; $i++) echo tep_draw_radio_field('reviews_rating', $i, '', $rInfo->reviews_rating) . '&nbsp;'; echo TEXT_GOOD; ?></td>
+        <td class="main"><strong><?php echo ENTRY_RATING; ?></strong>&nbsp;<?php echo TEXT_BAD; ?>&nbsp;<?php for ($i=1; $i<=5; $i++) echo tep_draw_radio_field('reviews_rating', $i, '', $rInfo->reviews_rating) . '&nbsp;'; echo TEXT_GOOD; ?></td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
       <tr>
-        <td align="right" class="main"><?php echo tep_draw_hidden_field('reviews_id', $rInfo->reviews_id) . tep_draw_hidden_field('products_id', $rInfo->products_id) . tep_draw_hidden_field('customers_name', $rInfo->customers_name) . tep_draw_hidden_field('products_name', $rInfo->products_name) . tep_draw_hidden_field('products_image', $rInfo->products_image) . tep_draw_hidden_field('date_added', $rInfo->date_added) . tep_image_submit('button_preview.gif', IMAGE_PREVIEW) . ' <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $HTTP_GET_VARS['rID']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+        <td align="right" class="smallText"><?php echo tep_draw_hidden_field('reviews_id', $rInfo->reviews_id) . tep_draw_hidden_field('products_id', $rInfo->products_id) . tep_draw_hidden_field('customers_name', $rInfo->customers_name) . tep_draw_hidden_field('products_name', $rInfo->products_name) . tep_draw_hidden_field('products_image', $rInfo->products_image) . tep_draw_hidden_field('date_added', $rInfo->date_added) . tep_draw_button(IMAGE_PREVIEW, 'document') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $HTTP_GET_VARS['rID'])); ?></td>
       </form></tr>
 <?php
   } elseif ($action == 'preview') {
@@ -121,7 +125,7 @@
     } else {
       $rID = tep_db_prepare_input($HTTP_GET_VARS['rID']);
 
-      $reviews_query = tep_db_query("select r.reviews_id, r.products_id, r.customers_name, r.date_added, r.last_modified, r.reviews_read, rd.reviews_text, r.reviews_rating from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$rID . "' and r.reviews_id = rd.reviews_id");
+      $reviews_query = tep_db_query("select r.reviews_id, r.products_id, r.customers_name, r.date_added, r.last_modified, r.reviews_read, rd.reviews_text, r.reviews_rating, r.reviews_status from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$rID . "' and r.reviews_id = rd.reviews_id");
       $reviews = tep_db_fetch_array($reviews_query);
 
       $products_query = tep_db_query("select products_image from " . TABLE_PRODUCTS . " where products_id = '" . (int)$reviews['products_id'] . "'");
@@ -137,7 +141,7 @@
       <tr><?php echo tep_draw_form('update', FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $HTTP_GET_VARS['rID'] . '&action=update', 'post', 'enctype="multipart/form-data"'); ?>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
-            <td class="main" valign="top"><b><?php echo ENTRY_PRODUCT; ?></b> <?php echo $rInfo->products_name; ?><br><b><?php echo ENTRY_FROM; ?></b> <?php echo $rInfo->customers_name; ?><br><br><b><?php echo ENTRY_DATE; ?></b> <?php echo tep_date_short($rInfo->date_added); ?></td>
+            <td class="main" valign="top"><strong><?php echo ENTRY_PRODUCT; ?></strong> <?php echo $rInfo->products_name; ?><br /><strong><?php echo ENTRY_FROM; ?></strong> <?php echo $rInfo->customers_name; ?><br /><br /><strong><?php echo ENTRY_DATE; ?></strong> <?php echo tep_date_short($rInfo->date_added); ?></td>
             <td class="main" align="right" valign="top"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . $rInfo->products_image, $rInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"'); ?></td>
           </tr>
         </table>
@@ -145,15 +149,16 @@
       <tr>
         <td><table witdh="100%" border="0" cellspacing="0" cellpadding="0">
           <tr>
-            <td valign="top" class="main"><b><?php echo ENTRY_REVIEW; ?></b><br><br><?php echo nl2br(tep_db_output(tep_break_string($rInfo->reviews_text, 15))); ?></td>
+            <td valign="top" class="main"><strong><?php echo ENTRY_REVIEW; ?></strong><br /><br /><?php echo nl2br(tep_db_output(tep_break_string($rInfo->reviews_text, 15))); ?></td>
           </tr>
         </table></td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
       </tr>
+
       <tr>
-        <td class="main"><b><?php echo ENTRY_RATING; ?></b>&nbsp;<?php echo tep_image(DIR_WS_CATALOG_IMAGES . 'stars_' . $rInfo->reviews_rating . '.gif', sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating)); ?>&nbsp;<small>[<?php echo sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating); ?>]</small></td>
+        <td class="main"><strong><?php echo ENTRY_RATING; ?></strong>&nbsp;<?php echo tep_image(DIR_WS_CATALOG_IMAGES . 'stars_' . $rInfo->reviews_rating . '.gif', sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating)); ?>&nbsp;<small>[<?php echo sprintf(TEXT_OF_5_STARS, $rInfo->reviews_rating); ?>]</small></td>
       </tr>
       <tr>
         <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
@@ -165,7 +170,7 @@
       while (list($key, $value) = each($HTTP_POST_VARS)) echo tep_draw_hidden_field($key, htmlspecialchars(stripslashes($value)));
 ?>
       <tr>
-        <td align="right" class="smallText"><?php echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=edit') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a> ' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . ' <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+        <td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id)); ?></td>
       </form></tr>
 <?php
     } else {
@@ -178,7 +183,7 @@
       }
 ?>
       <tr>
-        <td align="right"><?php echo '<a href="' . tep_href_link($back_url, $back_url_params, 'NONSSL') . '">' . tep_image_button('button_back.gif', IMAGE_BACK) . '</a>'; ?></td>
+        <td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_BACK, 'triangle-1-w', tep_href_link($back_url, $back_url_params, 'NONSSL')); ?></td>
       </tr>
 <?php
     }
@@ -192,10 +197,11 @@
                 <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_PRODUCTS; ?></td>
                 <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_RATING; ?></td>
                 <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_DATE_ADDED; ?></td>
+                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_STATUS; ?></td>
                 <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
               </tr>
 <?php
-    $reviews_query_raw = "select reviews_id, products_id, date_added, last_modified, reviews_rating from " . TABLE_REVIEWS . " order by date_added DESC";
+    $reviews_query_raw = "select reviews_id, products_id, date_added, last_modified, reviews_rating, reviews_status from " . TABLE_REVIEWS . " order by date_added DESC";
     $reviews_split = new splitPageResults($HTTP_GET_VARS['page'], MAX_DISPLAY_SEARCH_RESULTS, $reviews_query_raw, $reviews_query_numrows);
     $reviews_query = tep_db_query($reviews_query_raw);
     while ($reviews = tep_db_fetch_array($reviews_query)) {
@@ -226,6 +232,14 @@
                 <td class="dataTableContent"><?php echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $reviews['reviews_id'] . '&action=preview') . '">' . tep_image(DIR_WS_ICONS . 'preview.gif', ICON_PREVIEW) . '</a>&nbsp;' . tep_get_products_name($reviews['products_id']); ?></td>
                 <td class="dataTableContent" align="right"><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif'); ?></td>
                 <td class="dataTableContent" align="right"><?php echo tep_date_short($reviews['date_added']); ?></td>
+                <td class="dataTableContent" align="center">
+<?php
+      if ($reviews['reviews_status'] == '1') {
+        echo tep_image(DIR_WS_IMAGES . 'icon_status_green.gif', IMAGE_ICON_STATUS_GREEN, 10, 10) . '&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_REVIEWS, 'action=setflag&flag=0&rID=' . $reviews['reviews_id'] . '&page=' . $HTTP_GET_VARS['page']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_red_light.gif', IMAGE_ICON_STATUS_RED_LIGHT, 10, 10) . '</a>';
+      } else {
+        echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'action=setflag&flag=1&rID=' . $reviews['reviews_id'] . '&page=' . $HTTP_GET_VARS['page']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_status_green_light.gif', IMAGE_ICON_STATUS_GREEN_LIGHT, 10, 10) . '</a>&nbsp;&nbsp;' . tep_image(DIR_WS_IMAGES . 'icon_status_red.gif', IMAGE_ICON_STATUS_RED, 10, 10);
+      }
+?></td>
                 <td class="dataTableContent" align="right"><?php if ( (is_object($rInfo)) && ($reviews['reviews_id'] == $rInfo->reviews_id) ) { echo tep_image(DIR_WS_IMAGES . 'icon_arrow_right.gif'); } else { echo '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $reviews['reviews_id']) . '">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td>
               </tr>
 <?php
@@ -246,26 +260,26 @@
 
     switch ($action) {
       case 'delete':
-        $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_REVIEW . '</b>');
+        $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_REVIEW . '</strong>');
 
         $contents = array('form' => tep_draw_form('reviews', FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=deleteconfirm'));
         $contents[] = array('text' => TEXT_INFO_DELETE_REVIEW_INTRO);
-        $contents[] = array('text' => '<br><b>' . $rInfo->products_name . '</b>');
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . ' <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+        $contents[] = array('text' => '<br /><strong>' . $rInfo->products_name . '</strong>');
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id)));
         break;
       default:
       if (isset($rInfo) && is_object($rInfo)) {
-        $heading[] = array('text' => '<b>' . $rInfo->products_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $rInfo->products_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($rInfo->date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_REVIEWS, 'page=' . $HTTP_GET_VARS['page'] . '&rID=' . $rInfo->reviews_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($rInfo->date_added));
         if (tep_not_null($rInfo->last_modified)) $contents[] = array('text' => TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($rInfo->last_modified));
-        $contents[] = array('text' => '<br>' . tep_info_image($rInfo->products_image, $rInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_REVIEW_AUTHOR . ' ' . $rInfo->customers_name);
+        $contents[] = array('text' => '<br />' . tep_info_image($rInfo->products_image, $rInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_REVIEW_AUTHOR . ' ' . $rInfo->customers_name);
         $contents[] = array('text' => TEXT_INFO_REVIEW_RATING . ' ' . tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'stars_' . $rInfo->reviews_rating . '.gif'));
         $contents[] = array('text' => TEXT_INFO_REVIEW_READ . ' ' . $rInfo->reviews_read);
-        $contents[] = array('text' => '<br>' . TEXT_INFO_REVIEW_SIZE . ' ' . $rInfo->reviews_text_size . ' bytes');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_PRODUCTS_AVERAGE_RATING . ' ' . number_format($rInfo->average_rating, 2) . '%');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_REVIEW_SIZE . ' ' . $rInfo->reviews_text_size . ' bytes');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_PRODUCTS_AVERAGE_RATING . ' ' . number_format($rInfo->average_rating, 2) . '%');
       }
         break;
     }
@@ -285,16 +299,9 @@
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/sec_dir_permissions.php 2.3.1.src/admin/sec_dir_permissions.php
--- 2.2rc2a.cp.src/admin/sec_dir_permissions.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/sec_dir_permissions.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,106 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  require('includes/application_top.php');
+
+  function tep_opendir($path) {
+    $path = rtrim($path, '/') . '/';
+
+    $exclude_array = array('.', '..', '.DS_Store', 'Thumbs.db');
+
+    $result = array();
+
+    if ($handle = opendir($path)) {
+      while (false !== ($filename = readdir($handle))) {
+        if (!in_array($filename, $exclude_array)) {
+          $file = array('name' => $path . $filename,
+                        'is_dir' => is_dir($path . $filename),
+                        'writable' => tep_is_writable($path . $filename));
+
+          $result[] = $file;
+
+          if ($file['is_dir'] == true) {
+            $result = array_merge($result, tep_opendir($path . $filename));
+          }
+        }
+      }
+
+      closedir($handle);
+    }
+
+    return $result;
+  }
+
+  $whitelist_array = array();
+
+  $whitelist_query = tep_db_query("select directory from " . TABLE_SEC_DIRECTORY_WHITELIST);
+  while ($whitelist = tep_db_fetch_array($whitelist_query)) {
+    $whitelist_array[] = $whitelist['directory'];
+  }
+
+  $admin_dir = basename(DIR_FS_ADMIN);
+
+  if ($admin_dir != 'admin') {
+    for ($i=0, $n=sizeof($whitelist_array); $i<$n; $i++) {
+      if (substr($whitelist_array[$i], 0, 6) == 'admin/') {
+        $whitelist_array[$i] = $admin_dir . substr($whitelist_array[$i], 5);
+      }
+    }
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
+            <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+              <tr class="dataTableHeadingRow">
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_DIRECTORIES; ?></td>
+                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_WRITABLE; ?></td>
+                <td class="dataTableHeadingContent" align="center"><?php echo TABLE_HEADING_RECOMMENDED; ?></td>
+              </tr>
+<?php
+  foreach (tep_opendir(DIR_FS_CATALOG) as $file) {
+    if ($file['is_dir']) {
+?>
+              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">
+                <td class="dataTableContent"><?php echo substr($file['name'], strlen(DIR_FS_CATALOG)); ?></td>
+                <td class="dataTableContent" align="center"><?php echo tep_image(DIR_WS_IMAGES . 'icons/' . (($file['writable'] == true) ? 'tick.gif' : 'cross.gif')); ?></td>
+                <td class="dataTableContent" align="center"><?php echo tep_image(DIR_WS_IMAGES . 'icons/' . (in_array(substr($file['name'], strlen(DIR_FS_CATALOG)), $whitelist_array) ? 'tick.gif' : 'cross.gif')); ?></td>
+              </tr>
+<?php
+    }
+  }
+?>
+              <tr>
+                <td colspan="3" class="smallText"><?php echo TEXT_DIRECTORY . ' ' . DIR_FS_CATALOG; ?></td>
+              </tr>
+            </table></td>
+          </tr>
+        </table></td>
+      </tr>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/server_info.php 2.3.1.src/admin/server_info.php
--- 2.2rc2a.cp.src/admin/server_info.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/server_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,41 +1,93 @@
 <?php
 /*
-  $Id: server_info.php 1785 2008-01-10 15:07:07Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
 
-  $system = tep_get_system_information();
+  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+
+  switch ($action) {
+    case 'export':
+      $info = tep_get_system_information();
+    break;
+
+    case 'submit':
+      $target_host = 'usage.oscommerce.com';
+      $target_path = '/submit.php';
+
+      $encoded = base64_encode(serialize(tep_get_system_information()));
+
+      $response = false;
+
+      if (function_exists('curl_init')) {
+        $data = array('info' => $encoded);
+
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, 'http://' . $target_host . $target_path);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        $response = trim(curl_exec($ch));
+        curl_close($ch);
+      } else {
+        if ($fp = @fsockopen($target_host, 80, $errno, $errstr, 30)) {
+          $data = 'info=' . $encoded;
+
+          fputs($fp, "POST " . $target_path . " HTTP/1.1\r\n");
+          fputs($fp, "Host: " . $target_host . "\r\n");
+          fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
+          fputs($fp, "Content-length: " . strlen($data) . "\r\n");
+          fputs($fp, "Connection: close\r\n\r\n");
+          fputs($fp, $data."\r\n\r\n");
+
+          $response = '';
+
+          while (!feof($fp)) {
+            $response .= fgets($fp, 4096);
+          }
+
+          fclose($fp);
+
+          $response = trim(substr($response, strrpos($response, "\r\n\r\n")));
+        }
+      }
+
+      if ($response != 'OK') {
+        $messageStack->add_session(ERROR_INFO_SUBMIT, 'error');
+      } else {
+        $messageStack->add_session(SUCCESS_INFO_SUBMIT, 'success');
+      }
+
+      tep_redirect(tep_href_link(FILENAME_SERVER_INFO));
+    break;
+
+    case 'save':
+      $info = tep_get_system_information();
+      $info_file = 'server_info-' . date('YmdHis') . '.txt';
+      header('Content-type: text/plain');
+      header('Content-disposition: attachment; filename=' . $info_file);
+      echo tep_format_system_info_array($info);
+      exit;
+
+    break;
+
+    default:
+      $info = tep_get_system_information();
+      break;
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -44,45 +96,80 @@
           </tr>
         </table></td>
       </tr>
+<?php
+  if ($action == 'export') {
+?>
+      <tr>
+        <td><table border="0" cellspacing="0" cellpadding="2">
+          <tr>
+            <td class="smallText" colspan="2"><?php echo TEXT_EXPORT_INTRO; ?></td>
+          </tr>
+          <tr>
+            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+          </tr>
+          <tr>
+            <td colspan="2"><?php echo tep_draw_textarea_field('server configuration', 'soft', '100', '15', tep_format_system_info_array($info)); ?></td>
+          </tr>
+          <tr>
+            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
+          <td align="right" class="smallText"><?php echo tep_draw_button(IMAGE_SEND, 'arrowreturnthick-1-n', tep_href_link(FILENAME_SERVER_INFO, 'action=submit'), 'primary') . tep_draw_button(IMAGE_SAVE, 'disk', tep_href_link(FILENAME_SERVER_INFO, 'action=save'), 'primary');?>
+      </tr>
+  <?php
+  } else {
+    $server = parse_url(HTTP_SERVER);
+?>
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
           <tr>
             <td><table border="0" cellspacing="0" cellpadding="3">
               <tr>
-                <td class="smallText"><b><?php echo TITLE_SERVER_HOST; ?></b></td>
-                <td class="smallText"><?php echo $system['host'] . ' (' . $system['ip'] . ')'; ?></td>
-                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><?php echo TITLE_DATABASE_HOST; ?></b></td>
-                <td class="smallText"><?php echo $system['db_server'] . ' (' . $system['db_ip'] . ')'; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_SERVER_HOST; ?></strong></td>
+                <td class="smallText"><?php echo $server['host'] . ' (' . gethostbyname($server['host']) . ')'; ?></td>
+                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><?php echo TITLE_DATABASE_HOST; ?></strong></td>
+                <td class="smallText"><?php echo DB_SERVER . ' (' . gethostbyname(DB_SERVER) . ')'; ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TITLE_SERVER_OS; ?></b></td>
-                <td class="smallText"><?php echo $system['system'] . ' ' . $system['kernel']; ?></td>
-                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><?php echo TITLE_DATABASE; ?></b></td>
-                <td class="smallText"><?php echo $system['db_version']; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_SERVER_OS; ?></strong></td>
+                <td class="smallText"><?php echo $info['system']['os'] . ' ' . $info['system']['kernel']; ?></td>
+                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><?php echo TITLE_DATABASE; ?></strong></td>
+                <td class="smallText"><?php echo 'MySQL ' . $info['mysql']['version']; ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TITLE_SERVER_DATE; ?></b></td>
-                <td class="smallText"><?php echo $system['date']; ?></td>
-                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><?php echo TITLE_DATABASE_DATE; ?></b></td>
-                <td class="smallText"><?php echo $system['db_date']; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_SERVER_DATE; ?></strong></td>
+                <td class="smallText"><?php echo $info['system']['date']; ?></td>
+                <td class="smallText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><?php echo TITLE_DATABASE_DATE; ?></strong></td>
+                <td class="smallText"><?php echo $info['mysql']['date']; ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TITLE_SERVER_UP_TIME; ?></b></td>
-                <td colspan="3" class="smallText"><?php echo $system['uptime']; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_SERVER_UP_TIME; ?></strong></td>
+                <td colspan="3" class="smallText"><?php echo $info['system']['uptime']; ?></td>
               </tr>
               <tr>
                 <td colspan="4"><?php echo tep_draw_separator('pixel_trans.gif', '1', '5'); ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TITLE_HTTP_SERVER; ?></b></td>
-                <td colspan="3" class="smallText"><?php echo $system['http_server']; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_HTTP_SERVER; ?></strong></td>
+                <td colspan="3" class="smallText"><?php echo $info['system']['http_server']; ?></td>
               </tr>
               <tr>
-                <td class="smallText"><b><?php echo TITLE_PHP_VERSION; ?></b></td>
-                <td colspan="3" class="smallText"><?php echo $system['php'] . ' (' . TITLE_ZEND_VERSION . ' ' . $system['zend'] . ')'; ?></td>
+                <td class="smallText"><strong><?php echo TITLE_PHP_VERSION; ?></strong></td>
+                <td colspan="3" class="smallText"><?php echo $info['php']['version'] . ' (' . TITLE_ZEND_VERSION . ' ' . $info['php']['zend'] . ')'; ?></td>
               </tr>
             </table></td>
           </tr>
+          <tr>
+            <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+          </tr>
+          <tr>
+            <td class="smallText"><?php echo tep_draw_button(IMAGE_EXPORT, 'triangle-1-nw', tep_href_link(FILENAME_SERVER_INFO, 'action=export'));?></td>
+          </tr>
         </table></td>
       </tr>
       <tr>
@@ -109,9 +196,9 @@
     ob_end_clean();
 
     $phpinfo = str_replace('border: 1px', '', $phpinfo);
-    ereg('<body>(.*)</body>', $phpinfo, $regs);
+    preg_match('/<body>(.*)<\/body>/is', $phpinfo, $regs);
     echo '<table border="1" cellpadding="3" width="600" style="border: 0px; border-color: #000000;">' .
-         '  <tr><td><a href="http://www.oscommerce.com"><img border="0" src="images/oscommerce.png" title="' . PROJECT_VERSION . '" /></a><h1 class="p"> ' . PROJECT_VERSION . '</h1></td>' . 
+         '  <tr><td><a href="http://www.oscommerce.com"><img border="0" src="images/oscommerce.png" title="osCommerce Online Merchant v' . tep_get_version() . '" /></a><h1 class="p">osCommerce Online Merchant v' . tep_get_version() . '</h1></td>' .
          '  </tr>' .
          '</table>';
     echo $regs[1];
@@ -121,16 +208,12 @@
 ?>
         </td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+<?php
+  }
+ ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/specials.php 2.3.1.src/admin/specials.php
--- 2.2rc2a.cp.src/admin/specials.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -28,9 +28,7 @@
         $products_id = tep_db_prepare_input($HTTP_POST_VARS['products_id']);
         $products_price = tep_db_prepare_input($HTTP_POST_VARS['products_price']);
         $specials_price = tep_db_prepare_input($HTTP_POST_VARS['specials_price']);
-        $day = tep_db_prepare_input($HTTP_POST_VARS['day']);
-        $month = tep_db_prepare_input($HTTP_POST_VARS['month']);
-        $year = tep_db_prepare_input($HTTP_POST_VARS['year']);
+        $expdate = tep_db_prepare_input($HTTP_POST_VARS['expdate']);
 
         if (substr($specials_price, -1) == '%') {
           $new_special_insert_query = tep_db_query("select products_id, products_price from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'");
@@ -41,13 +39,11 @@
         }
 
         $expires_date = '';
-        if (tep_not_null($day) && tep_not_null($month) && tep_not_null($year)) {
-          $expires_date = $year;
-          $expires_date .= (strlen($month) == 1) ? '0' . $month : $month;
-          $expires_date .= (strlen($day) == 1) ? '0' . $day : $day;
+        if (tep_not_null($expdate)) {
+          $expires_date = substr($expdate, 0, 4) . substr($expdate, 5, 2) . substr($expdate, 8, 2);
         }
 
-        tep_db_query("insert into " . TABLE_SPECIALS . " (products_id, specials_new_products_price, specials_date_added, expires_date, status) values ('" . (int)$products_id . "', '" . tep_db_input($specials_price) . "', now(), '" . tep_db_input($expires_date) . "', '1')");
+        tep_db_query("insert into " . TABLE_SPECIALS . " (products_id, specials_new_products_price, specials_date_added, expires_date, status) values ('" . (int)$products_id . "', '" . tep_db_input($specials_price) . "', now(), " . (tep_not_null($expires_date) ? "'" . tep_db_input($expires_date) . "'" : 'null') . ", '1')");
 
         tep_redirect(tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page']));
         break;
@@ -55,20 +51,16 @@
         $specials_id = tep_db_prepare_input($HTTP_POST_VARS['specials_id']);
         $products_price = tep_db_prepare_input($HTTP_POST_VARS['products_price']);
         $specials_price = tep_db_prepare_input($HTTP_POST_VARS['specials_price']);
-        $day = tep_db_prepare_input($HTTP_POST_VARS['day']);
-        $month = tep_db_prepare_input($HTTP_POST_VARS['month']);
-        $year = tep_db_prepare_input($HTTP_POST_VARS['year']);
+        $expdate = tep_db_prepare_input($HTTP_POST_VARS['expdate']);
 
         if (substr($specials_price, -1) == '%') $specials_price = ($products_price - (($specials_price / 100) * $products_price));
 
         $expires_date = '';
-        if (tep_not_null($day) && tep_not_null($month) && tep_not_null($year)) {
-          $expires_date = $year;
-          $expires_date .= (strlen($month) == 1) ? '0' . $month : $month;
-          $expires_date .= (strlen($day) == 1) ? '0' . $day : $day;
+        if (tep_not_null($expdate)) {
+          $expires_date = substr($expdate, 0, 4) . substr($expdate, 5, 2) . substr($expdate, 8, 2);
         }
 
-        tep_db_query("update " . TABLE_SPECIALS . " set specials_new_products_price = '" . tep_db_input($specials_price) . "', specials_last_modified = now(), expires_date = '" . tep_db_input($expires_date) . "' where specials_id = '" . (int)$specials_id . "'");
+        tep_db_query("update " . TABLE_SPECIALS . " set specials_new_products_price = '" . tep_db_input($specials_price) . "', specials_last_modified = now(), expires_date = " . (tep_not_null($expires_date) ? "'" . tep_db_input($expires_date) . "'" : 'null') . " where specials_id = '" . (int)$specials_id . "'");
 
         tep_redirect(tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $specials_id));
         break;
@@ -81,39 +73,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-<?php
-  if ( ($action == 'new') || ($action == 'edit') ) {
-?>
-<link rel="stylesheet" type="text/css" href="includes/javascript/calendar.css">
-<script language="JavaScript" src="includes/javascript/calendarcode.js"></script>
-<?php
-  }
-?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<div id="popupcalendar" class="text"></div>
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -145,7 +109,7 @@
     }
 ?>
       <tr><form name="new_special" <?php echo 'action="' . tep_href_link(FILENAME_SPECIALS, tep_get_all_get_params(array('action', 'info', 'sID')) . 'action=' . $form_action, 'NONSSL') . '"'; ?> method="post"><?php if ($form_action == 'update') echo tep_draw_hidden_field('specials_id', $HTTP_GET_VARS['sID']); ?>
-        <td><br><table border="0" cellspacing="0" cellpadding="2">
+        <td><br /><table border="0" cellspacing="0" cellpadding="2">
           <tr>
             <td class="main"><?php echo TEXT_SPECIALS_PRODUCT; ?>&nbsp;</td>
             <td class="main"><?php echo (isset($sInfo->products_name)) ? $sInfo->products_name . ' <small>(' . $currencies->format($sInfo->products_price) . ')</small>' : tep_draw_products_pull_down('products_id', 'style="font-size:10px"', $specials_array); echo tep_draw_hidden_field('products_price', (isset($sInfo->products_price) ? $sInfo->products_price : '')); ?></td>
@@ -156,15 +120,23 @@
           </tr>
           <tr>
             <td class="main"><?php echo TEXT_SPECIALS_EXPIRES_DATE; ?>&nbsp;</td>
-            <td class="main"><?php echo tep_draw_input_field('day', (isset($sInfo->expires_date) ? substr($sInfo->expires_date, 8, 2) : ''), 'size="2" maxlength="2" class="cal-TextBox"') . tep_draw_input_field('month', (isset($sInfo->expires_date) ? substr($sInfo->expires_date, 5, 2) : ''), 'size="2" maxlength="2" class="cal-TextBox"') . tep_draw_input_field('year', (isset($sInfo->expires_date) ? substr($sInfo->expires_date, 0, 4) : ''), 'size="4" maxlength="4" class="cal-TextBox"'); ?><a class="so-BtnLink" href="javascript:calClick();return false;" onmouseover="calSwapImg('BTN_date', 'img_Date_OVER',true);" onmouseout="calSwapImg('BTN_date', 'img_Date_UP',true);" onclick="calSwapImg('BTN_date', 'img_Date_DOWN');showCalendar('new_special','dteWhen','BTN_date');return false;"><?php echo tep_image(DIR_WS_IMAGES . 'cal_date_up.gif', 'Calendar', '22', '17', 'align="absmiddle" name="BTN_date"'); ?></a></td>
+            <td class="main"><?php echo tep_draw_input_field('expdate', (tep_not_null($sInfo->expires_date) ? substr($sInfo->expires_date, 0, 4) . '-' . substr($sInfo->expires_date, 5, 2) . '-' . substr($sInfo->expires_date, 8, 2) : ''), 'id="expdate"') . ' <small>(YYYY-MM-DD)</small>'; ?></td>
           </tr>
-        </table></td>
+        </table>
+
+<script type="text/javascript">
+$('#expdate').datepicker({
+  dateFormat: 'yy-mm-dd'
+});
+</script>
+
+        </td>
       </tr>
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
           <tr>
-            <td class="main"><br><?php echo TEXT_SPECIALS_PRICE_TIP; ?></td>
-            <td class="main" align="right" valign="top"><br><?php echo (($form_action == 'insert') ? tep_image_submit('button_insert.gif', IMAGE_INSERT) : tep_image_submit('button_update.gif', IMAGE_UPDATE)). '&nbsp;&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . (isset($HTTP_GET_VARS['sID']) ? '&sID=' . $HTTP_GET_VARS['sID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td>
+            <td class="main"><br /><?php echo TEXT_SPECIALS_PRICE_TIP; ?></td>
+            <td class="smallText" align="right" valign="top"><br /><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . (isset($HTTP_GET_VARS['sID']) ? '&sID=' . $HTTP_GET_VARS['sID'] : ''))); ?></td>
           </tr>
         </table></td>
       </form></tr>
@@ -224,7 +196,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_new_product.gif', IMAGE_NEW_PRODUCT) . '</a>'; ?></td>
+                    <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_NEW_PRODUCT, 'plus', tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -238,26 +210,26 @@
 
   switch ($action) {
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_SPECIALS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_SPECIALS . '</strong>');
 
       $contents = array('form' => tep_draw_form('specials', FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $sInfo->products_name . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . '&nbsp;<a href="' . tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $sInfo->products_name . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id)));
       break;
     default:
       if (is_object($sInfo)) {
-        $heading[] = array('text' => '<b>' . $sInfo->products_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $sInfo->products_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($sInfo->specials_date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_SPECIALS, 'page=' . $HTTP_GET_VARS['page'] . '&sID=' . $sInfo->specials_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($sInfo->specials_date_added));
         $contents[] = array('text' => '' . TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($sInfo->specials_last_modified));
-        $contents[] = array('align' => 'center', 'text' => '<br>' . tep_info_image($sInfo->products_image, $sInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ORIGINAL_PRICE . ' ' . $currencies->format($sInfo->products_price));
+        $contents[] = array('align' => 'center', 'text' => '<br />' . tep_info_image($sInfo->products_image, $sInfo->products_name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ORIGINAL_PRICE . ' ' . $currencies->format($sInfo->products_price));
         $contents[] = array('text' => '' . TEXT_INFO_NEW_PRICE . ' ' . $currencies->format($sInfo->specials_new_products_price));
         $contents[] = array('text' => '' . TEXT_INFO_PERCENTAGE . ' ' . number_format(100 - (($sInfo->specials_new_products_price / $sInfo->products_price) * 100)) . '%');
 
-        $contents[] = array('text' => '<br>' . TEXT_INFO_EXPIRES_DATE . ' <b>' . tep_date_short($sInfo->expires_date) . '</b>');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_EXPIRES_DATE . ' <strong>' . tep_date_short($sInfo->expires_date) . '</strong>');
         $contents[] = array('text' => '' . TEXT_INFO_STATUS_CHANGE . ' ' . tep_date_short($sInfo->date_status_change));
       }
       break;
@@ -275,15 +247,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/stats_customers.php 2.3.1.src/admin/stats_customers.php
--- 2.2rc2a.cp.src/admin/stats_customers.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/stats_customers.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: stats_customers.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -14,30 +14,11 @@
 
   require(DIR_WS_CLASSES . 'currencies.php');
   $currencies = new currencies();
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-        </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -92,15 +73,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/stats_products_purchased.php 2.3.1.src/admin/stats_products_purchased.php
--- 2.2rc2a.cp.src/admin/stats_products_purchased.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/stats_products_purchased.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,40 +1,21 @@
 <?php
 /*
-  $Id: stats_products_purchased.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-        </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -86,15 +67,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/stats_products_viewed.php 2.3.1.src/admin/stats_products_viewed.php
--- 2.2rc2a.cp.src/admin/stats_products_viewed.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/stats_products_viewed.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,40 +1,21 @@
 <?php
 /*
-  $Id: stats_products_viewed.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="0">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -85,15 +66,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/store_logo.php 2.3.1.src/admin/store_logo.php
--- 2.2rc2a.cp.src/admin/store_logo.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/store_logo.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,95 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  require('includes/application_top.php');
+
+  $action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
+
+  if (tep_not_null($action)) {
+    switch ($action) {
+      case 'save':
+        $error = false;
+
+        $store_logo = new upload('store_logo');
+        $store_logo->set_extensions('png');
+        $store_logo->set_destination(DIR_FS_CATALOG_IMAGES);
+
+        if ($store_logo->parse()) {
+          $store_logo->set_filename('store_logo.png');
+
+          if ($store_logo->save()) {
+            $messageStack->add_session(SUCCESS_LOGO_UPDATED, 'success');
+          } else {
+            $error = true;
+          }
+        } else {
+          $error = true;
+        }
+
+        if ($error == false) {
+          tep_redirect(tep_href_link(FILENAME_STORE_LOGO));
+        }
+        break;
+    }
+  }
+
+  if (!tep_is_writable(DIR_FS_CATALOG_IMAGES)) {
+    $messageStack->add(sprintf(ERROR_IMAGES_DIRECTORY_NOT_WRITEABLE, tep_href_link(FILENAME_SEC_DIR_PERMISSIONS)), 'error');
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
+            <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_image(HTTP_CATALOG_SERVER . DIR_WS_CATALOG_IMAGES . 'store_logo.png'); ?></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_form('logo', FILENAME_STORE_LOGO, 'action=save', 'post', 'enctype="multipart/form-data"'); ?>
+          <table border="0" cellspacing="0" cellpadding="2">
+            <tr>
+              <td class="main" valign="top"><?php echo TEXT_LOGO_IMAGE; ?></td>
+              <td class="main"><?php echo tep_draw_file_field('store_logo'); ?></td>
+              <td class="smallText"><?php echo tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary'); ?></td>
+            </tr>
+          </table>
+        </form></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
+        <td class="main"><?php echo TEXT_FORMAT_AND_LOCATION; ?></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
+        <td class="main"><?php echo DIR_FS_CATALOG_IMAGES . 'store_logo.png'; ?></td>
+      </tr>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/tax_classes.php 2.3.1.src/admin/tax_classes.php
--- 2.2rc2a.cp.src/admin/tax_classes.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/tax_classes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: tax_classes.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -42,30 +42,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -113,7 +94,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_new_tax_class.gif', IMAGE_NEW_TAX_CLASS) . '</a>'; ?></td>
+                    <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_NEW_TAX_CLASS, 'plus', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -127,39 +108,39 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_TAX_CLASS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_TAX_CLASS . '</strong>');
 
       $contents = array('form' => tep_draw_form('classes', FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_TITLE . '<br>' . tep_draw_input_field('tax_class_title'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_DESCRIPTION . '<br>' . tep_draw_input_field('tax_class_description'));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_TITLE . '<br />' . tep_draw_input_field('tax_class_title'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_DESCRIPTION . '<br />' . tep_draw_input_field('tax_class_description'));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'plus', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_TAX_CLASS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_TAX_CLASS . '</strong>');
 
       $contents = array('form' => tep_draw_form('classes', FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_TITLE . '<br>' . tep_draw_input_field('tax_class_title', $tcInfo->tax_class_title));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_DESCRIPTION . '<br>' . tep_draw_input_field('tax_class_description', $tcInfo->tax_class_description));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_TITLE . '<br />' . tep_draw_input_field('tax_class_title', $tcInfo->tax_class_title));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_DESCRIPTION . '<br />' . tep_draw_input_field('tax_class_description', $tcInfo->tax_class_description));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_TAX_CLASS . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_TAX_CLASS . '</strong>');
 
       $contents = array('form' => tep_draw_form('classes', FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $tcInfo->tax_class_title . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $tcInfo->tax_class_title . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id)));
       break;
     default:
       if (isset($tcInfo) && is_object($tcInfo)) {
-        $heading[] = array('text' => '<b>' . $tcInfo->tax_class_title . '</b>');
+        $heading[] = array('text' => '<strong>' . $tcInfo->tax_class_title . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($tcInfo->date_added));
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_TAX_CLASSES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $tcInfo->tax_class_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($tcInfo->date_added));
         $contents[] = array('text' => '' . TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($tcInfo->last_modified));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_DESCRIPTION . '<br>' . $tcInfo->tax_class_description);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_DESCRIPTION . '<br />' . $tcInfo->tax_class_description);
       }
       break;
   }
@@ -175,16 +156,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/tax_rates.php 2.3.1.src/admin/tax_rates.php
--- 2.2rc2a.cp.src/admin/tax_rates.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/tax_rates.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: tax_rates.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -48,30 +48,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -125,7 +106,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="5" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_new_tax_rate.gif', IMAGE_NEW_TAX_RATE) . '</a>'; ?></td>
+                    <td class="smallText" colspan="5" align="right"><?php echo tep_draw_button(IMAGE_NEW_TAX_RATE, 'plus', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -139,44 +120,44 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_TAX_RATE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_TAX_RATE . '</strong>');
 
       $contents = array('form' => tep_draw_form('rates', FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_TITLE . '<br>' . tep_tax_classes_pull_down('name="tax_class_id" style="font-size:10px"'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_NAME . '<br>' . tep_geo_zones_pull_down('name="tax_zone_id" style="font-size:10px"'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_TAX_RATE . '<br>' . tep_draw_input_field('tax_rate'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_RATE_DESCRIPTION . '<br>' . tep_draw_input_field('tax_description'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_TAX_RATE_PRIORITY . '<br>' . tep_draw_input_field('tax_priority'));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_TITLE . '<br />' . tep_tax_classes_pull_down('name="tax_class_id" style="font-size:10px"'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_NAME . '<br />' . tep_geo_zones_pull_down('name="tax_zone_id" style="font-size:10px"'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_TAX_RATE . '<br />' . tep_draw_input_field('tax_rate'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_RATE_DESCRIPTION . '<br />' . tep_draw_input_field('tax_description'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_TAX_RATE_PRIORITY . '<br />' . tep_draw_input_field('tax_priority'));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_TAX_RATE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_TAX_RATE . '</strong>');
 
       $contents = array('form' => tep_draw_form('rates', FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id  . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_CLASS_TITLE . '<br>' . tep_tax_classes_pull_down('name="tax_class_id" style="font-size:10px"', $trInfo->tax_class_id));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONE_NAME . '<br>' . tep_geo_zones_pull_down('name="tax_zone_id" style="font-size:10px"', $trInfo->geo_zone_id));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_TAX_RATE . '<br>' . tep_draw_input_field('tax_rate', $trInfo->tax_rate));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_RATE_DESCRIPTION . '<br>' . tep_draw_input_field('tax_description', $trInfo->tax_description));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_TAX_RATE_PRIORITY . '<br>' . tep_draw_input_field('tax_priority', $trInfo->tax_priority));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_CLASS_TITLE . '<br />' . tep_tax_classes_pull_down('name="tax_class_id" style="font-size:10px"', $trInfo->tax_class_id));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONE_NAME . '<br />' . tep_geo_zones_pull_down('name="tax_zone_id" style="font-size:10px"', $trInfo->geo_zone_id));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_TAX_RATE . '<br />' . tep_draw_input_field('tax_rate', $trInfo->tax_rate));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_RATE_DESCRIPTION . '<br />' . tep_draw_input_field('tax_description', $trInfo->tax_description));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_TAX_RATE_PRIORITY . '<br />' . tep_draw_input_field('tax_priority', $trInfo->tax_priority));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_TAX_RATE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_TAX_RATE . '</strong>');
 
       $contents = array('form' => tep_draw_form('rates', FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id  . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $trInfo->tax_class_title . ' ' . number_format($trInfo->tax_rate, TAX_DECIMAL_PLACES) . '%</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . '&nbsp;<a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $trInfo->tax_class_title . ' ' . number_format($trInfo->tax_rate, TAX_DECIMAL_PLACES) . '%</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id)));
       break;
     default:
       if (is_object($trInfo)) {
-        $heading[] = array('text' => '<b>' . $trInfo->tax_class_title . '</b>');
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($trInfo->date_added));
+        $heading[] = array('text' => '<strong>' . $trInfo->tax_class_title . '</strong>');
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_TAX_RATES, 'page=' . $HTTP_GET_VARS['page'] . '&tID=' . $trInfo->tax_rates_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_DATE_ADDED . ' ' . tep_date_short($trInfo->date_added));
         $contents[] = array('text' => '' . TEXT_INFO_LAST_MODIFIED . ' ' . tep_date_short($trInfo->last_modified));
-        $contents[] = array('text' => '<br>' . TEXT_INFO_RATE_DESCRIPTION . '<br>' . $trInfo->tax_description);
+        $contents[] = array('text' => '<br />' . TEXT_INFO_RATE_DESCRIPTION . '<br />' . $trInfo->tax_description);
       }
       break;
   }
@@ -193,16 +174,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/version_check.php 2.3.1.src/admin/version_check.php
--- 2.2rc2a.cp.src/admin/version_check.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/admin/version_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,144 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  require('includes/application_top.php');
+
+  $current_version = tep_get_version();
+  $major_version = (int)substr($current_version, 0, 1);
+
+  $releases = null;
+  $new_versions = array();
+  $check_message = array();
+
+  if (function_exists('curl_init')) {
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, 'http://www.oscommerce.com/version/online_merchant/' . $major_version);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    $response = trim(curl_exec($ch));
+    curl_close($ch);
+
+    if (!empty($response)) {
+      $releases = explode("\n", $response);
+    }
+  } else {
+    if ($fp = @fsockopen('www.oscommerce.com', 80, $errno, $errstr, 30)) {
+      $header = 'GET /version/online_merchant/' . $major_version . ' HTTP/1.0' . "\r\n" .
+                'Host: www.oscommerce.com' . "\r\n" .
+                'Connection: close' . "\r\n\r\n";
+
+      fwrite($fp, $header);
+
+      $response = '';
+      while (!feof($fp)) {
+        $response .= fgets($fp, 1024);
+      }
+
+      fclose($fp);
+
+      $response = explode("\r\n\r\n", $response); // split header and content
+
+      if (isset($response[1]) && !empty($response[1])) {
+        $releases = explode("\n", trim($response[1]));
+      }
+    }
+  }
+
+  if (is_array($releases) && !empty($releases)) {
+    $serialized = serialize($releases);
+    if ($f = @fopen(DIR_FS_CACHE . 'oscommerce_version_check.cache', 'w')) {
+      fwrite ($f, $serialized, strlen($serialized));
+      fclose($f);
+    }
+
+    foreach ($releases as $version) {
+      $version_array = explode('|', $version);
+
+      if (version_compare($current_version, $version_array[0], '<')) {
+        $new_versions[] = $version_array;
+      }
+    }
+
+    if (!empty($new_versions)) {
+      $check_message = array('class' => 'secWarning',
+                             'message' => sprintf(VERSION_UPGRADES_AVAILABLE, $new_versions[0][0]));
+    } else {
+      $check_message = array('class' => 'secSuccess',
+                             'message' => VERSION_RUNNING_LATEST);
+    }
+  } else {
+    $check_message = array('class' => 'secError',
+                           'message' => ERROR_COULD_NOT_CONNECT);
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
+            <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
+          </tr>
+        </table></td>
+      </tr>
+      <tr>
+        <td class="smallText"><?php echo TITLE_INSTALLED_VERSION . ' <strong>osCommerce Online Merchant v' . $current_version . '</strong>'; ?></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+      <tr>
+        <td><div class="<?php echo $check_message['class']; ?>">
+          <p class="smallText"><?php echo $check_message['message']; ?></p>
+        </div></td>
+      </tr>
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td>
+      </tr>
+<?php
+  if (!empty($new_versions)) {
+?>
+      <tr>
+        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+              <tr class="dataTableHeadingRow">
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_VERSION; ?></td>
+                <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_RELEASED; ?></td>
+                <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td>
+              </tr>
+
+<?php
+    foreach ($new_versions as $version) {
+?>
+              <tr class="dataTableRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)">
+                <td class="dataTableContent"><?php echo '<a href="' . $version[2] . '" target="_blank">osCommerce Online Merchant v' . $version[0] . '</a>'; ?></td>
+                <td class="dataTableContent"><?php echo tep_date_long(substr($version[1], 0, 4) . '-' . substr($version[1], 4, 2) . '-' . substr($version[1], 6, 2)); ?></td>
+                <td class="dataTableContent" align="right"><?php echo '<a href="' . $version[2] . '" target="_blank">' . tep_image(DIR_WS_IMAGES . 'icon_info.gif', IMAGE_ICON_INFO) . '</a>'; ?>&nbsp;</td>
+              </tr>
+<?php
+    }
+?>
+            </table></rd>
+          </tr>
+        </table></td>
+      </tr>
+<?php
+  }
+?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/whos_online.php 2.3.1.src/admin/whos_online.php
--- 2.2rc2a.cp.src/admin/whos_online.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/whos_online.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: whos_online.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -19,30 +19,11 @@
 
 // remove entries that have expired
   tep_db_query("delete from " . TABLE_WHOS_ONLINE . " where time_last_click < '" . $xx_mins_ago . "'");
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -84,7 +65,7 @@
                 <td class="dataTableContent" align="center"><?php echo $whos_online['ip_address']; ?></td>
                 <td class="dataTableContent"><?php echo date('H:i:s', $whos_online['time_entry']); ?></td>
                 <td class="dataTableContent" align="center"><?php echo date('H:i:s', $whos_online['time_last_click']); ?></td>
-                <td class="dataTableContent"><?php if (eregi('^(.*)' . tep_session_name() . '=[a-f,0-9]+[&]*(.*)', $whos_online['last_page_url'], $array)) { echo $array[1] . $array[2]; } else { echo $whos_online['last_page_url']; } ?>&nbsp;</td>
+                <td class="dataTableContent"><?php if (preg_match('/^(.*)' . tep_session_name() . '=[a-f,0-9]+[&]*(.*)/i', $whos_online['last_page_url'], $array)) { echo $array[1] . $array[2]; } else { echo $whos_online['last_page_url']; } ?>&nbsp;</td>
               </tr>
 <?php
   }
@@ -98,7 +79,7 @@
   $contents = array();
 
   if (isset($info)) {
-    $heading[] = array('text' => '<b>' . TABLE_HEADING_SHOPPING_CART . '</b>');
+    $heading[] = array('text' => '<strong>' . TABLE_HEADING_SHOPPING_CART . '</strong>');
 
     if (STORE_SESSIONS == 'mysql') {
       $session_data = tep_db_query("select value from " . TABLE_SESSIONS . " WHERE sesskey = '" . $info . "'");
@@ -112,19 +93,11 @@
     }
 
     if ($length = strlen($session_data)) {
-      if (PHP_VERSION < 4) {
-        $start_id = strpos($session_data, 'customer_id[==]s');
-        $start_cart = strpos($session_data, 'cart[==]o');
-        $start_currency = strpos($session_data, 'currency[==]s');
-        $start_country = strpos($session_data, 'customer_country_id[==]s');
-        $start_zone = strpos($session_data, 'customer_zone_id[==]s');
-      } else {
-        $start_id = strpos($session_data, 'customer_id|s');
-        $start_cart = strpos($session_data, 'cart|O');
-        $start_currency = strpos($session_data, 'currency|s');
-        $start_country = strpos($session_data, 'customer_country_id|s');
-        $start_zone = strpos($session_data, 'customer_zone_id|s');
-      }
+      $start_id = strpos($session_data, 'customer_id|s');
+      $start_cart = strpos($session_data, 'cart|O');
+      $start_currency = strpos($session_data, 'currency|s');
+      $start_country = strpos($session_data, 'customer_country_id|s');
+      $start_zone = strpos($session_data, 'customer_zone_id|s');
 
       for ($i=$start_cart; $i<$length; $i++) {
         if ($session_data[$i] == '{') {
@@ -152,13 +125,7 @@
       session_decode($session_data_zone);
       session_decode($session_data_cart);
 
-      if (PHP_VERSION < 4) {
-        $broken_cart = $cart;
-        $cart = new shoppingCart;
-        $cart->unserialize($broken_cart);
-      }
-
-      if (is_object($cart)) {
+      if (isset($cart) && is_object($cart)) {
         $products = $cart->get_products();
         for ($i = 0, $n = sizeof($products); $i < $n; $i++) {
           $contents[] = array('text' => $products[$i]['quantity'] . ' x ' . $products[$i]['name']);
@@ -186,16 +153,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/admin/zones.php 2.3.1.src/admin/zones.php
--- 2.2rc2a.cp.src/admin/zones.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/admin/zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2002 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -44,30 +44,11 @@
         break;
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="2" cellpadding="2">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
         <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
           <tr>
@@ -119,7 +100,7 @@
   if (empty($action)) {
 ?>
                   <tr>
-                    <td colspan="2" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new') . '">' . tep_image_button('button_new_zone.gif', IMAGE_NEW_ZONE) . '</a>'; ?></td>
+                    <td class="smallText" colspan="2" align="right"><?php echo tep_draw_button(IMAGE_NEW_ZONE, 'plus', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&action=new')); ?></td>
                   </tr>
 <?php
   }
@@ -133,40 +114,40 @@
 
   switch ($action) {
     case 'new':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_NEW_ZONE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_NEW_ZONE . '</strong>');
 
       $contents = array('form' => tep_draw_form('zones', FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&action=insert'));
       $contents[] = array('text' => TEXT_INFO_INSERT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONES_NAME . '<br>' . tep_draw_input_field('zone_name'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONES_CODE . '<br>' . tep_draw_input_field('zone_code'));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . '<br>' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries()));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_insert.gif', IMAGE_INSERT) . '&nbsp;<a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page']) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONES_NAME . '<br />' . tep_draw_input_field('zone_name'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONES_CODE . '<br />' . tep_draw_input_field('zone_code'));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . '<br />' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries()));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'])));
       break;
     case 'edit':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_EDIT_ZONE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_EDIT_ZONE . '</strong>');
 
       $contents = array('form' => tep_draw_form('zones', FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=save'));
       $contents[] = array('text' => TEXT_INFO_EDIT_INTRO);
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONES_NAME . '<br>' . tep_draw_input_field('zone_name', $cInfo->zone_name));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_ZONES_CODE . '<br>' . tep_draw_input_field('zone_code', $cInfo->zone_code));
-      $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . '<br>' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(), $cInfo->countries_id));
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_update.gif', IMAGE_UPDATE) . '&nbsp;<a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONES_NAME . '<br />' . tep_draw_input_field('zone_name', $cInfo->zone_name));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_ZONES_CODE . '<br />' . tep_draw_input_field('zone_code', $cInfo->zone_code));
+      $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . '<br />' . tep_draw_pull_down_menu('zone_country_id', tep_get_countries(), $cInfo->countries_id));
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_SAVE, 'disk', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id)));
       break;
     case 'delete':
-      $heading[] = array('text' => '<b>' . TEXT_INFO_HEADING_DELETE_ZONE . '</b>');
+      $heading[] = array('text' => '<strong>' . TEXT_INFO_HEADING_DELETE_ZONE . '</strong>');
 
       $contents = array('form' => tep_draw_form('zones', FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=deleteconfirm'));
       $contents[] = array('text' => TEXT_INFO_DELETE_INTRO);
-      $contents[] = array('text' => '<br><b>' . $cInfo->zone_name . '</b>');
-      $contents[] = array('align' => 'center', 'text' => '<br>' . tep_image_submit('button_delete.gif', IMAGE_DELETE) . '&nbsp;<a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>');
+      $contents[] = array('text' => '<br /><strong>' . $cInfo->zone_name . '</strong>');
+      $contents[] = array('align' => 'center', 'text' => '<br />' . tep_draw_button(IMAGE_DELETE, 'trash', null, 'primary') . tep_draw_button(IMAGE_CANCEL, 'close', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id)));
       break;
     default:
       if (isset($cInfo) && is_object($cInfo)) {
-        $heading[] = array('text' => '<b>' . $cInfo->zone_name . '</b>');
+        $heading[] = array('text' => '<strong>' . $cInfo->zone_name . '</strong>');
 
-        $contents[] = array('align' => 'center', 'text' => '<a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=edit') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=delete') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_ZONES_NAME . '<br>' . $cInfo->zone_name . ' (' . $cInfo->zone_code . ')');
-        $contents[] = array('text' => '<br>' . TEXT_INFO_COUNTRY_NAME . ' ' . $cInfo->countries_name);
+        $contents[] = array('align' => 'center', 'text' => tep_draw_button(IMAGE_EDIT, 'document', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=edit')) . tep_draw_button(IMAGE_DELETE, 'trash', tep_href_link(FILENAME_ZONES, 'page=' . $HTTP_GET_VARS['page'] . '&cID=' . $cInfo->zone_id . '&action=delete')));
+        $contents[] = array('text' => '<br />' . TEXT_INFO_ZONES_NAME . '<br />' . $cInfo->zone_name . ' (' . $cInfo->zone_code . ')');
+        $contents[] = array('text' => '<br />' . TEXT_INFO_COUNTRY_NAME . ' ' . $cInfo->countries_name);
       }
       break;
   }
@@ -183,16 +164,9 @@
           </tr>
         </table></td>
       </tr>
-    </table></td>
-<!-- body_text_eof //-->
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/advanced_search.php 2.3.1.src/advanced_search.php
--- 2.2rc2a.cp.src/advanced_search.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/advanced_search.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: advanced_search.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,16 +15,12 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ADVANCED_SEARCH);
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ADVANCED_SEARCH));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript" src="includes/general.js"></script>
-<script language="javascript"><!--
+
+<script type="text/javascript" src="includes/general.js"></script>
+<script type="text/javascript"><!--
 function check_form() {
   var error_message = "<?php echo JS_ERROR; ?>";
   var error_found = false;
@@ -37,13 +33,13 @@
   var pfrom_float;
   var pto_float;
 
-  if ( ((keywords == '') || (keywords.length < 1)) && ((dfrom == '') || (dfrom == '<?php echo DOB_FORMAT_STRING; ?>') || (dfrom.length < 1)) && ((dto == '') || (dto == '<?php echo DOB_FORMAT_STRING; ?>') || (dto.length < 1)) && ((pfrom == '') || (pfrom.length < 1)) && ((pto == '') || (pto.length < 1)) ) {
+  if ( ((keywords == '') || (keywords.length < 1)) && ((dfrom == '') || (dfrom.length < 1)) && ((dto == '') || (dto.length < 1)) && ((pfrom == '') || (pfrom.length < 1)) && ((pto == '') || (pto.length < 1)) ) {
     error_message = error_message + "* <?php echo ERROR_AT_LEAST_ONE_INPUT; ?>\n";
     error_field = document.advanced_search.keywords;
     error_found = true;
   }
 
-  if ((dfrom.length > 0) && (dfrom != '<?php echo DOB_FORMAT_STRING; ?>')) {
+  if (dfrom.length > 0) {
     if (!IsValidDate(dfrom, '<?php echo DOB_FORMAT_STRING; ?>')) {
       error_message = error_message + "* <?php echo ERROR_INVALID_FROM_DATE; ?>\n";
       error_field = document.advanced_search.dfrom;
@@ -51,7 +47,7 @@
     }
   }
 
-  if ((dto.length > 0) && (dto != '<?php echo DOB_FORMAT_STRING; ?>')) {
+  if (dto.length > 0) {
     if (!IsValidDate(dto, '<?php echo DOB_FORMAT_STRING; ?>')) {
       error_message = error_message + "* <?php echo ERROR_INVALID_TO_DATE; ?>\n";
       error_field = document.advanced_search.dto;
@@ -59,7 +55,7 @@
     }
   }
 
-  if ((dfrom.length > 0) && (dfrom != '<?php echo DOB_FORMAT_STRING; ?>') && (IsValidDate(dfrom, '<?php echo DOB_FORMAT_STRING; ?>')) && (dto.length > 0) && (dto != '<?php echo DOB_FORMAT_STRING; ?>') && (IsValidDate(dto, '<?php echo DOB_FORMAT_STRING; ?>'))) {
+  if ((dfrom.length > 0) && (IsValidDate(dfrom, '<?php echo DOB_FORMAT_STRING; ?>')) && (dto.length > 0) && (IsValidDate(dto, '<?php echo DOB_FORMAT_STRING; ?>'))) {
     if (!CheckDateRange(document.advanced_search.dfrom, document.advanced_search.dto)) {
       error_message = error_message + "* <?php echo ERROR_TO_DATE_LESS_THAN_FROM_DATE; ?>\n";
       error_field = document.advanced_search.dto;
@@ -102,8 +98,6 @@
     error_field.focus();
     return false;
   } else {
-    RemoveFormatString(document.advanced_search.dfrom, "<?php echo DOB_FORMAT_STRING; ?>");
-    RemoveFormatString(document.advanced_search.dto, "<?php echo DOB_FORMAT_STRING; ?>");
     return true;
   }
 }
@@ -112,135 +106,85 @@
   window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=450,height=280,screenX=150,screenY=150,top=150,left=150')
 }
 //--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('advanced_search', tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, '', 'NONSSL', false), 'get', 'onSubmit="return check_form(this);"') . tep_hide_session_id(); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE_1; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_browse.gif', HEADING_TITLE_1, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE_1; ?></h1>
+
 <?php
   if ($messageStack->size('search') > 0) {
+    echo $messageStack->output('search');
+  }
 ?>
+
+<?php echo tep_draw_form('advanced_search', tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, '', 'NONSSL', false), 'get', 'onsubmit="return check_form(this);"') . tep_hide_session_id(); ?>
+
+<div class="contentContainer">
+  <h2><?php echo HEADING_SEARCH_CRITERIA; ?></h2>
+
+  <div class="contentText">
+    <div>
+      <?php echo tep_draw_input_field('keywords', '', 'style="width: 100%"') . tep_draw_hidden_field('search_in_description', '1'); ?>
+    </div>
+
+    <br />
+
+    <div>
+      <span><?php echo '<a href="' . tep_href_link(FILENAME_POPUP_SEARCH_HELP) . '" target="_blank" onclick="$(\'#helpSearch\').dialog(\'open\'); return false;">' . TEXT_SEARCH_HELP_LINK . '</a>'; ?></span>
+      <span style="float: right;"><?php echo tep_draw_button(IMAGE_BUTTON_SEARCH, 'search', null, 'primary'); ?></span>
+    </div>
+
+    <div id="helpSearch" title="<?php echo HEADING_SEARCH_HELP; ?>">
+      <p><?php echo TEXT_SEARCH_HELP; ?></p>
+    </div>
+
+<script type="text/javascript">
+$('#helpSearch').dialog({
+  autoOpen: false,
+  buttons: {
+    Ok: function() {
+      $(this).dialog('close');
+    }
+  }
+});
+</script>
+
+    <br />
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><?php echo $messageStack->output('search'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_CATEGORIES; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_pull_down_menu('categories_id', tep_get_categories(array(array('id' => '', 'text' => TEXT_ALL_CATEGORIES)))); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey">&nbsp;</td>
+        <td class="smallText"><?php echo tep_draw_checkbox_field('inc_subcat', '1', true) . ' ' . ENTRY_INCLUDE_SUBCATEGORIES; ?></td>
       </tr>
-<?php
-  }
-?>
       <tr>
-        <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => HEADING_SEARCH_CRITERIA);
-
-  new infoBoxHeading($info_box_contents, true, true);
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => tep_draw_input_field('keywords', '', 'style="width: 100%"'));
-  $info_box_contents[] = array('align' => 'right', 'text' => tep_draw_checkbox_field('search_in_description', '1') . ' ' . TEXT_SEARCH_IN_DESCRIPTION);
-
-  new infoBox($info_box_contents);
-?>
-        </td>
+        <td class="fieldKey"><?php echo ENTRY_MANUFACTURERS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_pull_down_menu('manufacturers_id', tep_get_manufacturers(array(array('id' => '', 'text' => TEXT_ALL_MANUFACTURERS)))); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_PRICE_FROM; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('pfrom'); ?></td>
       </tr>
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText"><?php echo '<a href="javascript:popupWindow(\'' . tep_href_link(FILENAME_POPUP_SEARCH_HELP) . '\')">' . TEXT_SEARCH_HELP_LINK . '</a>'; ?></td>
-            <td class="smallText" align="right"><?php echo tep_image_submit('button_search.gif', IMAGE_BUTTON_SEARCH); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_CATEGORIES; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_pull_down_menu('categories_id', tep_get_categories(array(array('id' => '', 'text' => TEXT_ALL_CATEGORIES)))); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey">&nbsp;</td>
-                <td class="smallText"><?php echo tep_draw_checkbox_field('inc_subcat', '1', true) . ' ' . ENTRY_INCLUDE_SUBCATEGORIES; ?></td>
-              </tr>
-              <tr>
-                <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_MANUFACTURERS; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_pull_down_menu('manufacturers_id', tep_get_manufacturers(array(array('id' => '', 'text' => TEXT_ALL_MANUFACTURERS)))); ?></td>
-              </tr>
-              <tr>
-                <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_PRICE_FROM; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_input_field('pfrom'); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_PRICE_TO; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_input_field('pto'); ?></td>
-              </tr>
-              <tr>
-                <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_DATE_FROM; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_input_field('dfrom', DOB_FORMAT_STRING, 'onFocus="RemoveFormatString(this, \'' . DOB_FORMAT_STRING . '\')"'); ?></td>
-              </tr>
-              <tr>
-                <td class="fieldKey"><?php echo ENTRY_DATE_TO; ?></td>
-                <td class="fieldValue"><?php echo tep_draw_input_field('dto', DOB_FORMAT_STRING, 'onFocus="RemoveFormatString(this, \'' . DOB_FORMAT_STRING . '\')"'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+        <td class="fieldKey"><?php echo ENTRY_PRICE_TO; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('pto'); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_DATE_FROM; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('dfrom', '', 'id="dfrom"'); ?><script type="text/javascript">$('#dfrom').datepicker({dateFormat: '<?php echo JQUERY_DATEPICKER_FORMAT; ?>', changeMonth: true, changeYear: true, yearRange: '-10:+0'});</script></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_DATE_TO; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('dto', '', 'id="dto"'); ?><script type="text/javascript">$('#dto').datepicker({dateFormat: '<?php echo JQUERY_DATEPICKER_FORMAT; ?>', changeMonth: true, changeYear: true, yearRange: '-10:+0'});</script></td>
+      </tr>
+    </table>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/advanced_search_result.php 2.3.1.src/advanced_search_result.php
--- 2.2rc2a.cp.src/advanced_search_result.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/advanced_search_result.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: advanced_search_result.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -48,7 +48,7 @@
     }
 
     if (isset($HTTP_GET_VARS['keywords'])) {
-      $keywords = $HTTP_GET_VARS['keywords'];
+      $keywords = tep_db_prepare_input($HTTP_GET_VARS['keywords']);
     }
 
     $date_check_error = false;
@@ -126,43 +126,14 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ADVANCED_SEARCH));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, tep_get_all_get_params(), 'NONSSL', true, false));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE_2; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_browse.gif', HEADING_TITLE_2, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td>
+
+<h1><?php echo HEADING_TITLE_2; ?></h1>
+
+<div class="contentContainer">
+
 <?php
 // create column list
   $define_list = array('PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL,
@@ -300,39 +271,39 @@
     $where_str .= " group by p.products_id, tr.tax_priority";
   }
 
-  if ( (!isset($HTTP_GET_VARS['sort'])) || (!ereg('[1-8][ad]', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
+  if ( (!isset($HTTP_GET_VARS['sort'])) || (!preg_match('/^[1-8][ad]$/', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
     for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
       if ($column_list[$i] == 'PRODUCT_LIST_NAME') {
         $HTTP_GET_VARS['sort'] = $i+1 . 'a';
-        $order_str = ' order by pd.products_name';
+        $order_str = " order by pd.products_name";
         break;
       }
     }
   } else {
     $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1);
     $sort_order = substr($HTTP_GET_VARS['sort'], 1);
-    $order_str = ' order by ';
+
     switch ($column_list[$sort_col-1]) {
       case 'PRODUCT_LIST_MODEL':
-        $order_str .= "p.products_model " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name";
+        $order_str = " order by p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
         break;
       case 'PRODUCT_LIST_NAME':
-        $order_str .= "pd.products_name " . ($sort_order == 'd' ? "desc" : "");
+        $order_str = " order by pd.products_name " . ($sort_order == 'd' ? 'desc' : '');
         break;
       case 'PRODUCT_LIST_MANUFACTURER':
-        $order_str .= "m.manufacturers_name " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name";
+        $order_str = " order by m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
         break;
       case 'PRODUCT_LIST_QUANTITY':
-        $order_str .= "p.products_quantity " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name";
+        $order_str = " order by p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
         break;
       case 'PRODUCT_LIST_IMAGE':
-        $order_str .= "pd.products_name";
+        $order_str = " order by pd.products_name";
         break;
       case 'PRODUCT_LIST_WEIGHT':
-        $order_str .= "p.products_weight " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name";
+        $order_str = " order by p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
         break;
       case 'PRODUCT_LIST_PRICE':
-        $order_str .= "final_price " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name";
+        $order_str = " order by final_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
         break;
     }
   }
@@ -341,29 +312,15 @@
 
   require(DIR_WS_MODULES . FILENAME_PRODUCT_LISTING);
 ?>
-        </td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_ADVANCED_SEARCH, tep_get_all_get_params(array('sort', 'page')), 'NONSSL', true, false) . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  <br />
+
+  <div class="buttonSet">
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_ADVANCED_SEARCH, tep_get_all_get_params(array('sort', 'page')), 'NONSSL', true, false)); ?>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_confirmation.php 2.3.1.src/checkout_confirmation.php
--- 2.2rc2a.cp.src/checkout_confirmation.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_confirmation.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_confirmation.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -52,7 +52,7 @@
 
   $payment_modules->update_status();
 
-  if ( ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
+  if ( ($payment_modules->selected_module != $payment) || ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
     tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(ERROR_NO_PAYMENT_MODULE_SELECTED), 'SSL'));
   }
 
@@ -86,32 +86,12 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2);
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if (isset($$payment->form_action_url)) {
     $form_action_url = $$payment->form_action_url;
@@ -121,69 +101,73 @@
 
   echo tep_draw_form('checkout_confirmation', $form_action_url, 'post');
 ?>
-        <table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_confirmation.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<div class="contentContainer">
+  <h2><?php echo HEADING_SHIPPING_INFORMATION; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
+
 <?php
   if ($sendto != false) {
 ?>
-            <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo '<b>' . HEADING_DELIVERY_ADDRESS . '</b> <a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, ' ', '<br>'); ?></td>
-              </tr>
+
+        <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+          <tr>
+            <td><?php echo '<strong>' . HEADING_DELIVERY_ADDRESS . '</strong> <a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+          </tr>
+          <tr>
+            <td><?php echo tep_address_format($order->delivery['format_id'], $order->delivery, 1, ' ', '<br />'); ?></td>
+          </tr>
+
 <?php
     if ($order->info['shipping_method']) {
 ?>
-              <tr>
-                <td class="main"><?php echo '<b>' . HEADING_SHIPPING_METHOD . '</b> <a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo $order->info['shipping_method']; ?></td>
-              </tr>
+
+          <tr>
+            <td><?php echo '<strong>' . HEADING_SHIPPING_METHOD . '</strong> <a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+          </tr>
+          <tr>
+            <td><?php echo $order->info['shipping_method']; ?></td>
+          </tr>
 <?php
     }
 ?>
-            </table></td>
+
+        </table></td>
+
 <?php
   }
 ?>
-            <td width="<?php echo (($sendto != false) ? '70%' : '100%'); ?>" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+        <td width="<?php echo (($sendto != false) ? '70%' : '100%'); ?>" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
   if (sizeof($order->info['tax_groups']) > 1) {
 ?>
-                  <tr>
-                    <td class="main" colspan="2"><?php echo '<b>' . HEADING_PRODUCTS . '</b> <a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-                    <td class="smallText" align="right"><b><?php echo HEADING_TAX; ?></b></td>
-                    <td class="smallText" align="right"><b><?php echo HEADING_TOTAL; ?></b></td>
-                  </tr>
+
+          <tr>
+            <td colspan="2"><?php echo '<strong>' . HEADING_PRODUCTS . '</strong> <a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+            <td align="right"><strong><?php echo HEADING_TAX; ?></strong></td>
+            <td align="right"><strong><?php echo HEADING_TOTAL; ?></strong></td>
+          </tr>
+
 <?php
   } else {
 ?>
-                  <tr>
-                    <td class="main" colspan="3"><?php echo '<b>' . HEADING_PRODUCTS . '</b> <a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-                  </tr>
+
+          <tr>
+            <td colspan="3"><?php echo '<strong>' . HEADING_PRODUCTS . '</strong> <a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+          </tr>
+
 <?php
   }
 
   for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
     echo '          <tr>' . "\n" .
-         '            <td class="main" align="right" valign="top" width="30">' . $order->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
-         '            <td class="main" valign="top">' . $order->products[$i]['name'];
+         '            <td align="right" valign="top" width="30">' . $order->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
+         '            <td valign="top">' . $order->products[$i]['name'];
 
     if (STOCK_CHECK == 'true') {
       echo tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty']);
@@ -191,194 +175,141 @@
 
     if ( (isset($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0) ) {
       for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
-        echo '<br><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></small></nobr>';
+        echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></small></nobr>';
       }
     }
 
     echo '</td>' . "\n";
 
-    if (sizeof($order->info['tax_groups']) > 1) echo '            <td class="main" valign="top" align="right">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n";
+    if (sizeof($order->info['tax_groups']) > 1) echo '            <td valign="top" align="right">' . tep_display_tax_value($order->products[$i]['tax']) . '%</td>' . "\n";
 
-    echo '            <td class="main" align="right" valign="top">' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . '</td>' . "\n" .
+    echo '            <td align="right" valign="top">' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . '</td>' . "\n" .
          '          </tr>' . "\n";
   }
 ?>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
+
         </table></td>
       </tr>
+    </table>
+  </div>
+
+  <h2><?php echo HEADING_BILLING_INFORMATION; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo HEADING_BILLING_INFORMATION; ?></b></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo '<b>' . HEADING_BILLING_ADDRESS . '</b> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, ' ', '<br>'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo '<b>' . HEADING_PAYMENT_METHOD . '</b> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo $order->info['payment_method']; ?></td>
-              </tr>
-            </table></td>
-            <td width="70%" valign="top" align="right"><table border="0" cellspacing="0" cellpadding="2">
+        <td width="30%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+          <tr>
+            <td><?php echo '<strong>' . HEADING_BILLING_ADDRESS . '</strong> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+          </tr>
+          <tr>
+            <td><?php echo tep_address_format($order->billing['format_id'], $order->billing, 1, ' ', '<br />'); ?></td>
+          </tr>
+          <tr>
+            <td><?php echo '<strong>' . HEADING_PAYMENT_METHOD . '</strong> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
+          </tr>
+          <tr>
+            <td><?php echo $order->info['payment_method']; ?></td>
+          </tr>
+        </table></td>
+        <td width="70%" valign="top" align="right"><table border="0" cellspacing="0" cellpadding="2">
+
 <?php
   if (MODULE_ORDER_TOTAL_INSTALLED) {
     echo $order_total_modules->output();
   }
 ?>
-            </table></td>
-          </tr>
+
         </table></td>
       </tr>
+    </table>
+  </div>
+
 <?php
   if (is_array($payment_modules->modules)) {
     if ($confirmation = $payment_modules->confirmation()) {
 ?>
+
+  <h2><?php echo HEADING_PAYMENT_INFORMATION; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="0" cellpadding="2">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo HEADING_PAYMENT_INFORMATION; ?></b></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td colspan="4"><?php echo $confirmation['title']; ?></td>
       </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main" colspan="4"><?php echo $confirmation['title']; ?></td>
-              </tr>
+
 <?php
       for ($i=0, $n=sizeof($confirmation['fields']); $i<$n; $i++) {
 ?>
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo $confirmation['fields'][$i]['title']; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo $confirmation['fields'][$i]['field']; ?></td>
-              </tr>
+
+      <tr>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
+        <td class="main"><?php echo $confirmation['fields'][$i]['title']; ?></td>
+        <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
+        <td class="main"><?php echo $confirmation['fields'][$i]['field']; ?></td>
+      </tr>
+
 <?php
       }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+    </table>
+  </div>
+
 <?php
     }
   }
-?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+
   if (tep_not_null($order->info['comments'])) {
 ?>
-      <tr>
-        <td class="main"><?php echo '<b>' . HEADING_ORDER_COMMENTS . '</b> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo nl2br(tep_output_string_protected($order->info['comments'])) . tep_draw_hidden_field('comments', $order->info['comments']); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+  <h2><?php echo '<strong>' . HEADING_ORDER_COMMENTS . '</strong> <a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '"><span class="orderEdit">(' . TEXT_EDIT . ')</span></a>'; ?></h2>
+
+  <div class="contentText">
+    <?php echo nl2br(tep_output_string_protected($order->info['comments'])) . tep_draw_hidden_field('comments', $order->info['comments']); ?>
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td align="right" class="main">
+
+  <div class="contentText">
+    <div style="float: left; width: 60%; padding-top: 5px; padding-left: 15%;">
+      <div id="coProgressBar" style="height: 5px;"></div>
+
+      <table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <tr>
+          <td align="center" width="33%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_PAYMENT . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
+        </tr>
+      </table>
+    </div>
+
+    <div style="float: right;">
+
 <?php
   if (is_array($payment_modules->modules)) {
     echo $payment_modules->process_button();
   }
 
-  echo tep_image_submit('button_confirm_order.gif', IMAGE_BUTTON_CONFIRM_ORDER) . "\n";
+  echo tep_draw_button(IMAGE_BUTTON_CONFIRM_ORDER, 'check', null, 'primary');
+?>
+
+    </div>
+  </div>
+
+</div>
+
+<script type="text/javascript">
+$('#coProgressBar').progressbar({
+  value: 100
+});
+</script>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-            </td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_PAYMENT . '</a>'; ?></td>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_payment_address.php 2.3.1.src/checkout_payment_address.php
--- 2.2rc2a.cp.src/checkout_payment_address.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_payment_address.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_payment_address.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -28,7 +28,7 @@
 
   $error = false;
   $process = false;
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'submit')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'submit') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
 // process a new billing address
     if (tep_not_null($HTTP_POST_VARS['firstname']) && tep_not_null($HTTP_POST_VARS['lastname']) && tep_not_null($HTTP_POST_VARS['street_address'])) {
       $process = true;
@@ -166,7 +166,7 @@
 
       $billto = $HTTP_POST_VARS['address'];
 
-      $check_address_query = tep_db_query("select count(*) as total from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . $customer_id . "' and address_book_id = '" . $billto . "'");
+      $check_address_query = tep_db_query("select count(*) as total from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' and address_book_id = '" . (int)$billto . "'");
       $check_address = tep_db_fetch_array($check_address_query);
 
       if ($check_address['total'] == '1') {
@@ -193,15 +193,11 @@
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL'));
 
   $addresses_count = tep_count_customer_address_book_entries();
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 var selected;
 
 function selectRowEffect(object, buttonSelect) {
@@ -248,263 +244,143 @@
 }
 //--></script>
 <?php require(DIR_WS_INCLUDES . 'form_check.js.php'); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL'), 'post', 'onSubmit="return check_form_optional(checkout_address);"'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_payment.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('checkout_address') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('checkout_address'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('checkout_address');
   }
+?>
+
+<?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL'), 'post', 'onsubmit="return check_form_optional(checkout_address);"', true); ?>
 
+<div class="contentContainer">
+
+<?php
   if ($process == false) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_PAYMENT_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECTED_PAYMENT_DESTINATION; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><?php echo '<b>' . TITLE_PAYMENT_ADDRESS . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $billto, true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+  <h2><?php echo TABLE_HEADING_PAYMENT_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style="float: right;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo TITLE_PAYMENT_ADDRESS; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo tep_address_label($customer_id, $billto, true, ' ', '<br />'); ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_SELECTED_PAYMENT_DESTINATION; ?>
+  </div>
+
+  <div style="clear: both;"></div>
+
 <?php
     if ($addresses_count > 1) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_ADDRESS_BOOK_ENTRIES; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECT_OTHER_PAYMENT_DESTINATION; ?></td>
-                <td class="main" width="50%" valign="top" align="right"><?php echo '<b>' . TITLE_PLEASE_SELECT . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_east_south.gif'); ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <h2><?php echo TABLE_HEADING_ADDRESS_BOOK_ENTRIES; ?></h2>
+
+  <div class="contentText">
+    <div style="float: right;">
+      <?php echo '<strong>' . TITLE_PLEASE_SELECT . '</strong>'; ?>
+    </div>
+
+    <?php echo TEXT_SELECT_OTHER_PAYMENT_DESTINATION; ?>
+  </div>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
       $radio_buttons = 0;
 
       $addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . $customer_id . "'");
       while ($addresses = tep_db_fetch_array($addresses_query)) {
         $format_id = tep_get_address_format_id($addresses['country_id']);
-?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-<?php
+
        if ($addresses['address_book_id'] == $billto) {
-          echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+          echo '      <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
         } else {
-          echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+          echo '      <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
         }
 ?>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="2"><b><?php echo $addresses['firstname'] . ' ' . $addresses['lastname']; ?></b></td>
-                    <td class="main" align="right"><?php echo tep_draw_radio_field('address', $addresses['address_book_id'], ($addresses['address_book_id'] == $billto)); ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td colspan="3"><table border="0" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo tep_address_format($format_id, $addresses, true, ' ', ', '); ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+        <td><strong><?php echo $addresses['firstname'] . ' ' . $addresses['lastname']; ?></strong></td>
+        <td align="right"><?php echo tep_draw_radio_field('address', $addresses['address_book_id'], ($addresses['address_book_id'] == $billto)); ?></td>
+      </tr>
+      <tr>
+        <td colspan="2" style="padding-left: 15px;"><?php echo tep_address_format($format_id, $addresses, true, ' ', ', '); ?></td>
+      </tr>
+
 <?php
         $radio_buttons++;
       }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+    </table>
+  </div>
+
 <?php
     }
   }
 
   if ($addresses_count < MAX_ADDRESS_BOOK_ENTRIES) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_NEW_PAYMENT_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="100%" valign="top"><?php echo TEXT_CREATE_NEW_PAYMENT_ADDRESS; ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td><?php require(DIR_WS_MODULES . 'checkout_new_address.php'); ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <h2><?php echo TABLE_HEADING_NEW_PAYMENT_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <?php echo TEXT_CREATE_NEW_PAYMENT_ADDRESS; ?>
+  </div>
+
+  <?php require(DIR_WS_MODULES . 'checkout_new_address.php'); ?>
+
 <?php
   }
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo '<b>' . TITLE_CONTINUE_CHECKOUT_PROCEDURE . '</b><br>' . TEXT_CONTINUE_CHECKOUT_PROCEDURE; ?></td>
-                <td class="main" align="right"><?php echo tep_draw_hidden_field('action', 'submit') . tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <div class="contentText">
+    <div style="float: left; width: 60%; padding-top: 5px; padding-left: 15%;">
+      <div id="coProgressBar" style="height: 5px;"></div>
+
+      <table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <tr>
+          <td align="center" width="33%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarCurrent"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL') . '" class="checkoutBarCurrent">' . CHECKOUT_BAR_PAYMENT . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
+        </tr>
+      </table>
+    </div>
+
+    <div style="float: right;"><?php echo tep_draw_hidden_field('action', 'submit') . tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></div>
+  </div>
+
+<script type="text/javascript">
+$('#coProgressBar').progressbar({
+  value: 66
+});
+</script>
+
 <?php
   if ($process == true) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-      </tr>
+
+  <div class="contentText">
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL')); ?>
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_payment.php 2.3.1.src/checkout_payment.php
--- 2.2rc2a.cp.src/checkout_payment.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_payment.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_payment.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -82,15 +82,11 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 var selected;
 
 function selectRowEffect(object, buttonSelect) {
@@ -123,141 +119,91 @@
 }
 //--></script>
 <?php echo $payment_modules->javascript_validation(); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('checkout_payment', tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'), 'post', 'onsubmit="return check_form();"'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_payment.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<?php echo tep_draw_form('checkout_payment', tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'), 'post', 'onsubmit="return check_form();"', true); ?>
+
+<div class="contentContainer">
+
 <?php
   if (isset($HTTP_GET_VARS['payment_error']) && is_object(${$HTTP_GET_VARS['payment_error']}) && ($error = ${$HTTP_GET_VARS['payment_error']}->get_error())) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo tep_output_string_protected($error['title']); ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBoxNotice">
-          <tr class="infoBoxNoticeContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="100%" valign="top"><?php echo tep_output_string_protected($error['error']); ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+  <div class="contentText">
+    <?php echo '<strong>' . tep_output_string_protected($error['title']) . '</strong>'; ?>
+
+    <p class="messageStackError"><?php echo tep_output_string_protected($error['error']); ?></p>
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_BILLING_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECTED_BILLING_DESTINATION; ?><br><br><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL') . '">' . tep_image_button('button_change_address.gif', IMAGE_BUTTON_CHANGE_ADDRESS) . '</a>'; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><b><?php echo TITLE_BILLING_ADDRESS; ?></b><br><?php echo tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $billto, true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_PAYMENT_METHOD; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+  <h2><?php echo TABLE_HEADING_BILLING_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style="float: right;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo TITLE_BILLING_ADDRESS; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo tep_address_label($customer_id, $billto, true, ' ', '<br />'); ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_SELECTED_BILLING_DESTINATION; ?><br /><br /><?php echo tep_draw_button(IMAGE_BUTTON_CHANGE_ADDRESS, 'home', tep_href_link(FILENAME_CHECKOUT_PAYMENT_ADDRESS, '', 'SSL')); ?>
+  </div>
+
+  <div style="clear: both;"></div>
+
+  <h2><?php echo TABLE_HEADING_PAYMENT_METHOD; ?></h2>
+
 <?php
   $selection = $payment_modules->selection();
 
   if (sizeof($selection) > 1) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECT_PAYMENT_METHOD; ?></td>
-                <td class="main" width="50%" valign="top" align="right"><b><?php echo TITLE_PLEASE_SELECT; ?></b><br><?php echo tep_image(DIR_WS_IMAGES . 'arrow_east_south.gif'); ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <div style="float: right;">
+      <?php echo '<strong>' . TITLE_PLEASE_SELECT . '</strong>'; ?>
+    </div>
+
+    <?php echo TEXT_SELECT_PAYMENT_METHOD; ?>
+  </div>
+
 <?php
-  } else {
+    } elseif ($free_shipping == false) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="100%" colspan="2"><?php echo TEXT_ENTER_PAYMENT_INFORMATION; ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <?php echo TEXT_ENTER_PAYMENT_INFORMATION; ?>
+  </div>
+
 <?php
-  }
+    }
+?>
+
+  <div class="contentText">
 
+<?php
   $radio_buttons = 0;
   for ($i=0, $n=sizeof($selection); $i<$n; $i++) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
     if ( ($selection[$i]['id'] == $payment) || ($n == 1) ) {
-      echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+      echo '      <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
     } else {
-      echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+      echo '      <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
     }
 ?>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="3"><b><?php echo $selection[$i]['module']; ?></b></td>
-                    <td class="main" align="right">
+
+        <td><strong><?php echo $selection[$i]['module']; ?></strong></td>
+        <td align="right">
+
 <?php
     if (sizeof($selection) > 1) {
       echo tep_draw_radio_field('payment', $selection[$i]['id'], ($selection[$i]['id'] == $payment));
@@ -265,141 +211,86 @@
       echo tep_draw_hidden_field('payment', $selection[$i]['id']);
     }
 ?>
-                    </td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+        </td>
+      </tr>
+
 <?php
     if (isset($selection[$i]['error'])) {
 ?>
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="4"><?php echo $selection[$i]['error']; ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+      <tr>
+        <td colspan="2"><?php echo $selection[$i]['error']; ?></td>
+      </tr>
+
 <?php
     } elseif (isset($selection[$i]['fields']) && is_array($selection[$i]['fields'])) {
 ?>
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td colspan="4"><table border="0" cellspacing="0" cellpadding="2">
+
+      <tr>
+        <td colspan="2"><table border="0" cellspacing="0" cellpadding="2">
+
 <?php
       for ($j=0, $n2=sizeof($selection[$i]['fields']); $j<$n2; $j++) {
 ?>
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo $selection[$i]['fields'][$j]['title']; ?></td>
-                        <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo $selection[$i]['fields'][$j]['field']; ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
+
+          <tr>
+            <td><?php echo $selection[$i]['fields'][$j]['title']; ?></td>
+            <td><?php echo $selection[$i]['fields'][$j]['field']; ?></td>
+          </tr>
+
 <?php
       }
 ?>
-                    </table></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+        </table></td>
+      </tr>
+
 <?php
     }
 ?>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+    </table>
+
 <?php
     $radio_buttons++;
   }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_COMMENTS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_textarea_field('comments', 'soft', '60', '5', $comments); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><b><?php echo TITLE_CONTINUE_CHECKOUT_PROCEDURE . '</b><br>' . TEXT_CONTINUE_CHECKOUT_PROCEDURE; ?></td>
-                <td class="main" align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  </div>
+
+  <h2><?php echo TABLE_HEADING_COMMENTS; ?></h2>
+
+  <div class="contentText">
+    <?php echo tep_draw_textarea_field('comments', 'soft', '60', '5', $comments); ?>
+  </div>
+
+  <div class="contentText">
+    <div style="float: left; width: 60%; padding-top: 5px; padding-left: 15%;">
+      <div id="coProgressBar" style="height: 5px;"></div>
+
+      <table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <tr>
+          <td align="center" width="33%" class="checkoutBarFrom"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarFrom">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
+        </tr>
+      </table>
+    </div>
+
+    <div style="float: right;"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></div>
+  </div>
+</div>
+
+<script type="text/javascript">
+$('#coProgressBar').progressbar({
+  value: 66
+});
+</script>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_process.php 2.3.1.src/checkout_process.php
--- 2.2rc2a.cp.src/checkout_process.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_process.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_process.php 1750 2007-12-21 05:20:28Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -68,7 +68,7 @@
 
   $payment_modules->update_status();
 
-  if ( ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
+  if ( ($payment_modules->selected_module != $payment) || ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
     tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(ERROR_NO_PAYMENT_MODULE_SELECTED), 'SSL'));
   }
 
@@ -141,8 +141,6 @@
 
 // initialized for the email confirmation
   $products_ordered = '';
-  $subtotal = 0;
-  $total_tax = 0;
 
   for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
 // Stock Update - Joao Correia
@@ -238,10 +236,6 @@
       }
     }
 //------insert customer choosen option eof ----
-    $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
-    $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
-    $total_cost += $total_products_price;
-
     $products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";
   }
 
@@ -277,7 +271,7 @@
                     EMAIL_SEPARATOR . "\n";
     $payment_class = $$payment;
     $email_order .= $order->info['payment_method'] . "\n\n";
-    if ($payment_class->email_footer) { 
+    if (isset($payment_class->email_footer)) {
       $email_order .= $payment_class->email_footer . "\n\n";
     }
   }
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_shipping_address.php 2.3.1.src/checkout_shipping_address.php
--- 2.2rc2a.cp.src/checkout_shipping_address.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_shipping_address.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_shipping_address.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -41,7 +41,7 @@
 
   $error = false;
   $process = false;
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'submit')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'submit') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
 // process a new shipping address
     if (tep_not_null($HTTP_POST_VARS['firstname']) && tep_not_null($HTTP_POST_VARS['lastname']) && tep_not_null($HTTP_POST_VARS['street_address'])) {
       $process = true;
@@ -205,15 +205,11 @@
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL'));
 
   $addresses_count = tep_count_customer_address_book_entries();
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 var selected;
 
 function selectRowEffect(object, buttonSelect) {
@@ -260,257 +256,143 @@
 }
 //--></script>
 <?php require(DIR_WS_INCLUDES . 'form_check.js.php'); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL'), 'post', 'onSubmit="return check_form_optional(checkout_address);"'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_delivery.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('checkout_address') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('checkout_address'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('checkout_address');
   }
+?>
+
+<?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL'), 'post', 'onsubmit="return check_form_optional(checkout_address);"', true); ?>
 
+<div class="contentContainer">
+
+<?php
   if ($process == false) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_SHIPPING_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECTED_SHIPPING_DESTINATION; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><?php echo '<b>' . TITLE_SHIPPING_ADDRESS . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $sendto, true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+  <h2><?php echo TABLE_HEADING_SHIPPING_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style="float: right;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo TITLE_SHIPPING_ADDRESS; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo tep_address_label($customer_id, $sendto, true, ' ', '<br />'); ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_SELECTED_SHIPPING_DESTINATION; ?>
+  </div>
+
+  <div style="clear: both;"></div>
+
 <?php
     if ($addresses_count > 1) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_ADDRESS_BOOK_ENTRIES; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_SELECT_OTHER_SHIPPING_DESTINATION; ?></td>
-                <td class="main" width="50%" valign="top" align="right"><?php echo '<b>' . TITLE_PLEASE_SELECT . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_east_south.gif'); ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <h2><?php echo TABLE_HEADING_ADDRESS_BOOK_ENTRIES; ?></h2>
+
+  <div class="contentText">
+    <div style="float: right;">
+      <?php echo '<strong>' . TITLE_PLEASE_SELECT . '</strong>'; ?>
+    </div>
+
+    <?php echo TEXT_SELECT_OTHER_SHIPPING_DESTINATION; ?>
+  </div>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
       $radio_buttons = 0;
 
       $addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "'");
       while ($addresses = tep_db_fetch_array($addresses_query)) {
         $format_id = tep_get_address_format_id($addresses['country_id']);
-?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-<?php
+
        if ($addresses['address_book_id'] == $sendto) {
-          echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+          echo '      <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
         } else {
-          echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+          echo '      <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
         }
 ?>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="2"><b><?php echo tep_output_string_protected($addresses['firstname'] . ' ' . $addresses['lastname']); ?></b></td>
-                    <td class="main" align="right"><?php echo tep_draw_radio_field('address', $addresses['address_book_id'], ($addresses['address_book_id'] == $sendto)); ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td colspan="3"><table border="0" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo tep_address_format($format_id, $addresses, true, ' ', ', '); ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+        <td><strong><?php echo $addresses['firstname'] . ' ' . $addresses['lastname']; ?></strong></td>
+        <td align="right"><?php echo tep_draw_radio_field('address', $addresses['address_book_id'], ($addresses['address_book_id'] == $sendto)); ?></td>
+      </tr>
+      <tr>
+        <td colspan="2" style="padding-left: 15px;"><?php echo tep_address_format($format_id, $addresses, true, ' ', ', '); ?></td>
+      </tr>
+
 <?php
         $radio_buttons++;
       }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+    </table>
+  </div>
+
 <?php
     }
   }
 
   if ($addresses_count < MAX_ADDRESS_BOOK_ENTRIES) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_NEW_SHIPPING_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="100%" valign="top"><?php echo TEXT_CREATE_NEW_SHIPPING_ADDRESS; ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td><?php require(DIR_WS_MODULES . 'checkout_new_address.php'); ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <h2><?php echo TABLE_HEADING_NEW_SHIPPING_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <?php echo TEXT_CREATE_NEW_SHIPPING_ADDRESS; ?>
+  </div>
+
+  <?php require(DIR_WS_MODULES . 'checkout_new_address.php'); ?>
+
 <?php
   }
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo '<b>' . TITLE_CONTINUE_CHECKOUT_PROCEDURE . '</b><br>' . TEXT_CONTINUE_CHECKOUT_PROCEDURE; ?></td>
-                <td class="main" align="right"><?php echo tep_draw_hidden_field('action', 'submit') . tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  <div class="contentText">
+    <div style="float: left; width: 60%; padding-top: 5px; padding-left: 15%;">
+      <div id="coProgressBar" style="height: 5px;"></div>
+
+      <table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <tr>
+          <td align="center" width="33%" class="checkoutBarCurrent"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '" class="checkoutBarCurrent">' . CHECKOUT_BAR_DELIVERY . '</a>'; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
+        </tr>
+      </table>
+    </div>
+
+    <div style="float: right;"><?php echo tep_draw_hidden_field('action', 'submit') . tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></div>
+  </div>
+
+<script type="text/javascript">
+$('#coProgressBar').progressbar({
+  value: 33
+});
+</script>
+
 <?php
   if ($process == true) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-      </tr>
+
+  <div class="contentText">
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL')); ?>
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_DELIVERY; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_shipping.php 2.3.1.src/checkout_shipping.php
--- 2.2rc2a.cp.src/checkout_shipping.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -95,7 +95,7 @@
   }
 
 // process the selected shipping method
-  if ( isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') ) {
+  if ( isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken) ) {
     if (!tep_session_is_registered('comments')) tep_session_register('comments');
     if (tep_not_null($HTTP_POST_VARS['comments'])) {
       $comments = tep_db_prepare_input($HTTP_POST_VARS['comments']);
@@ -150,15 +150,11 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 var selected;
 
 function selectRowEffect(object, buttonSelect) {
@@ -190,136 +186,90 @@
   if (object.className == 'moduleRowOver') object.className = 'moduleRow';
 }
 //--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL')) . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_delivery.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_SHIPPING_ADDRESS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                <td class="main" width="50%" valign="top"><?php echo TEXT_CHOOSE_SHIPPING_DESTINATION . '<br><br><a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL') . '">' . tep_image_button('button_change_address.gif', IMAGE_BUTTON_CHANGE_ADDRESS) . '</a>'; ?></td>
-                <td align="right" width="50%" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main" align="center" valign="top"><?php echo '<b>' . TITLE_SHIPPING_ADDRESS . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_south_east.gif'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                    <td class="main" valign="top"><?php echo tep_address_label($customer_id, $sendto, true, ' ', '<br>'); ?></td>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<?php echo tep_draw_form('checkout_address', tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'), 'post', '', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <h2><?php echo TABLE_HEADING_SHIPPING_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style="float: right;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo TITLE_SHIPPING_ADDRESS; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo tep_address_label($customer_id, $sendto, true, ' ', '<br />'); ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_CHOOSE_SHIPPING_DESTINATION; ?><br /><br /><?php echo tep_draw_button(IMAGE_BUTTON_CHANGE_ADDRESS, 'home', tep_href_link(FILENAME_CHECKOUT_SHIPPING_ADDRESS, '', 'SSL')); ?>
+  </div>
+
+  <div style="clear: both;"></div>
+
 <?php
   if (tep_count_shipping_modules() > 0) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_SHIPPING_METHOD; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+  <h2><?php echo TABLE_HEADING_SHIPPING_METHOD; ?></h2>
+
 <?php
     if (sizeof($quotes) > 1 && sizeof($quotes[0]) > 1) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="50%" valign="top"><?php echo TEXT_CHOOSE_SHIPPING_METHOD; ?></td>
-                <td class="main" width="50%" valign="top" align="right"><?php echo '<b>' . TITLE_PLEASE_SELECT . '</b><br>' . tep_image(DIR_WS_IMAGES . 'arrow_east_south.gif'); ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <div style="float: right;">
+      <?php echo '<strong>' . TITLE_PLEASE_SELECT . '</strong>'; ?>
+    </div>
+
+    <?php echo TEXT_CHOOSE_SHIPPING_METHOD; ?>
+  </div>
+
 <?php
     } elseif ($free_shipping == false) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main" width="100%" colspan="2"><?php echo TEXT_ENTER_SHIPPING_INFORMATION; ?></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <?php echo TEXT_ENTER_SHIPPING_INFORMATION; ?>
+  </div>
+
 <?php
     }
+?>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
 
+<?php
     if ($free_shipping == true) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td colspan="2" width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="3"><b><?php echo FREE_SHIPPING_TITLE; ?></b>&nbsp;<?php echo $quotes[$i]['icon']; ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 0)">
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" width="100%"><?php echo sprintf(FREE_SHIPPING_DESCRIPTION, $currencies->format(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER)) . tep_draw_hidden_field('shipping', 'free_free'); ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-              </tr>
+
+      <tr>
+        <td><strong><?php echo FREE_SHIPPING_TITLE; ?></strong>&nbsp;<?php echo $quotes[$i]['icon']; ?></td>
+      </tr>
+      <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, 0)">
+        <td style="padding-left: 15px;"><?php echo sprintf(FREE_SHIPPING_DESCRIPTION, $currencies->format(MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER)) . tep_draw_hidden_field('shipping', 'free_free'); ?></td>
+      </tr>
+
 <?php
     } else {
       $radio_buttons = 0;
       for ($i=0, $n=sizeof($quotes); $i<$n; $i++) {
 ?>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="3"><b><?php echo $quotes[$i]['module']; ?></b>&nbsp;<?php if (isset($quotes[$i]['icon']) && tep_not_null($quotes[$i]['icon'])) { echo $quotes[$i]['icon']; } ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+      <tr>
+        <td colspan="3"><strong><?php echo $quotes[$i]['module']; ?></strong>&nbsp;<?php if (isset($quotes[$i]['icon']) && tep_not_null($quotes[$i]['icon'])) { echo $quotes[$i]['icon']; } ?></td>
+      </tr>
+
 <?php
         if (isset($quotes[$i]['error'])) {
 ?>
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" colspan="3"><?php echo $quotes[$i]['error']; ?></td>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+      <tr>
+        <td colspan="3"><?php echo $quotes[$i]['error']; ?></td>
+      </tr>
+
 <?php
         } else {
           for ($j=0, $n2=sizeof($quotes[$i]['methods']); $j<$n2; $j++) {
@@ -327,128 +277,80 @@
             $checked = (($quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'] == $shipping['id']) ? true : false);
 
             if ( ($checked == true) || ($n == 1 && $n2 == 1) ) {
-              echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+              echo '      <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
             } else {
-              echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
+              echo '      <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
             }
 ?>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td class="main" width="75%"><?php echo $quotes[$i]['methods'][$j]['title']; ?></td>
+
+        <td width="75%" style="padding-left: 15px;"><?php echo $quotes[$i]['methods'][$j]['title']; ?></td>
+
 <?php
             if ( ($n > 1) || ($n2 > 1) ) {
 ?>
-                    <td class="main"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], (isset($quotes[$i]['tax']) ? $quotes[$i]['tax'] : 0))); ?></td>
-                    <td class="main" align="right"><?php echo tep_draw_radio_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'], $checked); ?></td>
+
+        <td><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], (isset($quotes[$i]['tax']) ? $quotes[$i]['tax'] : 0))); ?></td>
+        <td align="right"><?php echo tep_draw_radio_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'], $checked); ?></td>
+
 <?php
             } else {
 ?>
-                    <td class="main" align="right" colspan="2"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], $quotes[$i]['tax'])) . tep_draw_hidden_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id']); ?></td>
+
+        <td align="right" colspan="2"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], (isset($quotes[$i]['tax']) ? $quotes[$i]['tax'] : 0))) . tep_draw_hidden_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id']); ?></td>
+
 <?php
             }
 ?>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
+
+      </tr>
+
 <?php
             $radio_buttons++;
           }
         }
-?>
-                </table></td>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
-              </tr>
-<?php
       }
     }
 ?>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+    </table>
+  </div>
+
 <?php
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo TABLE_HEADING_COMMENTS; ?></b></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_textarea_field('comments', 'soft', '60', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo '<b>' . TITLE_CONTINUE_CHECKOUT_PROCEDURE . '</b><br>' . TEXT_CONTINUE_CHECKOUT_PROCEDURE; ?></td>
-                <td class="main" align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_DELIVERY; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  <h2><?php echo TABLE_HEADING_COMMENTS; ?></h2>
+
+  <div class="contentText">
+    <?php echo tep_draw_textarea_field('comments', 'soft', '60', '5'); ?>
+  </div>
+
+  <div class="contentText">
+    <div style="float: left; width: 60%; padding-top: 5px; padding-left: 15%;">
+      <div id="coProgressBar" style="height: 5px;"></div>
+
+      <table border="0" width="100%" cellspacing="0" cellpadding="2">
+        <tr>
+          <td align="center" width="33%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_DELIVERY; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
+          <td align="center" width="33%" class="checkoutBarTo"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
+        </tr>
+      </table>
+    </div>
+
+    <div style="float: right;"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></div>
+  </div>
+</div>
+
+<script type="text/javascript">
+$('#coProgressBar').progressbar({
+  value: 33
+});
+</script>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/checkout_success.php 2.3.1.src/checkout_success.php
--- 2.2rc2a.cp.src/checkout_success.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/checkout_success.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_success.php 1749 2007-12-21 04:23:36Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -60,107 +60,59 @@
                                 'text' => $products['products_name']);
     }
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('order', tep_href_link(FILENAME_CHECKOUT_SUCCESS, 'action=update', 'SSL')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="4" cellpadding="2">
-          <tr>
-            <td valign="top"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_man_on_board.gif', HEADING_TITLE); ?></td>
-            <td valign="top" class="main"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?><div align="center" class="pageHeading"><?php echo HEADING_TITLE; ?></div><br><?php echo TEXT_SUCCESS; ?><br><br>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<?php echo tep_draw_form('order', tep_href_link(FILENAME_CHECKOUT_SUCCESS, 'action=update', 'SSL')); ?>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_SUCCESS; ?>
+  </div>
+
+  <div class="contentText">
+
 <?php
   if ($global['global_product_notifications'] != '1') {
-    echo TEXT_NOTIFY_PRODUCTS . '<br><p class="productsNotifications">';
+    echo TEXT_NOTIFY_PRODUCTS . '<br /><p class="productsNotifications">';
 
     $products_displayed = array();
     for ($i=0, $n=sizeof($products_array); $i<$n; $i++) {
       if (!in_array($products_array[$i]['id'], $products_displayed)) {
-        echo tep_draw_checkbox_field('notify[]', $products_array[$i]['id']) . ' ' . $products_array[$i]['text'] . '<br>';
+        echo tep_draw_checkbox_field('notify[]', $products_array[$i]['id']) . ' ' . $products_array[$i]['text'] . '<br />';
         $products_displayed[] = $products_array[$i]['id'];
       }
     }
 
     echo '</p>';
-  } else {
-    echo TEXT_SEE_ORDERS . '<br><br>' . TEXT_CONTACT_STORE_OWNER;
   }
+
+  echo TEXT_SEE_ORDERS . '<br /><br />' . TEXT_CONTACT_STORE_OWNER;
+?>
+
+  </div>
+
+  <div class="contentText">
+    <h3><?php echo TEXT_THANKS_FOR_SHOPPING; ?></h3>
+  </div>
+
+<?php
+  if (DOWNLOAD_ENABLED == 'true') {
+    include(DIR_WS_MODULES . 'downloads.php');
+  }
+?>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-            <h3><?php echo TEXT_THANKS_FOR_SHOPPING; ?></h3></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td align="right" class="main"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%" align="right"><?php echo tep_draw_separator('pixel_silver.gif', '1', '5'); ?></td>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-              </tr>
-            </table></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-            <td width="25%"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-              <tr>
-                <td width="50%"><?php echo tep_draw_separator('pixel_silver.gif', '100%', '1'); ?></td>
-                <td width="50%"><?php echo tep_image(DIR_WS_IMAGES . 'checkout_bullet.gif'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo CHECKOUT_BAR_DELIVERY; ?></td>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo CHECKOUT_BAR_PAYMENT; ?></td>
-            <td align="center" width="25%" class="checkoutBarFrom"><?php echo CHECKOUT_BAR_CONFIRMATION; ?></td>
-            <td align="center" width="25%" class="checkoutBarCurrent"><?php echo CHECKOUT_BAR_FINISHED; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-<?php if (DOWNLOAD_ENABLED == 'true') include(DIR_WS_MODULES . 'downloads.php'); ?>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/conditions.php 2.3.1.src/conditions.php
--- 2.2rc2a.cp.src/conditions.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/conditions.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: conditions.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,75 +15,23 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CONDITIONS);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_CONDITIONS));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_INFORMATION; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><?php echo TEXT_INFORMATION; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/contact_us.php 2.3.1.src/contact_us.php
--- 2.2rc2a.cp.src/contact_us.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/contact_us.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: contact_us.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -14,155 +14,96 @@
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CONTACT_US);
 
-  $error = false;
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'send')) {
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'send') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
+    $error = false;
+
     $name = tep_db_prepare_input($HTTP_POST_VARS['name']);
     $email_address = tep_db_prepare_input($HTTP_POST_VARS['email']);
     $enquiry = tep_db_prepare_input($HTTP_POST_VARS['enquiry']);
 
-    if (tep_validate_email($email_address)) {
-      tep_mail(STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS, EMAIL_SUBJECT, $enquiry, $name, $email_address);
-
-      tep_redirect(tep_href_link(FILENAME_CONTACT_US, 'action=success'));
-    } else {
+    if (!tep_validate_email($email_address)) {
       $error = true;
 
       $messageStack->add('contact', ENTRY_EMAIL_ADDRESS_CHECK_ERROR);
     }
+
+    $actionRecorder = new actionRecorder('ar_contact_us', (tep_session_is_registered('customer_id') ? $customer_id : null), $name);
+    if (!$actionRecorder->canPerform()) {
+      $error = true;
+
+      $actionRecorder->record(false);
+
+      $messageStack->add('contact', sprintf(ERROR_ACTION_RECORDER, (defined('MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES') ? (int)MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES : 15)));
+    }
+
+    if ($error == false) {
+      tep_mail(STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS, EMAIL_SUBJECT, $enquiry, $name, $email_address);
+
+      $actionRecorder->record();
+
+      tep_redirect(tep_href_link(FILENAME_CONTACT_US, 'action=success'));
+    }
   }
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_CONTACT_US));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('contact_us', tep_href_link(FILENAME_CONTACT_US, 'action=send')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_contact_us.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('contact') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('contact'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('contact');
   }
 
   if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'success')) {
 ?>
-      <tr>
-        <td class="main" align="center"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_man_on_board.gif', HEADING_TITLE, '0', '0', 'align="left"') . TEXT_SUCCESS; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_SUCCESS; ?>
+  </div>
+
+  <div style="float: right;">
+    <?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?>
+  </div>
+</div>
+
 <?php
   } else {
 ?>
+
+<?php echo tep_draw_form('contact_us', tep_href_link(FILENAME_CONTACT_US, 'action=send'), 'post', '', true); ?>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_NAME; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_draw_input_field('name'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_EMAIL; ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo tep_draw_input_field('email'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_ENQUIRY; ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_textarea_field('enquiry', 'soft', 50, 15); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey"><?php echo ENTRY_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('name'); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_EMAIL; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('email'); ?></td>
       </tr>
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey" valign="top"><?php echo ENTRY_ENQUIRY; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_textarea_field('enquiry', 'soft', 50, 15); ?></td>
       </tr>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+  </div>
+</div>
+
+</form>
+
 <?php
   }
+
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/cookie_usage.php 2.3.1.src/cookie_usage.php
--- 2.2rc2a.cp.src/cookie_usage.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/cookie_usage.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: cookie_usage.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,82 +15,31 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_COOKIE_USAGE);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_COOKIE_USAGE));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style=" width: 40%; float: right; padding: 0 0 10px 10px;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo BOX_INFORMATION_HEADING; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo BOX_INFORMATION; ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_INFORMATION; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><table border="0" width="40%" cellspacing="0" cellpadding="0" align="right">
-          <tr>
-            <td><?php new infoBoxHeading(array(array('text' => BOX_INFORMATION_HEADING))); ?></td>
-          </tr>
-          <tr>
-            <td><?php new infoBox(array(array('text' => BOX_INFORMATION))); ?></td>
-          </tr>
-        </table><?php echo TEXT_INFORMATION; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/create_account.php 2.3.1.src/create_account.php
--- 2.2rc2a.cp.src/create_account.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/create_account.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: create_account.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -16,7 +16,7 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CREATE_ACCOUNT);
 
   $process = false;
-  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process')) {
+  if (isset($HTTP_POST_VARS['action']) && ($HTTP_POST_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $process = true;
 
     if (ACCOUNT_GENDER == 'true') {
@@ -77,7 +77,7 @@
     }
 
     if (ACCOUNT_DOB == 'true') {
-      if (checkdate(substr(tep_date_raw($dob), 4, 2), substr(tep_date_raw($dob), 6, 2), substr(tep_date_raw($dob), 0, 4)) == false) {
+      if ((is_numeric(tep_date_raw($dob)) == false) || (@checkdate(substr(tep_date_raw($dob), 4, 2), substr(tep_date_raw($dob), 6, 2), substr(tep_date_raw($dob), 0, 4)) == false)) {
         $error = true;
 
         $messageStack->add('create_account', ENTRY_DATE_OF_BIRTH_ERROR);
@@ -226,6 +226,9 @@
       tep_session_register('customer_country_id');
       tep_session_register('customer_zone_id');
 
+// reset session token
+      $sessiontoken = md5(tep_rand() . tep_rand() . tep_rand() . tep_rand());
+
 // restore cart contents
       $cart->restore_contents();
 
@@ -250,170 +253,131 @@
   }
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+  require('includes/form_check.js.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<?php require('includes/form_check.js.php'); ?>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('create_account', tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL'), 'post', 'onSubmit="return check_form(create_account);"') . tep_draw_hidden_field('action', 'process'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_account.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="smallText"><br><?php echo sprintf(TEXT_ORIGIN_LOGIN, tep_href_link(FILENAME_LOGIN, tep_get_all_get_params(), 'SSL')); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('create_account') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('create_account'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('create_account');
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><b><?php echo CATEGORY_PERSONAL; ?></b></td>
-           <td class="inputRequirement" align="right"><?php echo FORM_REQUIRED_INFORMATION; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
+
+<p><?php echo sprintf(TEXT_ORIGIN_LOGIN, tep_href_link(FILENAME_LOGIN, tep_get_all_get_params(), 'SSL')); ?></p>
+
+<?php echo tep_draw_form('create_account', tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL'), 'post', 'onsubmit="return check_form(create_account);"', true) . tep_draw_hidden_field('action', 'process'); ?>
+
+<div class="contentContainer">
+  <div>
+    <span class="inputRequirement" style="float: right;"><?php echo FORM_REQUIRED_INFORMATION; ?></span>
+    <h2><?php echo CATEGORY_PERSONAL; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
+
 <?php
   if (ACCOUNT_GENDER == 'true') {
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_GENDER; ?></td>
-                <td class="main"><?php echo tep_draw_radio_field('gender', 'm') . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f') . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
-              </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_GENDER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_radio_field('gender', 'm') . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f') . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_FIRST_NAME; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('firstname') . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_LAST_NAME; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('lastname') . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
-              </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_FIRST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('firstname') . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr> 
+        <td class="fieldKey"><?php echo ENTRY_LAST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('lastname') . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_DOB == 'true') {
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_DATE_OF_BIRTH; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('dob') . '&nbsp;' . (tep_not_null(ENTRY_DATE_OF_BIRTH_TEXT) ? '<span class="inputRequirement">' . ENTRY_DATE_OF_BIRTH_TEXT . '</span>': ''); ?></td>
-              </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_DATE_OF_BIRTH; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('dob', '', 'id="dob"') . '&nbsp;' . (tep_not_null(ENTRY_DATE_OF_BIRTH_TEXT) ? '<span class="inputRequirement">' . ENTRY_DATE_OF_BIRTH_TEXT . '</span>': ''); ?><script type="text/javascript">$('#dob').datepicker({dateFormat: '<?php echo JQUERY_DATEPICKER_FORMAT; ?>', changeMonth: true, changeYear: true, yearRange: '-100:+0'});</script></td>
+      </tr>
+
 <?php
   }
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('email_address') . '&nbsp;' . (tep_not_null(ENTRY_EMAIL_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('email_address') . '&nbsp;' . (tep_not_null(ENTRY_EMAIL_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>': ''); ?></td>
       </tr>
+    </table>
+  </div>
+
 <?php
   if (ACCOUNT_COMPANY == 'true') {
 ?>
+
+  <h2><?php echo CATEGORY_COMPANY; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo CATEGORY_COMPANY; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_COMPANY; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('company') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey"><?php echo ENTRY_COMPANY; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('company') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
       </tr>
+    </table>
+  </div>
+
 <?php
   }
 ?>
+
+  <h2><?php echo CATEGORY_ADDRESS; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo CATEGORY_ADDRESS; ?></b></td>
+        <td class="fieldKey"><?php echo ENTRY_STREET_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('street_address') . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
       </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_STREET_ADDRESS; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('street_address') . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
-              </tr>
+
 <?php
   if (ACCOUNT_SUBURB == 'true') {
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_SUBURB; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('suburb') . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
-              </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_SUBURB; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('suburb') . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_POST_CODE; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('postcode') . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_CITY; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('city') . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
-              </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_POST_CODE; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('postcode') . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_CITY; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('city') . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_STATE == 'true') {
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_STATE; ?></td>
-                <td class="main">
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_STATE; ?></td>
+        <td class="fieldValue">
 <?php
     if ($process == true) {
       if ($entry_state_has_zones == true) {
@@ -430,114 +394,64 @@
       echo tep_draw_input_field('state');
     }
 
-    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT;
+    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT . '</span>';
 ?>
-                </td>
-              </tr>
+        </td>
+      </tr>
+
 <?php
   }
 ?>
-              <tr>
-                <td class="main"><?php echo ENTRY_COUNTRY; ?></td>
-                <td class="main"><?php echo tep_get_country_list('country') . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo CATEGORY_CONTACT; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_TELEPHONE_NUMBER; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('telephone') . '&nbsp;' . (tep_not_null(ENTRY_TELEPHONE_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_TELEPHONE_NUMBER_TEXT . '</span>': ''); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_FAX_NUMBER; ?></td>
-                <td class="main"><?php echo tep_draw_input_field('fax') . '&nbsp;' . (tep_not_null(ENTRY_FAX_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_FAX_NUMBER_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo CATEGORY_OPTIONS; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_NEWSLETTER; ?></td>
-                <td class="main"><?php echo tep_draw_checkbox_field('newsletter', '1') . '&nbsp;' . (tep_not_null(ENTRY_NEWSLETTER_TEXT) ? '<span class="inputRequirement">' . ENTRY_NEWSLETTER_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo CATEGORY_PASSWORD; ?></b></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" cellspacing="2" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo ENTRY_PASSWORD; ?></td>
-                <td class="main"><?php echo tep_draw_password_field('password') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_TEXT . '</span>': ''); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo ENTRY_PASSWORD_CONFIRMATION; ?></td>
-                <td class="main"><?php echo tep_draw_password_field('confirmation') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CONFIRMATION_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CONFIRMATION_TEXT . '</span>': ''); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php include(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php include(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_COUNTRY; ?></td>
+        <td class="fieldValue"><?php echo tep_get_country_list('country') . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
+      </tr>
+    </table>
+  </div>
+
+  <h2><?php echo CATEGORY_CONTACT; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_TELEPHONE_NUMBER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('telephone') . '&nbsp;' . (tep_not_null(ENTRY_TELEPHONE_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_TELEPHONE_NUMBER_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_FAX_NUMBER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('fax') . '&nbsp;' . (tep_not_null(ENTRY_FAX_NUMBER_TEXT) ? '<span class="inputRequirement">' . ENTRY_FAX_NUMBER_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_NEWSLETTER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_checkbox_field('newsletter', '1') . '&nbsp;' . (tep_not_null(ENTRY_NEWSLETTER_TEXT) ? '<span class="inputRequirement">' . ENTRY_NEWSLETTER_TEXT . '</span>': ''); ?></td>
+      </tr>
+    </table>
+  </div>
+
+  <h2><?php echo CATEGORY_PASSWORD; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('password') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD_CONFIRMATION; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('confirmation') . '&nbsp;' . (tep_not_null(ENTRY_PASSWORD_CONFIRMATION_TEXT) ? '<span class="inputRequirement">' . ENTRY_PASSWORD_CONFIRMATION_TEXT . '</span>': ''); ?></td>
+      </tr>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'person', null, 'primary'); ?></span>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/create_account_success.php 2.3.1.src/create_account_success.php
--- 2.2rc2a.cp.src/create_account_success.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/create_account_success.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: create_account_success.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -23,79 +23,23 @@
   } else {
     $origin_href = tep_href_link(FILENAME_DEFAULT);
   }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_ACCOUNT_CREATED; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', $origin_href); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td><?php echo tep_image(DIR_WS_IMAGES . 'table_background_man_on_board.gif', HEADING_TITLE); ?></td>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="pageHeading" align="center"><?php echo HEADING_TITLE; ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo TEXT_ACCOUNT_CREATED; ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . $origin_href . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/download.php 2.3.1.src/download.php
--- 2.2rc2a.cp.src/download.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/download.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: download.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/ext/960gs/960_24_col.css 2.3.1.src/ext/960gs/960_24_col.css
--- 2.2rc2a.cp.src/ext/960gs/960_24_col.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/960gs/960_24_col.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+body{min-width:960px}.container_24{margin-left:auto;margin-right:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16,.grid_17,.grid_18,.grid_19,.grid_20,.grid_21,.grid_22,.grid_23,.grid_24{display:inline;float:left;margin-left:5px;margin-right:5px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15,.push_16,.pull_16,.push_17,.pull_17,.push_18,.pull_18,.push_19,.pull_19,.push_20,.pull_20,.push_21,.pull_21,.push_22,.pull_22,.push_23,.pull_23{position:relative}.alpha{margin-left:0}.omega{margin-right:0}.container_24 .grid_1{width:30px}.container_24 .grid_2{width:70px}.container_24 .grid_3{width:110px}.container_24 .grid_4{width:150px}.container_24 .grid_5{width:190px}.container_24 .grid_6{width:230px}.container_24 .grid_7{width:270px}.container_24 .grid_8{width:310px}.container_24 .grid_9{width:350px}.container_24 .grid_10{width:390px}.container_24 .grid_11{width:430px}.container_24 .grid_12{width:470px}.container_24 .grid_13{width:510px}.container_24 .grid_14{width:550px}.container_24 .grid_15{width:590px}.container_24 .grid_16{width:630px}.container_24 .grid_17{width:670px}.container_24 .grid_18{width:710px}.container_24 .grid_19{width:750px}.container_24 .grid_20{width:790px}.container_24 .grid_21{width:830px}.container_24 .grid_22{width:870px}.container_24 .grid_23{width:910px}.container_24 .grid_24{width:950px}.container_24 .prefix_1{padding-left:40px}.container_24 .prefix_2{padding-left:80px}.container_24 .prefix_3{padding-left:120px}.container_24 .prefix_4{padding-left:160px}.container_24 .prefix_5{padding-left:200px}.container_24 .prefix_6{padding-left:240px}.container_24 .prefix_7{padding-left:280px}.container_24 .prefix_8{padding-left:320px}.container_24 .prefix_9{padding-left:360px}.container_24 .prefix_10{padding-left:400px}.container_24 .prefix_11{padding-left:440px}.container_24 .prefix_12{padding-left:480px}.container_24 .prefix_13{padding-left:520px}.container_24 .prefix_14{padding-left:560px}.container_24 .prefix_15{padding-left:600px}.container_24 .prefix_16{padding-left:640px}.container_24 .prefix_17{padding-left:680px}.container_24 .prefix_18{padding-left:720px}.container_24 .prefix_19{padding-left:760px}.container_24 .prefix_20{padding-left:800px}.container_24 .prefix_21{padding-left:840px}.container_24 .prefix_22{padding-left:880px}.container_24 .prefix_23{padding-left:920px}.container_24 .suffix_1{padding-right:40px}.container_24 .suffix_2{padding-right:80px}.container_24 .suffix_3{padding-right:120px}.container_24 .suffix_4{padding-right:160px}.container_24 .suffix_5{padding-right:200px}.container_24 .suffix_6{padding-right:240px}.container_24 .suffix_7{padding-right:280px}.container_24 .suffix_8{padding-right:320px}.container_24 .suffix_9{padding-right:360px}.container_24 .suffix_10{padding-right:400px}.container_24 .suffix_11{padding-right:440px}.container_24 .suffix_12{padding-right:480px}.container_24 .suffix_13{padding-right:520px}.container_24 .suffix_14{padding-right:560px}.container_24 .suffix_15{padding-right:600px}.container_24 .suffix_16{padding-right:640px}.container_24 .suffix_17{padding-right:680px}.container_24 .suffix_18{padding-right:720px}.container_24 .suffix_19{padding-right:760px}.container_24 .suffix_20{padding-right:800px}.container_24 .suffix_21{padding-right:840px}.container_24 .suffix_22{padding-right:880px}.container_24 .suffix_23{padding-right:920px}.container_24 .push_1{left:40px}.container_24 .push_2{left:80px}.container_24 .push_3{left:120px}.container_24 .push_4{left:160px}.container_24 .push_5{left:200px}.container_24 .push_6{left:240px}.container_24 .push_7{left:280px}.container_24 .push_8{left:320px}.container_24 .push_9{left:360px}.container_24 .push_10{left:400px}.container_24 .push_11{left:440px}.container_24 .push_12{left:480px}.container_24 .push_13{left:520px}.container_24 .push_14{left:560px}.container_24 .push_15{left:600px}.container_24 .push_16{left:640px}.container_24 .push_17{left:680px}.container_24 .push_18{left:720px}.container_24 .push_19{left:760px}.container_24 .push_20{left:800px}.container_24 .push_21{left:840px}.container_24 .push_22{left:880px}.container_24 .push_23{left:920px}.container_24 .pull_1{left:-40px}.container_24 .pull_2{left:-80px}.container_24 .pull_3{left:-120px}.container_24 .pull_4{left:-160px}.container_24 .pull_5{left:-200px}.container_24 .pull_6{left:-240px}.container_24 .pull_7{left:-280px}.container_24 .pull_8{left:-320px}.container_24 .pull_9{left:-360px}.container_24 .pull_10{left:-400px}.container_24 .pull_11{left:-440px}.container_24 .pull_12{left:-480px}.container_24 .pull_13{left:-520px}.container_24 .pull_14{left:-560px}.container_24 .pull_15{left:-600px}.container_24 .pull_16{left:-640px}.container_24 .pull_17{left:-680px}.container_24 .pull_18{left:-720px}.container_24 .pull_19{left:-760px}.container_24 .pull_20{left:-800px}.container_24 .pull_21{left:-840px}.container_24 .pull_22{left:-880px}.container_24 .pull_23{left:-920px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1}
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/960gs/960.css 2.3.1.src/ext/960gs/960.css
--- 2.2rc2a.cp.src/ext/960gs/960.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/960gs/960.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+body{min-width:960px}.container_12,.container_16{margin-left:auto;margin-right:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16{display:inline;float:left;margin-left:10px;margin-right:10px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15{position:relative}.container_12 .grid_3,.container_16 .grid_4{width:220px}.container_12 .grid_6,.container_16 .grid_8{width:460px}.container_12 .grid_9,.container_16 .grid_12{width:700px}.container_12 .grid_12,.container_16 .grid_16{width:940px}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width:60px}.container_12 .grid_2{width:140px}.container_12 .grid_4{width:300px}.container_12 .grid_5{width:380px}.container_12 .grid_7{width:540px}.container_12 .grid_8{width:620px}.container_12 .grid_10{width:780px}.container_12 .grid_11{width:860px}.container_16 .grid_1{width:40px}.container_16 .grid_2{width:100px}.container_16 .grid_3{width:160px}.container_16 .grid_5{width:280px}.container_16 .grid_6{width:340px}.container_16 .grid_7{width:400px}.container_16 .grid_9{width:520px}.container_16 .grid_10{width:580px}.container_16 .grid_11{width:640px}.container_16 .grid_13{width:760px}.container_16 .grid_14{width:820px}.container_16 .grid_15{width:880px}.container_12 .prefix_3,.container_16 .prefix_4{padding-left:240px}.container_12 .prefix_6,.container_16 .prefix_8{padding-left:480px}.container_12 .prefix_9,.container_16 .prefix_12{padding-left:720px}.container_12 .prefix_1{padding-left:80px}.container_12 .prefix_2{padding-left:160px}.container_12 .prefix_4{padding-left:320px}.container_12 .prefix_5{padding-left:400px}.container_12 .prefix_7{padding-left:560px}.container_12 .prefix_8{padding-left:640px}.container_12 .prefix_10{padding-left:800px}.container_12 .prefix_11{padding-left:880px}.container_16 .prefix_1{padding-left:60px}.container_16 .prefix_2{padding-left:120px}.container_16 .prefix_3{padding-left:180px}.container_16 .prefix_5{padding-left:300px}.container_16 .prefix_6{padding-left:360px}.container_16 .prefix_7{padding-left:420px}.container_16 .prefix_9{padding-left:540px}.container_16 .prefix_10{padding-left:600px}.container_16 .prefix_11{padding-left:660px}.container_16 .prefix_13{padding-left:780px}.container_16 .prefix_14{padding-left:840px}.container_16 .prefix_15{padding-left:900px}.container_12 .suffix_3,.container_16 .suffix_4{padding-right:240px}.container_12 .suffix_6,.container_16 .suffix_8{padding-right:480px}.container_12 .suffix_9,.container_16 .suffix_12{padding-right:720px}.container_12 .suffix_1{padding-right:80px}.container_12 .suffix_2{padding-right:160px}.container_12 .suffix_4{padding-right:320px}.container_12 .suffix_5{padding-right:400px}.container_12 .suffix_7{padding-right:560px}.container_12 .suffix_8{padding-right:640px}.container_12 .suffix_10{padding-right:800px}.container_12 .suffix_11{padding-right:880px}.container_16 .suffix_1{padding-right:60px}.container_16 .suffix_2{padding-right:120px}.container_16 .suffix_3{padding-right:180px}.container_16 .suffix_5{padding-right:300px}.container_16 .suffix_6{padding-right:360px}.container_16 .suffix_7{padding-right:420px}.container_16 .suffix_9{padding-right:540px}.container_16 .suffix_10{padding-right:600px}.container_16 .suffix_11{padding-right:660px}.container_16 .suffix_13{padding-right:780px}.container_16 .suffix_14{padding-right:840px}.container_16 .suffix_15{padding-right:900px}.container_12 .push_3,.container_16 .push_4{left:240px}.container_12 .push_6,.container_16 .push_8{left:480px}.container_12 .push_9,.container_16 .push_12{left:720px}.container_12 .push_1{left:80px}.container_12 .push_2{left:160px}.container_12 .push_4{left:320px}.container_12 .push_5{left:400px}.container_12 .push_7{left:560px}.container_12 .push_8{left:640px}.container_12 .push_10{left:800px}.container_12 .push_11{left:880px}.container_16 .push_1{left:60px}.container_16 .push_2{left:120px}.container_16 .push_3{left:180px}.container_16 .push_5{left:300px}.container_16 .push_6{left:360px}.container_16 .push_7{left:420px}.container_16 .push_9{left:540px}.container_16 .push_10{left:600px}.container_16 .push_11{left:660px}.container_16 .push_13{left:780px}.container_16 .push_14{left:840px}.container_16 .push_15{left:900px}.container_12 .pull_3,.container_16 .pull_4{left:-240px}.container_12 .pull_6,.container_16 .pull_8{left:-480px}.container_12 .pull_9,.container_16 .pull_12{left:-720px}.container_12 .pull_1{left:-80px}.container_12 .pull_2{left:-160px}.container_12 .pull_4{left:-320px}.container_12 .pull_5{left:-400px}.container_12 .pull_7{left:-560px}.container_12 .pull_8{left:-640px}.container_12 .pull_10{left:-800px}.container_12 .pull_11{left:-880px}.container_16 .pull_1{left:-60px}.container_16 .pull_2{left:-120px}.container_16 .pull_3{left:-180px}.container_16 .pull_5{left:-300px}.container_16 .pull_6{left:-360px}.container_16 .pull_7{left:-420px}.container_16 .pull_9{left:-540px}.container_16 .pull_10{left:-600px}.container_16 .pull_11{left:-660px}.container_16 .pull_13{left:-780px}.container_16 .pull_14{left:-840px}.container_16 .pull_15{left:-900px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1}
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/960gs/rtl_960_24_col.css 2.3.1.src/ext/960gs/rtl_960_24_col.css
--- 2.2rc2a.cp.src/ext/960gs/rtl_960_24_col.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/960gs/rtl_960_24_col.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+.container_24{margin-right:auto;margin-left:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16,.grid_17,.grid_18,.grid_19,.grid_20,.grid_21,.grid_22,.grid_23,.grid_24{display:inline;float:right;margin-right:5px;margin-left:5px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15,.push_16,.pull_16,.push_17,.pull_17,.push_18,.pull_18,.push_19,.pull_19,.push_20,.pull_20,.push_21,.pull_21,.push_22,.pull_22,.push_23,.pull_23{position:relative}.alpha{margin-right:0}.omega{margin-left:0}.container_24 .grid_1{width:30px}.container_24 .grid_2{width:70px}.container_24 .grid_3{width:110px}.container_24 .grid_4{width:150px}.container_24 .grid_5{width:190px}.container_24 .grid_6{width:230px}.container_24 .grid_7{width:270px}.container_24 .grid_8{width:310px}.container_24 .grid_9{width:350px}.container_24 .grid_10{width:390px}.container_24 .grid_11{width:430px}.container_24 .grid_12{width:470px}.container_24 .grid_13{width:510px}.container_24 .grid_14{width:550px}.container_24 .grid_15{width:590px}.container_24 .grid_16{width:630px}.container_24 .grid_17{width:670px}.container_24 .grid_18{width:710px}.container_24 .grid_19{width:750px}.container_24 .grid_20{width:790px}.container_24 .grid_21{width:830px}.container_24 .grid_22{width:870px}.container_24 .grid_23{width:910px}.container_24 .grid_24{width:950px}.container_24 .prefix_1{padding-right:40px}.container_24 .prefix_2{padding-right:80px}.container_24 .prefix_3{padding-right:120px}.container_24 .prefix_4{padding-right:160px}.container_24 .prefix_5{padding-right:200px}.container_24 .prefix_6{padding-right:240px}.container_24 .prefix_7{padding-right:280px}.container_24 .prefix_8{padding-right:320px}.container_24 .prefix_9{padding-right:360px}.container_24 .prefix_10{padding-right:400px}.container_24 .prefix_11{padding-right:440px}.container_24 .prefix_12{padding-right:480px}.container_24 .prefix_13{padding-right:520px}.container_24 .prefix_14{padding-right:560px}.container_24 .prefix_15{padding-right:600px}.container_24 .prefix_16{padding-right:640px}.container_24 .prefix_17{padding-right:680px}.container_24 .prefix_18{padding-right:720px}.container_24 .prefix_19{padding-right:760px}.container_24 .prefix_20{padding-right:800px}.container_24 .prefix_21{padding-right:840px}.container_24 .prefix_22{padding-right:880px}.container_24 .prefix_23{padding-right:920px}.container_24 .suffix_1{padding-left:40px}.container_24 .suffix_2{padding-left:80px}.container_24 .suffix_3{padding-left:120px}.container_24 .suffix_4{padding-left:160px}.container_24 .suffix_5{padding-left:200px}.container_24 .suffix_6{padding-left:240px}.container_24 .suffix_7{padding-left:280px}.container_24 .suffix_8{padding-left:320px}.container_24 .suffix_9{padding-left:360px}.container_24 .suffix_10{padding-left:400px}.container_24 .suffix_11{padding-left:440px}.container_24 .suffix_12{padding-left:480px}.container_24 .suffix_13{padding-left:520px}.container_24 .suffix_14{padding-left:560px}.container_24 .suffix_15{padding-left:600px}.container_24 .suffix_16{padding-left:640px}.container_24 .suffix_17{padding-left:680px}.container_24 .suffix_18{padding-left:720px}.container_24 .suffix_19{padding-left:760px}.container_24 .suffix_20{padding-left:800px}.container_24 .suffix_21{padding-left:840px}.container_24 .suffix_22{padding-left:880px}.container_24 .suffix_23{padding-left:920px}.container_24 .push_1{right:40px}.container_24 .push_2{right:80px}.container_24 .push_3{right:120px}.container_24 .push_4{right:160px}.container_24 .push_5{right:200px}.container_24 .push_6{right:240px}.container_24 .push_7{right:280px}.container_24 .push_8{right:320px}.container_24 .push_9{right:360px}.container_24 .push_10{right:400px}.container_24 .push_11{right:440px}.container_24 .push_12{right:480px}.container_24 .push_13{right:520px}.container_24 .push_14{right:560px}.container_24 .push_15{right:600px}.container_24 .push_16{right:640px}.container_24 .push_17{right:680px}.container_24 .push_18{right:720px}.container_24 .push_19{right:760px}.container_24 .push_20{right:800px}.container_24 .push_21{right:840px}.container_24 .push_22{right:880px}.container_24 .push_23{right:920px}.container_24 .pull_1{right:-40px}.container_24 .pull_2{right:-80px}.container_24 .pull_3{right:-120px}.container_24 .pull_4{right:-160px}.container_24 .pull_5{right:-200px}.container_24 .pull_6{right:-240px}.container_24 .pull_7{right:-280px}.container_24 .pull_8{right:-320px}.container_24 .pull_9{right:-360px}.container_24 .pull_10{right:-400px}.container_24 .pull_11{right:-440px}.container_24 .pull_12{right:-480px}.container_24 .pull_13{right:-520px}.container_24 .pull_14{right:-560px}.container_24 .pull_15{right:-600px}.container_24 .pull_16{right:-640px}.container_24 .pull_17{right:-680px}.container_24 .pull_18{right:-720px}.container_24 .pull_19{right:-760px}.container_24 .pull_20{right:-800px}.container_24 .pull_21{right:-840px}.container_24 .pull_22{right:-880px}.container_24 .pull_23{right:-920px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1}
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/960gs/rtl_960.css 2.3.1.src/ext/960gs/rtl_960.css
--- 2.2rc2a.cp.src/ext/960gs/rtl_960.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/960gs/rtl_960.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+.container_12,.container_16{margin-right:auto;margin-left:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16{display:inline;float:right;margin-right:10px;margin-left:10px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15{position:relative}.container_12 .grid_3,.container_16 .grid_4{width:220px}.container_12 .grid_6,.container_16 .grid_8{width:460px}.container_12 .grid_9,.container_16 .grid_12{width:700px}.container_12 .grid_12,.container_16 .grid_16{width:940px}.alpha{margin-right:0}.omega{margin-left:0}.container_12 .grid_1{width:60px}.container_12 .grid_2{width:140px}.container_12 .grid_4{width:300px}.container_12 .grid_5{width:380px}.container_12 .grid_7{width:540px}.container_12 .grid_8{width:620px}.container_12 .grid_10{width:780px}.container_12 .grid_11{width:860px}.container_16 .grid_1{width:40px}.container_16 .grid_2{width:100px}.container_16 .grid_3{width:160px}.container_16 .grid_5{width:280px}.container_16 .grid_6{width:340px}.container_16 .grid_7{width:400px}.container_16 .grid_9{width:520px}.container_16 .grid_10{width:580px}.container_16 .grid_11{width:640px}.container_16 .grid_13{width:760px}.container_16 .grid_14{width:820px}.container_16 .grid_15{width:880px}.container_12 .prefix_3,.container_16 .prefix_4{padding-right:240px}.container_12 .prefix_6,.container_16 .prefix_8{padding-right:480px}.container_12 .prefix_9,.container_16 .prefix_12{padding-right:720px}.container_12 .prefix_1{padding-right:80px}.container_12 .prefix_2{padding-right:160px}.container_12 .prefix_4{padding-right:320px}.container_12 .prefix_5{padding-right:400px}.container_12 .prefix_7{padding-right:560px}.container_12 .prefix_8{padding-right:640px}.container_12 .prefix_10{padding-right:800px}.container_12 .prefix_11{padding-right:880px}.container_16 .prefix_1{padding-right:60px}.container_16 .prefix_2{padding-right:120px}.container_16 .prefix_3{padding-right:180px}.container_16 .prefix_5{padding-right:300px}.container_16 .prefix_6{padding-right:360px}.container_16 .prefix_7{padding-right:420px}.container_16 .prefix_9{padding-right:540px}.container_16 .prefix_10{padding-right:600px}.container_16 .prefix_11{padding-right:660px}.container_16 .prefix_13{padding-right:780px}.container_16 .prefix_14{padding-right:840px}.container_16 .prefix_15{padding-right:900px}.container_12 .suffix_3,.container_16 .suffix_4{padding-left:240px}.container_12 .suffix_6,.container_16 .suffix_8{padding-left:480px}.container_12 .suffix_9,.container_16 .suffix_12{padding-left:720px}.container_12 .suffix_1{padding-left:80px}.container_12 .suffix_2{padding-left:160px}.container_12 .suffix_4{padding-left:320px}.container_12 .suffix_5{padding-left:400px}.container_12 .suffix_7{padding-left:560px}.container_12 .suffix_8{padding-left:640px}.container_12 .suffix_10{padding-left:800px}.container_12 .suffix_11{padding-left:880px}.container_16 .suffix_1{padding-left:60px}.container_16 .suffix_2{padding-left:120px}.container_16 .suffix_3{padding-left:180px}.container_16 .suffix_5{padding-left:300px}.container_16 .suffix_6{padding-left:360px}.container_16 .suffix_7{padding-left:420px}.container_16 .suffix_9{padding-left:540px}.container_16 .suffix_10{padding-left:600px}.container_16 .suffix_11{padding-left:660px}.container_16 .suffix_13{padding-left:780px}.container_16 .suffix_14{padding-left:840px}.container_16 .suffix_15{padding-left:900px}.container_12 .push_3,.container_16 .push_4{right:240px}.container_12 .push_6,.container_16 .push_8{right:480px}.container_12 .push_9,.container_16 .push_12{right:720px}.container_12 .push_1{right:80px}.container_12 .push_2{right:160px}.container_12 .push_4{right:320px}.container_12 .push_5{right:400px}.container_12 .push_7{right:560px}.container_12 .push_8{right:640px}.container_12 .push_10{right:800px}.container_12 .push_11{right:880px}.container_16 .push_1{right:60px}.container_16 .push_2{right:120px}.container_16 .push_3{right:180px}.container_16 .push_5{right:300px}.container_16 .push_6{right:360px}.container_16 .push_7{right:420px}.container_16 .push_9{right:540px}.container_16 .push_10{right:600px}.container_16 .push_11{right:660px}.container_16 .push_13{right:780px}.container_16 .push_14{right:840px}.container_16 .push_15{right:900px}.container_12 .pull_3,.container_16 .pull_4{right:-240px}.container_12 .pull_6,.container_16 .pull_8{right:-480px}.container_12 .pull_9,.container_16 .pull_12{right:-720px}.container_12 .pull_1{right:-80px}.container_12 .pull_2{right:-160px}.container_12 .pull_4{right:-320px}.container_12 .pull_5{right:-400px}.container_12 .pull_7{right:-560px}.container_12 .pull_8{right:-640px}.container_12 .pull_10{right:-800px}.container_12 .pull_11{right:-880px}.container_16 .pull_1{right:-60px}.container_16 .pull_2{right:-120px}.container_16 .pull_3{right:-180px}.container_16 .pull_5{right:-300px}.container_16 .pull_6{right:-360px}.container_16 .pull_7{right:-420px}.container_16 .pull_9{right:-540px}.container_16 .pull_10{right:-600px}.container_16 .pull_11{right:-660px}.container_16 .pull_13{right:-780px}.container_16 .pull_14{right:-840px}.container_16 .pull_15{right:-900px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1}
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/API.txt 2.3.1.src/ext/flot/API.txt
--- 2.2rc2a.cp.src/ext/flot/API.txt	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/API.txt	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,1024 @@
+Flot Reference
+--------------
+
+Consider a call to the plot function:
+
+   var plot = $.plot(placeholder, data, options)
+
+The placeholder is a jQuery object or DOM element or jQuery expression
+that the plot will be put into. This placeholder needs to have its
+width and height set as explained in the README (go read that now if
+you haven't, it's short). The plot will modify some properties of the
+placeholder so it's recommended you simply pass in a div that you
+don't use for anything else. Make sure you check any fancy styling
+you apply to the div, e.g. background images have been reported to be a
+problem on IE 7.
+
+The format of the data is documented below, as is the available
+options. The "plot" object returned has some methods you can call.
+These are documented separately below.
+
+Note that in general Flot gives no guarantees if you change any of the
+objects you pass in to the plot function or get out of it since
+they're not necessarily deep-copied.
+
+
+Data Format
+-----------
+
+The data is an array of data series:
+
+  [ series1, series2, ... ]
+
+A series can either be raw data or an object with properties. The raw
+data format is an array of points:
+
+  [ [x1, y1], [x2, y2], ... ]
+
+E.g.
+
+  [ [1, 3], [2, 14.01], [3.5, 3.14] ]
+
+Note that to simplify the internal logic in Flot both the x and y
+values must be numbers (even if specifying time series, see below for
+how to do this). This is a common problem because you might retrieve
+data from the database and serialize them directly to JSON without
+noticing the wrong type. If you're getting mysterious errors, double
+check that you're inputting numbers and not strings.
+
+If a null is specified as a point or if one of the coordinates is null
+or couldn't be converted to a number, the point is ignored when
+drawing. As a special case, a null value for lines is interpreted as a
+line segment end, i.e. the points before and after the null value are
+not connected.
+
+Lines and points take two coordinates. For bars, you can specify a
+third coordinate which is the bottom of the bar (defaults to 0).
+
+The format of a single series object is as follows:
+
+  {
+    color: color or number
+    data: rawdata
+    label: string
+    lines: specific lines options
+    bars: specific bars options
+    points: specific points options
+    xaxis: 1 or 2
+    yaxis: 1 or 2
+    clickable: boolean
+    hoverable: boolean
+    shadowSize: number
+  }
+
+You don't have to specify any of them except the data, the rest are
+options that will get default values. Typically you'd only specify
+label and data, like this:
+
+  {
+    label: "y = 3",
+    data: [[0, 3], [10, 3]]
+  }
+
+The label is used for the legend, if you don't specify one, the series
+will not show up in the legend.
+
+If you don't specify color, the series will get a color from the
+auto-generated colors. The color is either a CSS color specification
+(like "rgb(255, 100, 123)") or an integer that specifies which of
+auto-generated colors to select, e.g. 0 will get color no. 0, etc.
+
+The latter is mostly useful if you let the user add and remove series,
+in which case you can hard-code the color index to prevent the colors
+from jumping around between the series.
+
+The "xaxis" and "yaxis" options specify which axis to use, specify 2
+to get the secondary axis (x axis at top or y axis to the right).
+E.g., you can use this to make a dual axis plot by specifying
+{ yaxis: 2 } for one data series.
+
+"clickable" and "hoverable" can be set to false to disable
+interactivity for specific series if interactivity is turned on in
+the plot, see below.
+
+The rest of the options are all documented below as they are the same
+as the default options passed in via the options parameter in the plot
+commmand. When you specify them for a specific data series, they will
+override the default options for the plot for that data series.
+
+Here's a complete example of a simple data specification:
+
+  [ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] },
+    { label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] } ]
+
+
+Plot Options
+------------
+
+All options are completely optional. They are documented individually
+below, to change them you just specify them in an object, e.g.
+
+  var options = {
+    series: {
+      lines: { show: true },
+      points: { show: true }
+    }
+  };
+
+  $.plot(placeholder, data, options);
+
+
+Customizing the legend
+======================
+
+  legend: {
+    show: boolean
+    labelFormatter: null or (fn: string, series object -> string)
+    labelBoxBorderColor: color
+    noColumns: number
+    position: "ne" or "nw" or "se" or "sw"
+    margin: number of pixels or [x margin, y margin]
+    backgroundColor: null or color
+    backgroundOpacity: number between 0 and 1
+    container: null or jQuery object/DOM element/jQuery expression
+  }
+
+The legend is generated as a table with the data series labels and
+small label boxes with the color of the series. If you want to format
+the labels in some way, e.g. make them to links, you can pass in a
+function for "labelFormatter". Here's an example that makes them
+clickable:
+
+  labelFormatter: function(label, series) {
+    // series is the series object for the label
+    return '<a href="#' + label + '">' + label + '</a>';
+  }
+
+"noColumns" is the number of columns to divide the legend table into.
+"position" specifies the overall placement of the legend within the
+plot (top-right, top-left, etc.) and margin the distance to the plot
+edge (this can be either a number or an array of two numbers like [x,
+y]). "backgroundColor" and "backgroundOpacity" specifies the
+background. The default is a partly transparent auto-detected
+background.
+
+If you want the legend to appear somewhere else in the DOM, you can
+specify "container" as a jQuery object/expression to put the legend
+table into. The "position" and "margin" etc. options will then be
+ignored. Note that Flot will overwrite the contents of the container.
+
+
+Customizing the axes
+====================
+
+  xaxis, yaxis, x2axis, y2axis: {
+    mode: null or "time"
+    min: null or number
+    max: null or number
+    autoscaleMargin: null or number
+    
+    labelWidth: null or number
+    labelHeight: null or number
+
+    transform: null or fn: number -> number
+    inverseTransform: null or fn: number -> number
+    
+    ticks: null or number or ticks array or (fn: range -> ticks array)
+    tickSize: number or array
+    minTickSize: number or array
+    tickFormatter: (fn: number, object -> string) or string
+    tickDecimals: null or number
+  }
+
+All axes have the same kind of options. The "mode" option
+determines how the data is interpreted, the default of null means as
+decimal numbers. Use "time" for time series data, see the next section.
+
+The options "min"/"max" are the precise minimum/maximum value on the
+scale. If you don't specify either of them, a value will automatically
+be chosen based on the minimum/maximum data values.
+
+The "autoscaleMargin" is a bit esoteric: it's the fraction of margin
+that the scaling algorithm will add to avoid that the outermost points
+ends up on the grid border. Note that this margin is only applied
+when a min or max value is not explicitly set. If a margin is
+specified, the plot will furthermore extend the axis end-point to the
+nearest whole tick. The default value is "null" for the x axis and
+0.02 for the y axis which seems appropriate for most cases.
+
+"labelWidth" and "labelHeight" specifies a fixed size of the tick
+labels in pixels. They're useful in case you need to align several
+plots.
+
+"transform" and "inverseTransform" are callbacks you can put in to
+change the way the data is drawn. You can design a function to
+compress or expand certain parts of the axis non-linearly, e.g.
+suppress weekends or compress far away points with a logarithm or some
+other means. When Flot draws the plot, each value is first put through
+the transform function. Here's an example, the x axis can be turned
+into a natural logarithm axis with the following code:
+
+  xaxis: {
+    transform: function (v) { return Math.log(v); },
+    inverseTransform: function (v) { return Math.exp(v); }
+  }
+
+Note that for finding extrema, Flot assumes that the transform
+function does not reorder values (monotonicity is assumed).
+
+The inverseTransform is simply the inverse of the transform function
+(so v == inverseTransform(transform(v)) for all relevant v). It is
+required for converting from canvas coordinates to data coordinates,
+e.g. for a mouse interaction where a certain pixel is clicked. If you
+don't use any interactive features of Flot, you may not need it.
+
+
+The rest of the options deal with the ticks.
+
+If you don't specify any ticks, a tick generator algorithm will make
+some for you. The algorithm has two passes. It first estimates how
+many ticks would be reasonable and uses this number to compute a nice
+round tick interval size. Then it generates the ticks.
+
+You can specify how many ticks the algorithm aims for by setting
+"ticks" to a number. The algorithm always tries to generate reasonably
+round tick values so even if you ask for three ticks, you might get
+five if that fits better with the rounding. If you don't want any
+ticks at all, set "ticks" to 0 or an empty array.
+
+Another option is to skip the rounding part and directly set the tick
+interval size with "tickSize". If you set it to 2, you'll get ticks at
+2, 4, 6, etc. Alternatively, you can specify that you just don't want
+ticks at a size less than a specific tick size with "minTickSize".
+Note that for time series, the format is an array like [2, "month"],
+see the next section.
+
+If you want to completely override the tick algorithm, you can specify
+an array for "ticks", either like this:
+
+  ticks: [0, 1.2, 2.4]
+
+Or like this where the labels are also customized:
+
+  ticks: [[0, "zero"], [1.2, "one mark"], [2.4, "two marks"]]
+
+You can mix the two if you like.
+  
+For extra flexibility you can specify a function as the "ticks"
+parameter. The function will be called with an object with the axis
+min and max and should return a ticks array. Here's a simplistic tick
+generator that spits out intervals of pi, suitable for use on the x
+axis for trigonometric functions:
+
+  function piTickGenerator(axis) {
+    var res = [], i = Math.floor(axis.min / Math.PI);
+    do {
+      var v = i * Math.PI;
+      res.push([v, i + "\u03c0"]);
+      ++i;
+    } while (v < axis.max);
+    
+    return res;
+  }
+
+
+You can control how the ticks look like with "tickDecimals", the
+number of decimals to display (default is auto-detected).
+
+Alternatively, for ultimate control over how ticks look like you can
+provide a function to "tickFormatter". The function is passed two
+parameters, the tick value and an "axis" object with information, and
+should return a string. The default formatter looks like this:
+
+  function formatter(val, axis) {
+    return val.toFixed(axis.tickDecimals);
+  }
+
+The axis object has "min" and "max" with the range of the axis,
+"tickDecimals" with the number of decimals to round the value to and
+"tickSize" with the size of the interval between ticks as calculated
+by the automatic axis scaling algorithm (or specified by you). Here's
+an example of a custom formatter:
+
+  function suffixFormatter(val, axis) {
+    if (val > 1000000)
+      return (val / 1000000).toFixed(axis.tickDecimals) + " MB";
+    else if (val > 1000)
+      return (val / 1000).toFixed(axis.tickDecimals) + " kB";
+    else
+      return val.toFixed(axis.tickDecimals) + " B";
+  }
+
+Time series data
+================
+
+Time series are a bit more difficult than scalar data because
+calendars don't follow a simple base 10 system. For many cases, Flot
+abstracts most of this away, but it can still be a bit difficult to
+get the data into Flot. So we'll first discuss the data format.
+
+The time series support in Flot is based on Javascript timestamps,
+i.e. everywhere a time value is expected or handed over, a Javascript
+timestamp number is used. This is a number, not a Date object. A
+Javascript timestamp is the number of milliseconds since January 1,
+1970 00:00:00 UTC. This is almost the same as Unix timestamps, except it's
+in milliseconds, so remember to multiply by 1000!
+
+You can see a timestamp like this
+
+  alert((new Date()).getTime())
+
+Normally you want the timestamps to be displayed according to a
+certain time zone, usually the time zone in which the data has been
+produced. However, Flot always displays timestamps according to UTC.
+It has to as the only alternative with core Javascript is to interpret
+the timestamps according to the time zone that the visitor is in,
+which means that the ticks will shift unpredictably with the time zone
+and daylight savings of each visitor.
+
+So given that there's no good support for custom time zones in
+Javascript, you'll have to take care of this server-side.
+
+The easiest way to think about it is to pretend that the data
+production time zone is UTC, even if it isn't. So if you have a
+datapoint at 2002-02-20 08:00, you can generate a timestamp for eight
+o'clock UTC even if it really happened eight o'clock UTC+0200.
+
+In PHP you can get an appropriate timestamp with
+'strtotime("2002-02-20 UTC") * 1000', in Python with
+'calendar.timegm(datetime_object.timetuple()) * 1000', in .NET with
+something like:
+
+  public static int GetJavascriptTimestamp(System.DateTime input)
+  {
+    System.TimeSpan span = new System.TimeSpan(System.DateTime.Parse("1/1/1970").Ticks);
+    System.DateTime time = input.Subtract(span);
+    return (long)(time.Ticks / 10000);
+  }
+
+Javascript also has some support for parsing date strings, so it is
+possible to generate the timestamps manually client-side.
+
+If you've already got the real UTC timestamp, it's too late to use the
+pretend trick described above. But you can fix up the timestamps by
+adding the time zone offset, e.g. for UTC+0200 you would add 2 hours
+to the UTC timestamp you got. Then it'll look right on the plot. Most
+programming environments have some means of getting the timezone
+offset for a specific date (note that you need to get the offset for
+each individual timestamp to account for daylight savings).
+
+Once you've gotten the timestamps into the data and specified "time"
+as the axis mode, Flot will automatically generate relevant ticks and
+format them. As always, you can tweak the ticks via the "ticks" option
+- just remember that the values should be timestamps (numbers), not
+Date objects.
+
+Tick generation and formatting can also be controlled separately
+through the following axis options:
+
+  minTickSize: array
+  timeformat: null or format string
+  monthNames: null or array of size 12 of strings
+  twelveHourClock: boolean
+
+Here "timeformat" is a format string to use. You might use it like
+this:
+
+  xaxis: {
+    mode: "time"
+    timeformat: "%y/%m/%d"
+  }
+  
+This will result in tick labels like "2000/12/24". The following
+specifiers are supported
+
+  %h: hours
+  %H: hours (left-padded with a zero)
+  %M: minutes (left-padded with a zero)
+  %S: seconds (left-padded with a zero)
+  %d: day of month (1-31)
+  %m: month (1-12)
+  %y: year (four digits)
+  %b: month name (customizable)
+  %p: am/pm, additionally switches %h/%H to 12 hour instead of 24
+  %P: AM/PM (uppercase version of %p)
+
+You can customize the month names with the "monthNames" option. For
+instance, for Danish you might specify:
+
+  monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"]
+
+If you set "twelveHourClock" to true, the autogenerated timestamps
+will use 12 hour AM/PM timestamps instead of 24 hour.
+  
+The format string and month names are used by a very simple built-in
+format function that takes a date object, a format string (and
+optionally an array of month names) and returns the formatted string.
+If needed, you can access it as $.plot.formatDate(date, formatstring,
+monthNames) or even replace it with another more advanced function
+from a date library if you're feeling adventurous.
+
+If everything else fails, you can control the formatting by specifying
+a custom tick formatter function as usual. Here's a simple example
+which will format December 24 as 24/12:
+
+  tickFormatter: function (val, axis) {
+    var d = new Date(val);
+    return d.getUTCDate() + "/" + (d.getUTCMonth() + 1);
+  }
+
+Note that for the time mode "tickSize" and "minTickSize" are a bit
+special in that they are arrays on the form "[value, unit]" where unit
+is one of "second", "minute", "hour", "day", "month" and "year". So
+you can specify
+
+  minTickSize: [1, "month"]
+
+to get a tick interval size of at least 1 month and correspondingly,
+if axis.tickSize is [2, "day"] in the tick formatter, the ticks have
+been produced with two days in-between.
+
+
+
+Customizing the data series
+===========================
+
+  series: {
+    lines, points, bars: {
+      show: boolean
+      lineWidth: number
+      fill: boolean or number
+      fillColor: null or color/gradient
+    }
+
+    points: {
+      radius: number
+    }
+
+    bars: {
+      barWidth: number
+      align: "left" or "center"
+      horizontal: boolean
+    }
+
+    lines: {
+      steps: boolean
+    }
+
+    shadowSize: number
+  }
+  
+  colors: [ color1, color2, ... ]
+
+The options inside "series: {}" are copied to each of the series. So
+you can specify that all series should have bars by putting it in the
+global options, or override it for individual series by specifying
+bars in a particular the series object in the array of data.
+  
+The most important options are "lines", "points" and "bars" that
+specify whether and how lines, points and bars should be shown for
+each data series. In case you don't specify anything at all, Flot will
+default to showing lines (you can turn this off with
+lines: { show: false}). You can specify the various types
+independently of each other, and Flot will happily draw each of them
+in turn (this is probably only useful for lines and points), e.g.
+
+  var options = {
+    series: {
+      lines: { show: true, fill: true, fillColor: "rgba(255, 255, 255, 0.8)" },
+      points: { show: true, fill: false }
+    }
+  };
+
+"lineWidth" is the thickness of the line or outline in pixels. You can
+set it to 0 to prevent a line or outline from being drawn; this will
+also hide the shadow.
+
+"fill" is whether the shape should be filled. For lines, this produces
+area graphs. You can use "fillColor" to specify the color of the fill.
+If "fillColor" evaluates to false (default for everything except
+points which are filled with white), the fill color is auto-set to the
+color of the data series. You can adjust the opacity of the fill by
+setting fill to a number between 0 (fully transparent) and 1 (fully
+opaque).
+
+For bars, fillColor can be a gradient, see the gradient documentation
+below. "barWidth" is the width of the bars in units of the x axis (or
+the y axis if "horizontal" is true), contrary to most other measures
+that are specified in pixels. For instance, for time series the unit
+is milliseconds so 24 * 60 * 60 * 1000 produces bars with the width of
+a day. "align" specifies whether a bar should be left-aligned
+(default) or centered on top of the value it represents. When
+"horizontal" is on, the bars are drawn horizontally, i.e. from the y
+axis instead of the x axis; note that the bar end points are still
+defined in the same way so you'll probably want to swap the
+coordinates if you've been plotting vertical bars first.
+
+For lines, "steps" specifies whether two adjacent data points are
+connected with a straight (possibly diagonal) line or with first a
+horizontal and then a vertical line. Note that this transforms the
+data by adding extra points.
+
+"shadowSize" is the default size of shadows in pixels. Set it to 0 to
+remove shadows.
+
+The "colors" array specifies a default color theme to get colors for
+the data series from. You can specify as many colors as you like, like
+this:
+
+  colors: ["#d18b2c", "#dba255", "#919733"]
+
+If there are more data series than colors, Flot will try to generate
+extra colors by lightening and darkening colors in the theme.
+
+
+Customizing the grid
+====================
+
+  grid: {
+    show: boolean
+    aboveData: boolean
+    color: color
+    backgroundColor: color/gradient or null
+    tickColor: color
+    labelMargin: number
+    markings: array of markings or (fn: axes -> array of markings)
+    borderWidth: number
+    borderColor: color or null
+    clickable: boolean
+    hoverable: boolean
+    autoHighlight: boolean
+    mouseActiveRadius: number
+  }
+
+The grid is the thing with the axes and a number of ticks. "color" is
+the color of the grid itself whereas "backgroundColor" specifies the
+background color inside the grid area. The default value of null means
+that the background is transparent. You can also set a gradient, see
+the gradient documentation below.
+
+You can turn off the whole grid including tick labels by setting
+"show" to false. "aboveData" determines whether the grid is drawn on
+above the data or below (below is default).
+
+"tickColor" is the color of the ticks and "labelMargin" is the spacing
+between tick labels and the grid. Note that you can style the tick
+labels with CSS, e.g. to change the color. They have class "tickLabel".
+"borderWidth" is the width of the border around the plot. Set it to 0
+to disable the border. You can also set "borderColor" if you want the
+border to have a different color than the grid lines.
+
+"markings" is used to draw simple lines and rectangular areas in the
+background of the plot. You can either specify an array of ranges on
+the form { xaxis: { from, to }, yaxis: { from, to } } (secondary axis
+coordinates with x2axis/y2axis) or with a function that returns such
+an array given the axes for the plot in an object as the first
+parameter.
+
+You can set the color of markings by specifying "color" in the ranges
+object. Here's an example array:
+
+  markings: [ { xaxis: { from: 0, to: 2 }, yaxis: { from: 10, to: 10 }, color: "#bb0000" }, ... ]
+
+If you leave out one of the values, that value is assumed to go to the
+border of the plot. So for example if you only specify { xaxis: {
+from: 0, to: 2 } } it means an area that extends from the top to the
+bottom of the plot in the x range 0-2.
+
+A line is drawn if from and to are the same, e.g.
+
+  markings: [ { yaxis: { from: 1, to: 1 } }, ... ]
+
+would draw a line parallel to the x axis at y = 1. You can control the
+line width with "lineWidth" in the range object.
+
+An example function might look like this:
+
+  markings: function (axes) {
+    var markings = [];
+    for (var x = Math.floor(axes.xaxis.min); x < axes.xaxis.max; x += 2)
+      markings.push({ xaxis: { from: x, to: x + 1 } });
+    return markings;
+  }
+
+
+If you set "clickable" to true, the plot will listen for click events
+on the plot area and fire a "plotclick" event on the placeholder with
+a position and a nearby data item object as parameters. The coordinates
+are available both in the unit of the axes (not in pixels) and in
+global screen coordinates.
+
+Likewise, if you set "hoverable" to true, the plot will listen for
+mouse move events on the plot area and fire a "plothover" event with
+the same parameters as the "plotclick" event. If "autoHighlight" is
+true (the default), nearby data items are highlighted automatically.
+If needed, you can disable highlighting and control it yourself with
+the highlight/unhighlight plot methods described elsewhere.
+
+You can use "plotclick" and "plothover" events like this:
+
+    $.plot($("#placeholder"), [ d ], { grid: { clickable: true } });
+
+    $("#placeholder").bind("plotclick", function (event, pos, item) {
+        alert("You clicked at " + pos.x + ", " + pos.y);
+        // secondary axis coordinates if present are in pos.x2, pos.y2,
+        // if you need global screen coordinates, they are pos.pageX, pos.pageY
+
+        if (item) {
+          highlight(item.series, item.datapoint);
+          alert("You clicked a point!");
+        }
+    });
+
+The item object in this example is either null or a nearby object on the form:
+
+  item: {
+      datapoint: the point, e.g. [0, 2]
+      dataIndex: the index of the point in the data array
+      series: the series object
+      seriesIndex: the index of the series
+      pageX, pageY: the global screen coordinates of the point
+  }
+
+For instance, if you have specified the data like this 
+
+    $.plot($("#placeholder"), [ { label: "Foo", data: [[0, 10], [7, 3]] } ], ...);
+
+and the mouse is near the point (7, 3), "datapoint" is [7, 3],
+"dataIndex" will be 1, "series" is a normalized series object with
+among other things the "Foo" label in series.label and the color in
+series.color, and "seriesIndex" is 0. Note that plugins and options
+that transform the data can shift the indexes from what you specified
+in the original data array.
+
+If you use the above events to update some other information and want
+to clear out that info in case the mouse goes away, you'll probably
+also need to listen to "mouseout" events on the placeholder div.
+
+"mouseActiveRadius" specifies how far the mouse can be from an item
+and still activate it. If there are two or more points within this
+radius, Flot chooses the closest item. For bars, the top-most bar
+(from the latest specified data series) is chosen.
+
+If you want to disable interactivity for a specific data series, you
+can set "hoverable" and "clickable" to false in the options for that
+series, like this { data: [...], label: "Foo", clickable: false }.
+
+
+Specifying gradients
+====================
+
+A gradient is specified like this:
+
+  { colors: [ color1, color2, ... ] }
+
+For instance, you might specify a background on the grid going from
+black to gray like this:
+
+  grid: {
+    backgroundColor: { colors: ["#000", "#999"] }
+  }
+
+For the series you can specify the gradient as an object that
+specifies the scaling of the brightness and the opacity of the series
+color, e.g.
+
+  { colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] }
+
+where the first color simply has its alpha scaled, whereas the second
+is also darkened. For instance, for bars the following makes the bars
+gradually disappear, without outline:
+
+  bars: {
+      show: true,
+      lineWidth: 0,
+      fill: true,
+      fillColor: { colors: [ { opacity: 0.8 }, { opacity: 0.1 } ] }
+  }
+  
+Flot currently only supports vertical gradients drawn from top to
+bottom because that's what works with IE.
+
+
+Plot Methods
+------------
+
+The Plot object returned from the plot function has some methods you
+can call:
+
+  - highlight(series, datapoint)
+
+    Highlight a specific datapoint in the data series. You can either
+    specify the actual objects, e.g. if you got them from a
+    "plotclick" event, or you can specify the indices, e.g.
+    highlight(1, 3) to highlight the fourth point in the second series
+    (remember, zero-based indexing).
+
+  
+  - unhighlight(series, datapoint) or unhighlight()
+
+    Remove the highlighting of the point, same parameters as
+    highlight.
+
+    If you call unhighlight with no parameters, e.g. as
+    plot.unhighlight(), all current highlights are removed.
+
+
+  - setData(data)
+
+    You can use this to reset the data used. Note that axis scaling,
+    ticks, legend etc. will not be recomputed (use setupGrid() to do
+    that). You'll probably want to call draw() afterwards.
+
+    You can use this function to speed up redrawing a small plot if
+    you know that the axes won't change. Put in the new data with
+    setData(newdata), call draw(), and you're good to go. Note that
+    for large datasets, almost all the time is consumed in draw()
+    plotting the data so in this case don't bother.
+
+    
+  - setupGrid()
+
+    Recalculate and set axis scaling, ticks, legend etc.
+
+    Note that because of the drawing model of the canvas, this
+    function will immediately redraw (actually reinsert in the DOM)
+    the labels and the legend, but not the actual tick lines because
+    they're drawn on the canvas. You need to call draw() to get the
+    canvas redrawn.
+    
+  - draw()
+
+    Redraws the plot canvas.
+
+  - triggerRedrawOverlay()
+
+    Schedules an update of an overlay canvas used for drawing
+    interactive things like a selection and point highlights. This
+    is mostly useful for writing plugins. The redraw doesn't happen
+    immediately, instead a timer is set to catch multiple successive
+    redraws (e.g. from a mousemove).
+
+  - width()/height()
+
+    Gets the width and height of the plotting area inside the grid.
+    This is smaller than the canvas or placeholder dimensions as some
+    extra space is needed (e.g. for labels).
+
+  - offset()
+
+    Returns the offset of the plotting area inside the grid relative
+    to the document, useful for instance for calculating mouse
+    positions (event.pageX/Y minus this offset is the pixel position
+    inside the plot).
+
+  - pointOffset({ x: xpos, y: ypos })
+
+    Returns the calculated offset of the data point at (x, y) in data
+    space within the placeholder div. If you are working with dual axes, you
+    can specify the x and y axis references, e.g. 
+
+      o = pointOffset({ x: xpos, y: ypos, xaxis: 2, yaxis: 2 })
+      // o.left and o.top now contains the offset within the div
+  
+
+There are also some members that let you peek inside the internal
+workings of Flot which is useful in some cases. Note that if you change
+something in the objects returned, you're changing the objects used by
+Flot to keep track of its state, so be careful.
+
+  - getData()
+
+    Returns an array of the data series currently used in normalized
+    form with missing settings filled in according to the global
+    options. So for instance to find out what color Flot has assigned
+    to the data series, you could do this:
+
+      var series = plot.getData();
+      for (var i = 0; i < series.length; ++i)
+        alert(series[i].color);
+
+    A notable other interesting field besides color is datapoints
+    which has a field "points" with the normalized data points in a
+    flat array (the field "pointsize" is the increment in the flat
+    array to get to the next point so for a dataset consisting only of
+    (x,y) pairs it would be 2).
+
+  - getAxes()
+
+    Gets an object with the axes settings as { xaxis, yaxis, x2axis,
+    y2axis }.
+
+    Various things are stuffed inside an axis object, e.g. you could
+    use getAxes().xaxis.ticks to find out what the ticks are for the
+    xaxis. Two other useful attributes are p2c and c2p, functions for
+    transforming from data point space to the canvas plot space and
+    back. Both returns values that are offset with the plot offset.
+ 
+  - getPlaceholder()
+
+    Returns placeholder that the plot was put into. This can be useful
+    for plugins for adding DOM elements or firing events.
+
+  - getCanvas()
+
+    Returns the canvas used for drawing in case you need to hack on it
+    yourself. You'll probably need to get the plot offset too.
+  
+  - getPlotOffset()
+
+    Gets the offset that the grid has within the canvas as an object
+    with distances from the canvas edges as "left", "right", "top",
+    "bottom". I.e., if you draw a circle on the canvas with the center
+    placed at (left, top), its center will be at the top-most, left
+    corner of the grid.
+
+  - getOptions()
+
+    Gets the options for the plot, in a normalized format with default
+    values filled in.
+    
+
+Hooks
+=====
+
+In addition to the public methods, the Plot object also has some hooks
+that can be used to modify the plotting process. You can install a
+callback function at various points in the process, the function then
+gets access to the internal data structures in Flot.
+
+Here's an overview of the phases Flot goes through:
+
+  1. Plugin initialization, parsing options
+  
+  2. Constructing the canvases used for drawing
+
+  3. Set data: parsing data specification, calculating colors,
+     copying raw data points into internal format,
+     normalizing them, finding max/min for axis auto-scaling
+
+  4. Grid setup: calculating axis spacing, ticks, inserting tick
+     labels, the legend
+
+  5. Draw: drawing the grid, drawing each of the series in turn
+
+  6. Setting up event handling for interactive features
+
+  7. Responding to events, if any
+
+Each hook is simply a function which is put in the appropriate array.
+You can add them through the "hooks" option, and they are also available
+after the plot is constructed as the "hooks" attribute on the returned
+plot object, e.g.
+
+  // define a simple draw hook
+  function hellohook(plot, canvascontext) { alert("hello!"); };
+
+  // pass it in, in an array since we might want to specify several
+  var plot = $.plot(placeholder, data, { hooks: { draw: [hellohook] } });
+
+  // we can now find it again in plot.hooks.draw[0] unless a plugin
+  // has added other hooks
+
+The available hooks are described below. All hook callbacks get the
+plot object as first parameter. You can find some examples of defined
+hooks in the plugins bundled with Flot.
+
+ - processOptions  [phase 1]
+
+   function(plot, options)
+   
+   Called after Flot has parsed and merged options. Useful in the
+   instance where customizations beyond simple merging of default
+   values is needed. A plugin might use it to detect that it has been
+   enabled and then turn on or off other options.
+
+ 
+ - processRawData  [phase 3]
+
+   function(plot, series, data, datapoints)
+ 
+   Called before Flot copies and normalizes the raw data for the given
+   series. If the function fills in datapoints.points with normalized
+   points and sets datapoints.pointsize to the size of the points,
+   Flot will skip the copying/normalization step for this series.
+   
+   In any case, you might be interested in setting datapoints.format,
+   an array of objects for specifying how a point is normalized and
+   how it interferes with axis scaling.
+
+   The default format array for points is something along the lines of:
+
+     [
+       { x: true, number: true, required: true },
+       { y: true, number: true, required: true }
+     ]
+
+   The first object means that for the first coordinate it should be
+   taken into account when scaling the x axis, that it must be a
+   number, and that it is required - so if it is null or cannot be
+   converted to a number, the whole point will be zeroed out with
+   nulls. Beyond these you can also specify "defaultValue", a value to
+   use if the coordinate is null. This is for instance handy for bars
+   where one can omit the third coordinate (the bottom of the bar)
+   which then defaults to 0.
+
+
+ - processDatapoints  [phase 3]
+
+   function(plot, series, datapoints)
+ 
+   Called after normalization of the given series but before finding
+   min/max of the data points. This hook is useful for implementing data
+   transformations. "datapoints" contains the normalized data points in
+   a flat array as datapoints.points with the size of a single point
+   given in datapoints.pointsize. Here's a simple transform that
+   multiplies all y coordinates by 2:
+
+     function multiply(plot, series, datapoints) {
+         var points = datapoints.points, ps = datapoints.pointsize;
+         for (var i = 0; i < points.length; i += ps)
+             points[i + 1] *= 2;
+     }
+
+   Note that you must leave datapoints in a good condition as Flot
+   doesn't check it or do any normalization on it afterwards.
+
+
+ - draw  [phase 5]
+
+   function(plot, canvascontext)
+ 
+   Hook for drawing on the canvas. Called after the grid is drawn
+   (unless it's disabled) and the series have been plotted (in case
+   any points, lines or bars have been turned on). For examples of how
+   to draw things, look at the source code.
+   
+ 
+ - bindEvents  [phase 6]
+
+   function(plot, eventHolder)
+
+   Called after Flot has setup its event handlers. Should set any
+   necessary event handlers on eventHolder, a jQuery object with the
+   canvas, e.g.
+
+     function (plot, eventHolder) {
+         eventHolder.mousedown(function (e) {
+             alert("You pressed the mouse at " + e.pageX + " " + e.pageY);
+         });
+     }
+
+   Interesting events include click, mousemove, mouseup/down. You can
+   use all jQuery events. Usually, the event handlers will update the
+   state by drawing something (add a drawOverlay hook and call
+   triggerRedrawOverlay) or firing an externally visible event for
+   user code. See the crosshair plugin for an example.
+     
+   Currently, eventHolder actually contains both the static canvas
+   used for the plot itself and the overlay canvas used for
+   interactive features because some versions of IE get the stacking
+   order wrong. The hook only gets one event, though (either for the
+   overlay or for the static canvas).
+
+
+ - drawOverlay  [phase 7]
+
+   function (plot, canvascontext)
+
+   The drawOverlay hook is used for interactive things that need a
+   canvas to draw on. The model currently used by Flot works the way
+   that an extra overlay canvas is positioned on top of the static
+   canvas. This overlay is cleared and then completely redrawn
+   whenever something interesting happens. This hook is called when
+   the overlay canvas is to be redrawn.
+
+   "canvascontext" is the 2D context of the overlay canvas. You can
+   use this to draw things. You'll most likely need some of the
+   metrics computed by Flot, e.g. plot.width()/plot.height(). See the
+   crosshair plugin for an example.
+
+
+   
+Plugins
+-------
+
+Plugins extend the functionality of Flot. To use a plugin, simply
+include its Javascript file after Flot in the HTML page.
+
+If you're worried about download size/latency, you can concatenate all
+the plugins you use, and Flot itself for that matter, into one big file
+(make sure you get the order right), then optionally run it through a
+Javascript minifier such as YUI Compressor.
+
+Here's a brief explanation of how the plugin plumbings work:
+
+Each plugin registers itself in the global array $.plot.plugins. When
+you make a new plot object with $.plot, Flot goes through this array
+calling the "init" function of each plugin and merging default options
+from its "option" attribute. The init function gets a reference to the
+plot object created and uses this to register hooks and add new public
+methods if needed.
+
+See the PLUGINS.txt file for details on how to write a plugin. As the
+above description hints, it's actually pretty easy.
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/excanvas.js 2.3.1.src/ext/flot/excanvas.js
--- 2.2rc2a.cp.src/ext/flot/excanvas.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/excanvas.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,1427 @@
+// Copyright 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// Known Issues:
+//
+// * Patterns only support repeat.
+// * Radial gradient are not implemented. The VML version of these look very
+//   different from the canvas one.
+// * Clipping paths are not implemented.
+// * Coordsize. The width and height attribute have higher priority than the
+//   width and height style values which isn't correct.
+// * Painting mode isn't implemented.
+// * Canvas width/height should is using content-box by default. IE in
+//   Quirks mode will draw the canvas using border-box. Either change your
+//   doctype to HTML5
+//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
+//   or use Box Sizing Behavior from WebFX
+//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
+// * Non uniform scaling does not correctly scale strokes.
+// * Filling very large shapes (above 5000 points) is buggy.
+// * Optimize. There is always room for speed improvements.
+
+// Only add this code if we do not already have a canvas implementation
+if (!document.createElement('canvas').getContext) {
+
+(function() {
+
+  // alias some functions to make (compiled) code shorter
+  var m = Math;
+  var mr = m.round;
+  var ms = m.sin;
+  var mc = m.cos;
+  var abs = m.abs;
+  var sqrt = m.sqrt;
+
+  // this is used for sub pixel precision
+  var Z = 10;
+  var Z2 = Z / 2;
+
+  /**
+   * This funtion is assigned to the <canvas> elements as element.getContext().
+   * @this {HTMLElement}
+   * @return {CanvasRenderingContext2D_}
+   */
+  function getContext() {
+    return this.context_ ||
+        (this.context_ = new CanvasRenderingContext2D_(this));
+  }
+
+  var slice = Array.prototype.slice;
+
+  /**
+   * Binds a function to an object. The returned function will always use the
+   * passed in {@code obj} as {@code this}.
+   *
+   * Example:
+   *
+   *   g = bind(f, obj, a, b)
+   *   g(c, d) // will do f.call(obj, a, b, c, d)
+   *
+   * @param {Function} f The function to bind the object to
+   * @param {Object} obj The object that should act as this when the function
+   *     is called
+   * @param {*} var_args Rest arguments that will be used as the initial
+   *     arguments when the function is called
+   * @return {Function} A new function that has bound this
+   */
+  function bind(f, obj, var_args) {
+    var a = slice.call(arguments, 2);
+    return function() {
+      return f.apply(obj, a.concat(slice.call(arguments)));
+    };
+  }
+
+  function encodeHtmlAttribute(s) {
+    return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
+  }
+
+  function addNamespacesAndStylesheet(doc) {
+    // create xmlns
+    if (!doc.namespaces['g_vml_']) {
+      doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',
+                         '#default#VML');
+
+    }
+    if (!doc.namespaces['g_o_']) {
+      doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',
+                         '#default#VML');
+    }
+
+    // Setup default CSS.  Only add one style sheet per document
+    if (!doc.styleSheets['ex_canvas_']) {
+      var ss = doc.createStyleSheet();
+      ss.owningElement.id = 'ex_canvas_';
+      ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
+          // default size is 300x150 in Gecko and Opera
+          'text-align:left;width:300px;height:150px}';
+    }
+  }
+
+  // Add namespaces and stylesheet at startup.
+  addNamespacesAndStylesheet(document);
+
+  var G_vmlCanvasManager_ = {
+    init: function(opt_doc) {
+      if (/MSIE/.test(navigator.userAgent) && !window.opera) {
+        var doc = opt_doc || document;
+        // Create a dummy element so that IE will allow canvas elements to be
+        // recognized.
+        doc.createElement('canvas');
+        doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
+      }
+    },
+
+    init_: function(doc) {
+      // find all canvas elements
+      var els = doc.getElementsByTagName('canvas');
+      for (var i = 0; i < els.length; i++) {
+        this.initElement(els[i]);
+      }
+    },
+
+    /**
+     * Public initializes a canvas element so that it can be used as canvas
+     * element from now on. This is called automatically before the page is
+     * loaded but if you are creating elements using createElement you need to
+     * make sure this is called on the element.
+     * @param {HTMLElement} el The canvas element to initialize.
+     * @return {HTMLElement} the element that was created.
+     */
+    initElement: function(el) {
+      if (!el.getContext) {
+        el.getContext = getContext;
+
+        // Add namespaces and stylesheet to document of the element.
+        addNamespacesAndStylesheet(el.ownerDocument);
+
+        // Remove fallback content. There is no way to hide text nodes so we
+        // just remove all childNodes. We could hide all elements and remove
+        // text nodes but who really cares about the fallback content.
+        el.innerHTML = '';
+
+        // do not use inline function because that will leak memory
+        el.attachEvent('onpropertychange', onPropertyChange);
+        el.attachEvent('onresize', onResize);
+
+        var attrs = el.attributes;
+        if (attrs.width && attrs.width.specified) {
+          // TODO: use runtimeStyle and coordsize
+          // el.getContext().setWidth_(attrs.width.nodeValue);
+          el.style.width = attrs.width.nodeValue + 'px';
+        } else {
+          el.width = el.clientWidth;
+        }
+        if (attrs.height && attrs.height.specified) {
+          // TODO: use runtimeStyle and coordsize
+          // el.getContext().setHeight_(attrs.height.nodeValue);
+          el.style.height = attrs.height.nodeValue + 'px';
+        } else {
+          el.height = el.clientHeight;
+        }
+        //el.getContext().setCoordsize_()
+      }
+      return el;
+    }
+  };
+
+  function onPropertyChange(e) {
+    var el = e.srcElement;
+
+    switch (e.propertyName) {
+      case 'width':
+        el.getContext().clearRect();
+        el.style.width = el.attributes.width.nodeValue + 'px';
+        // In IE8 this does not trigger onresize.
+        el.firstChild.style.width =  el.clientWidth + 'px';
+        break;
+      case 'height':
+        el.getContext().clearRect();
+        el.style.height = el.attributes.height.nodeValue + 'px';
+        el.firstChild.style.height = el.clientHeight + 'px';
+        break;
+    }
+  }
+
+  function onResize(e) {
+    var el = e.srcElement;
+    if (el.firstChild) {
+      el.firstChild.style.width =  el.clientWidth + 'px';
+      el.firstChild.style.height = el.clientHeight + 'px';
+    }
+  }
+
+  G_vmlCanvasManager_.init();
+
+  // precompute "00" to "FF"
+  var decToHex = [];
+  for (var i = 0; i < 16; i++) {
+    for (var j = 0; j < 16; j++) {
+      decToHex[i * 16 + j] = i.toString(16) + j.toString(16);
+    }
+  }
+
+  function createMatrixIdentity() {
+    return [
+      [1, 0, 0],
+      [0, 1, 0],
+      [0, 0, 1]
+    ];
+  }
+
+  function matrixMultiply(m1, m2) {
+    var result = createMatrixIdentity();
+
+    for (var x = 0; x < 3; x++) {
+      for (var y = 0; y < 3; y++) {
+        var sum = 0;
+
+        for (var z = 0; z < 3; z++) {
+          sum += m1[x][z] * m2[z][y];
+        }
+
+        result[x][y] = sum;
+      }
+    }
+    return result;
+  }
+
+  function copyState(o1, o2) {
+    o2.fillStyle     = o1.fillStyle;
+    o2.lineCap       = o1.lineCap;
+    o2.lineJoin      = o1.lineJoin;
+    o2.lineWidth     = o1.lineWidth;
+    o2.miterLimit    = o1.miterLimit;
+    o2.shadowBlur    = o1.shadowBlur;
+    o2.shadowColor   = o1.shadowColor;
+    o2.shadowOffsetX = o1.shadowOffsetX;
+    o2.shadowOffsetY = o1.shadowOffsetY;
+    o2.strokeStyle   = o1.strokeStyle;
+    o2.globalAlpha   = o1.globalAlpha;
+    o2.font          = o1.font;
+    o2.textAlign     = o1.textAlign;
+    o2.textBaseline  = o1.textBaseline;
+    o2.arcScaleX_    = o1.arcScaleX_;
+    o2.arcScaleY_    = o1.arcScaleY_;
+    o2.lineScale_    = o1.lineScale_;
+  }
+
+  var colorData = {
+    aliceblue: '#F0F8FF',
+    antiquewhite: '#FAEBD7',
+    aquamarine: '#7FFFD4',
+    azure: '#F0FFFF',
+    beige: '#F5F5DC',
+    bisque: '#FFE4C4',
+    black: '#000000',
+    blanchedalmond: '#FFEBCD',
+    blueviolet: '#8A2BE2',
+    brown: '#A52A2A',
+    burlywood: '#DEB887',
+    cadetblue: '#5F9EA0',
+    chartreuse: '#7FFF00',
+    chocolate: '#D2691E',
+    coral: '#FF7F50',
+    cornflowerblue: '#6495ED',
+    cornsilk: '#FFF8DC',
+    crimson: '#DC143C',
+    cyan: '#00FFFF',
+    darkblue: '#00008B',
+    darkcyan: '#008B8B',
+    darkgoldenrod: '#B8860B',
+    darkgray: '#A9A9A9',
+    darkgreen: '#006400',
+    darkgrey: '#A9A9A9',
+    darkkhaki: '#BDB76B',
+    darkmagenta: '#8B008B',
+    darkolivegreen: '#556B2F',
+    darkorange: '#FF8C00',
+    darkorchid: '#9932CC',
+    darkred: '#8B0000',
+    darksalmon: '#E9967A',
+    darkseagreen: '#8FBC8F',
+    darkslateblue: '#483D8B',
+    darkslategray: '#2F4F4F',
+    darkslategrey: '#2F4F4F',
+    darkturquoise: '#00CED1',
+    darkviolet: '#9400D3',
+    deeppink: '#FF1493',
+    deepskyblue: '#00BFFF',
+    dimgray: '#696969',
+    dimgrey: '#696969',
+    dodgerblue: '#1E90FF',
+    firebrick: '#B22222',
+    floralwhite: '#FFFAF0',
+    forestgreen: '#228B22',
+    gainsboro: '#DCDCDC',
+    ghostwhite: '#F8F8FF',
+    gold: '#FFD700',
+    goldenrod: '#DAA520',
+    grey: '#808080',
+    greenyellow: '#ADFF2F',
+    honeydew: '#F0FFF0',
+    hotpink: '#FF69B4',
+    indianred: '#CD5C5C',
+    indigo: '#4B0082',
+    ivory: '#FFFFF0',
+    khaki: '#F0E68C',
+    lavender: '#E6E6FA',
+    lavenderblush: '#FFF0F5',
+    lawngreen: '#7CFC00',
+    lemonchiffon: '#FFFACD',
+    lightblue: '#ADD8E6',
+    lightcoral: '#F08080',
+    lightcyan: '#E0FFFF',
+    lightgoldenrodyellow: '#FAFAD2',
+    lightgreen: '#90EE90',
+    lightgrey: '#D3D3D3',
+    lightpink: '#FFB6C1',
+    lightsalmon: '#FFA07A',
+    lightseagreen: '#20B2AA',
+    lightskyblue: '#87CEFA',
+    lightslategray: '#778899',
+    lightslategrey: '#778899',
+    lightsteelblue: '#B0C4DE',
+    lightyellow: '#FFFFE0',
+    limegreen: '#32CD32',
+    linen: '#FAF0E6',
+    magenta: '#FF00FF',
+    mediumaquamarine: '#66CDAA',
+    mediumblue: '#0000CD',
+    mediumorchid: '#BA55D3',
+    mediumpurple: '#9370DB',
+    mediumseagreen: '#3CB371',
+    mediumslateblue: '#7B68EE',
+    mediumspringgreen: '#00FA9A',
+    mediumturquoise: '#48D1CC',
+    mediumvioletred: '#C71585',
+    midnightblue: '#191970',
+    mintcream: '#F5FFFA',
+    mistyrose: '#FFE4E1',
+    moccasin: '#FFE4B5',
+    navajowhite: '#FFDEAD',
+    oldlace: '#FDF5E6',
+    olivedrab: '#6B8E23',
+    orange: '#FFA500',
+    orangered: '#FF4500',
+    orchid: '#DA70D6',
+    palegoldenrod: '#EEE8AA',
+    palegreen: '#98FB98',
+    paleturquoise: '#AFEEEE',
+    palevioletred: '#DB7093',
+    papayawhip: '#FFEFD5',
+    peachpuff: '#FFDAB9',
+    peru: '#CD853F',
+    pink: '#FFC0CB',
+    plum: '#DDA0DD',
+    powderblue: '#B0E0E6',
+    rosybrown: '#BC8F8F',
+    royalblue: '#4169E1',
+    saddlebrown: '#8B4513',
+    salmon: '#FA8072',
+    sandybrown: '#F4A460',
+    seagreen: '#2E8B57',
+    seashell: '#FFF5EE',
+    sienna: '#A0522D',
+    skyblue: '#87CEEB',
+    slateblue: '#6A5ACD',
+    slategray: '#708090',
+    slategrey: '#708090',
+    snow: '#FFFAFA',
+    springgreen: '#00FF7F',
+    steelblue: '#4682B4',
+    tan: '#D2B48C',
+    thistle: '#D8BFD8',
+    tomato: '#FF6347',
+    turquoise: '#40E0D0',
+    violet: '#EE82EE',
+    wheat: '#F5DEB3',
+    whitesmoke: '#F5F5F5',
+    yellowgreen: '#9ACD32'
+  };
+
+
+  function getRgbHslContent(styleString) {
+    var start = styleString.indexOf('(', 3);
+    var end = styleString.indexOf(')', start + 1);
+    var parts = styleString.substring(start + 1, end).split(',');
+    // add alpha if needed
+    if (parts.length == 4 && styleString.substr(3, 1) == 'a') {
+      alpha = Number(parts[3]);
+    } else {
+      parts[3] = 1;
+    }
+    return parts;
+  }
+
+  function percent(s) {
+    return parseFloat(s) / 100;
+  }
+
+  function clamp(v, min, max) {
+    return Math.min(max, Math.max(min, v));
+  }
+
+  function hslToRgb(parts){
+    var r, g, b;
+    h = parseFloat(parts[0]) / 360 % 360;
+    if (h < 0)
+      h++;
+    s = clamp(percent(parts[1]), 0, 1);
+    l = clamp(percent(parts[2]), 0, 1);
+    if (s == 0) {
+      r = g = b = l; // achromatic
+    } else {
+      var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+      var p = 2 * l - q;
+      r = hueToRgb(p, q, h + 1 / 3);
+      g = hueToRgb(p, q, h);
+      b = hueToRgb(p, q, h - 1 / 3);
+    }
+
+    return '#' + decToHex[Math.floor(r * 255)] +
+        decToHex[Math.floor(g * 255)] +
+        decToHex[Math.floor(b * 255)];
+  }
+
+  function hueToRgb(m1, m2, h) {
+    if (h < 0)
+      h++;
+    if (h > 1)
+      h--;
+
+    if (6 * h < 1)
+      return m1 + (m2 - m1) * 6 * h;
+    else if (2 * h < 1)
+      return m2;
+    else if (3 * h < 2)
+      return m1 + (m2 - m1) * (2 / 3 - h) * 6;
+    else
+      return m1;
+  }
+
+  function processStyle(styleString) {
+    var str, alpha = 1;
+
+    styleString = String(styleString);
+    if (styleString.charAt(0) == '#') {
+      str = styleString;
+    } else if (/^rgb/.test(styleString)) {
+      var parts = getRgbHslContent(styleString);
+      var str = '#', n;
+      for (var i = 0; i < 3; i++) {
+        if (parts[i].indexOf('%') != -1) {
+          n = Math.floor(percent(parts[i]) * 255);
+        } else {
+          n = Number(parts[i]);
+        }
+        str += decToHex[clamp(n, 0, 255)];
+      }
+      alpha = parts[3];
+    } else if (/^hsl/.test(styleString)) {
+      var parts = getRgbHslContent(styleString);
+      str = hslToRgb(parts);
+      alpha = parts[3];
+    } else {
+      str = colorData[styleString] || styleString;
+    }
+    return {color: str, alpha: alpha};
+  }
+
+  var DEFAULT_STYLE = {
+    style: 'normal',
+    variant: 'normal',
+    weight: 'normal',
+    size: 10,
+    family: 'sans-serif'
+  };
+
+  // Internal text style cache
+  var fontStyleCache = {};
+
+  function processFontStyle(styleString) {
+    if (fontStyleCache[styleString]) {
+      return fontStyleCache[styleString];
+    }
+
+    var el = document.createElement('div');
+    var style = el.style;
+    try {
+      style.font = styleString;
+    } catch (ex) {
+      // Ignore failures to set to invalid font.
+    }
+
+    return fontStyleCache[styleString] = {
+      style: style.fontStyle || DEFAULT_STYLE.style,
+      variant: style.fontVariant || DEFAULT_STYLE.variant,
+      weight: style.fontWeight || DEFAULT_STYLE.weight,
+      size: style.fontSize || DEFAULT_STYLE.size,
+      family: style.fontFamily || DEFAULT_STYLE.family
+    };
+  }
+
+  function getComputedStyle(style, element) {
+    var computedStyle = {};
+
+    for (var p in style) {
+      computedStyle[p] = style[p];
+    }
+
+    // Compute the size
+    var canvasFontSize = parseFloat(element.currentStyle.fontSize),
+        fontSize = parseFloat(style.size);
+
+    if (typeof style.size == 'number') {
+      computedStyle.size = style.size;
+    } else if (style.size.indexOf('px') != -1) {
+      computedStyle.size = fontSize;
+    } else if (style.size.indexOf('em') != -1) {
+      computedStyle.size = canvasFontSize * fontSize;
+    } else if(style.size.indexOf('%') != -1) {
+      computedStyle.size = (canvasFontSize / 100) * fontSize;
+    } else if (style.size.indexOf('pt') != -1) {
+      computedStyle.size = fontSize / .75;
+    } else {
+      computedStyle.size = canvasFontSize;
+    }
+
+    // Different scaling between normal text and VML text. This was found using
+    // trial and error to get the same size as non VML text.
+    computedStyle.size *= 0.981;
+
+    return computedStyle;
+  }
+
+  function buildStyle(style) {
+    return style.style + ' ' + style.variant + ' ' + style.weight + ' ' +
+        style.size + 'px ' + style.family;
+  }
+
+  function processLineCap(lineCap) {
+    switch (lineCap) {
+      case 'butt':
+        return 'flat';
+      case 'round':
+        return 'round';
+      case 'square':
+      default:
+        return 'square';
+    }
+  }
+
+  /**
+   * This class implements CanvasRenderingContext2D interface as described by
+   * the WHATWG.
+   * @param {HTMLElement} surfaceElement The element that the 2D context should
+   * be associated with
+   */
+  function CanvasRenderingContext2D_(surfaceElement) {
+    this.m_ = createMatrixIdentity();
+
+    this.mStack_ = [];
+    this.aStack_ = [];
+    this.currentPath_ = [];
+
+    // Canvas context properties
+    this.strokeStyle = '#000';
+    this.fillStyle = '#000';
+
+    this.lineWidth = 1;
+    this.lineJoin = 'miter';
+    this.lineCap = 'butt';
+    this.miterLimit = Z * 1;
+    this.globalAlpha = 1;
+    this.font = '10px sans-serif';
+    this.textAlign = 'left';
+    this.textBaseline = 'alphabetic';
+    this.canvas = surfaceElement;
+
+    var el = surfaceElement.ownerDocument.createElement('div');
+    el.style.width =  surfaceElement.clientWidth + 'px';
+    el.style.height = surfaceElement.clientHeight + 'px';
+    el.style.overflow = 'hidden';
+    el.style.position = 'absolute';
+    surfaceElement.appendChild(el);
+
+    this.element_ = el;
+    this.arcScaleX_ = 1;
+    this.arcScaleY_ = 1;
+    this.lineScale_ = 1;
+  }
+
+  var contextPrototype = CanvasRenderingContext2D_.prototype;
+  contextPrototype.clearRect = function() {
+    if (this.textMeasureEl_) {
+      this.textMeasureEl_.removeNode(true);
+      this.textMeasureEl_ = null;
+    }
+    this.element_.innerHTML = '';
+  };
+
+  contextPrototype.beginPath = function() {
+    // TODO: Branch current matrix so that save/restore has no effect
+    //       as per safari docs.
+    this.currentPath_ = [];
+  };
+
+  contextPrototype.moveTo = function(aX, aY) {
+    var p = this.getCoords_(aX, aY);
+    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
+    this.currentX_ = p.x;
+    this.currentY_ = p.y;
+  };
+
+  contextPrototype.lineTo = function(aX, aY) {
+    var p = this.getCoords_(aX, aY);
+    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
+
+    this.currentX_ = p.x;
+    this.currentY_ = p.y;
+  };
+
+  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
+                                            aCP2x, aCP2y,
+                                            aX, aY) {
+    var p = this.getCoords_(aX, aY);
+    var cp1 = this.getCoords_(aCP1x, aCP1y);
+    var cp2 = this.getCoords_(aCP2x, aCP2y);
+    bezierCurveTo(this, cp1, cp2, p);
+  };
+
+  // Helper function that takes the already fixed cordinates.
+  function bezierCurveTo(self, cp1, cp2, p) {
+    self.currentPath_.push({
+      type: 'bezierCurveTo',
+      cp1x: cp1.x,
+      cp1y: cp1.y,
+      cp2x: cp2.x,
+      cp2y: cp2.y,
+      x: p.x,
+      y: p.y
+    });
+    self.currentX_ = p.x;
+    self.currentY_ = p.y;
+  }
+
+  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
+    // the following is lifted almost directly from
+    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
+
+    var cp = this.getCoords_(aCPx, aCPy);
+    var p = this.getCoords_(aX, aY);
+
+    var cp1 = {
+      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
+      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
+    };
+    var cp2 = {
+      x: cp1.x + (p.x - this.currentX_) / 3.0,
+      y: cp1.y + (p.y - this.currentY_) / 3.0
+    };
+
+    bezierCurveTo(this, cp1, cp2, p);
+  };
+
+  contextPrototype.arc = function(aX, aY, aRadius,
+                                  aStartAngle, aEndAngle, aClockwise) {
+    aRadius *= Z;
+    var arcType = aClockwise ? 'at' : 'wa';
+
+    var xStart = aX + mc(aStartAngle) * aRadius - Z2;
+    var yStart = aY + ms(aStartAngle) * aRadius - Z2;
+
+    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
+    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
+
+    // IE won't render arches drawn counter clockwise if xStart == xEnd.
+    if (xStart == xEnd && !aClockwise) {
+      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
+                       // that can be represented in binary
+    }
+
+    var p = this.getCoords_(aX, aY);
+    var pStart = this.getCoords_(xStart, yStart);
+    var pEnd = this.getCoords_(xEnd, yEnd);
+
+    this.currentPath_.push({type: arcType,
+                           x: p.x,
+                           y: p.y,
+                           radius: aRadius,
+                           xStart: pStart.x,
+                           yStart: pStart.y,
+                           xEnd: pEnd.x,
+                           yEnd: pEnd.y});
+
+  };
+
+  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
+    this.moveTo(aX, aY);
+    this.lineTo(aX + aWidth, aY);
+    this.lineTo(aX + aWidth, aY + aHeight);
+    this.lineTo(aX, aY + aHeight);
+    this.closePath();
+  };
+
+  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
+    var oldPath = this.currentPath_;
+    this.beginPath();
+
+    this.moveTo(aX, aY);
+    this.lineTo(aX + aWidth, aY);
+    this.lineTo(aX + aWidth, aY + aHeight);
+    this.lineTo(aX, aY + aHeight);
+    this.closePath();
+    this.stroke();
+
+    this.currentPath_ = oldPath;
+  };
+
+  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
+    var oldPath = this.currentPath_;
+    this.beginPath();
+
+    this.moveTo(aX, aY);
+    this.lineTo(aX + aWidth, aY);
+    this.lineTo(aX + aWidth, aY + aHeight);
+    this.lineTo(aX, aY + aHeight);
+    this.closePath();
+    this.fill();
+
+    this.currentPath_ = oldPath;
+  };
+
+  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
+    var gradient = new CanvasGradient_('gradient');
+    gradient.x0_ = aX0;
+    gradient.y0_ = aY0;
+    gradient.x1_ = aX1;
+    gradient.y1_ = aY1;
+    return gradient;
+  };
+
+  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
+                                                   aX1, aY1, aR1) {
+    var gradient = new CanvasGradient_('gradientradial');
+    gradient.x0_ = aX0;
+    gradient.y0_ = aY0;
+    gradient.r0_ = aR0;
+    gradient.x1_ = aX1;
+    gradient.y1_ = aY1;
+    gradient.r1_ = aR1;
+    return gradient;
+  };
+
+  contextPrototype.drawImage = function(image, var_args) {
+    var dx, dy, dw, dh, sx, sy, sw, sh;
+
+    // to find the original width we overide the width and height
+    var oldRuntimeWidth = image.runtimeStyle.width;
+    var oldRuntimeHeight = image.runtimeStyle.height;
+    image.runtimeStyle.width = 'auto';
+    image.runtimeStyle.height = 'auto';
+
+    // get the original size
+    var w = image.width;
+    var h = image.height;
+
+    // and remove overides
+    image.runtimeStyle.width = oldRuntimeWidth;
+    image.runtimeStyle.height = oldRuntimeHeight;
+
+    if (arguments.length == 3) {
+      dx = arguments[1];
+      dy = arguments[2];
+      sx = sy = 0;
+      sw = dw = w;
+      sh = dh = h;
+    } else if (arguments.length == 5) {
+      dx = arguments[1];
+      dy = arguments[2];
+      dw = arguments[3];
+      dh = arguments[4];
+      sx = sy = 0;
+      sw = w;
+      sh = h;
+    } else if (arguments.length == 9) {
+      sx = arguments[1];
+      sy = arguments[2];
+      sw = arguments[3];
+      sh = arguments[4];
+      dx = arguments[5];
+      dy = arguments[6];
+      dw = arguments[7];
+      dh = arguments[8];
+    } else {
+      throw Error('Invalid number of arguments');
+    }
+
+    var d = this.getCoords_(dx, dy);
+
+    var w2 = sw / 2;
+    var h2 = sh / 2;
+
+    var vmlStr = [];
+
+    var W = 10;
+    var H = 10;
+
+    // For some reason that I've now forgotten, using divs didn't work
+    vmlStr.push(' <g_vml_:group',
+                ' coordsize="', Z * W, ',', Z * H, '"',
+                ' coordorigin="0,0"' ,
+                ' style="width:', W, 'px;height:', H, 'px;position:absolute;');
+
+    // If filters are necessary (rotation exists), create them
+    // filters are bog-slow, so only create them if abbsolutely necessary
+    // The following check doesn't account for skews (which don't exist
+    // in the canvas spec (yet) anyway.
+
+    if (this.m_[0][0] != 1 || this.m_[0][1] ||
+        this.m_[1][1] != 1 || this.m_[1][0]) {
+      var filter = [];
+
+      // Note the 12/21 reversal
+      filter.push('M11=', this.m_[0][0], ',',
+                  'M12=', this.m_[1][0], ',',
+                  'M21=', this.m_[0][1], ',',
+                  'M22=', this.m_[1][1], ',',
+                  'Dx=', mr(d.x / Z), ',',
+                  'Dy=', mr(d.y / Z), '');
+
+      // Bounding box calculation (need to minimize displayed area so that
+      // filters don't waste time on unused pixels.
+      var max = d;
+      var c2 = this.getCoords_(dx + dw, dy);
+      var c3 = this.getCoords_(dx, dy + dh);
+      var c4 = this.getCoords_(dx + dw, dy + dh);
+
+      max.x = m.max(max.x, c2.x, c3.x, c4.x);
+      max.y = m.max(max.y, c2.y, c3.y, c4.y);
+
+      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),
+                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',
+                  filter.join(''), ", sizingmethod='clip');");
+
+    } else {
+      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');
+    }
+
+    vmlStr.push(' ">' ,
+                '<g_vml_:image src="', image.src, '"',
+                ' style="width:', Z * dw, 'px;',
+                ' height:', Z * dh, 'px"',
+                ' cropleft="', sx / w, '"',
+                ' croptop="', sy / h, '"',
+                ' cropright="', (w - sx - sw) / w, '"',
+                ' cropbottom="', (h - sy - sh) / h, '"',
+                ' />',
+                '</g_vml_:group>');
+
+    this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
+  };
+
+  contextPrototype.stroke = function(aFill) {
+    var W = 10;
+    var H = 10;
+    // Divide the shape into chunks if it's too long because IE has a limit
+    // somewhere for how long a VML shape can be. This simple division does
+    // not work with fills, only strokes, unfortunately.
+    var chunkSize = 5000;
+
+    var min = {x: null, y: null};
+    var max = {x: null, y: null};
+
+    for (var j = 0; j < this.currentPath_.length; j += chunkSize) {
+      var lineStr = [];
+      var lineOpen = false;
+
+      lineStr.push('<g_vml_:shape',
+                   ' filled="', !!aFill, '"',
+                   ' style="position:absolute;width:', W, 'px;height:', H, 'px;"',
+                   ' coordorigin="0,0"',
+                   ' coordsize="', Z * W, ',', Z * H, '"',
+                   ' stroked="', !aFill, '"',
+                   ' path="');
+
+      var newSeq = false;
+
+      for (var i = j; i < Math.min(j + chunkSize, this.currentPath_.length); i++) {
+        if (i % chunkSize == 0 && i > 0) { // move into position for next chunk
+          lineStr.push(' m ', mr(this.currentPath_[i-1].x), ',', mr(this.currentPath_[i-1].y));
+        }
+
+        var p = this.currentPath_[i];
+        var c;
+
+        switch (p.type) {
+          case 'moveTo':
+            c = p;
+            lineStr.push(' m ', mr(p.x), ',', mr(p.y));
+            break;
+          case 'lineTo':
+            lineStr.push(' l ', mr(p.x), ',', mr(p.y));
+            break;
+          case 'close':
+            lineStr.push(' x ');
+            p = null;
+            break;
+          case 'bezierCurveTo':
+            lineStr.push(' c ',
+                         mr(p.cp1x), ',', mr(p.cp1y), ',',
+                         mr(p.cp2x), ',', mr(p.cp2y), ',',
+                         mr(p.x), ',', mr(p.y));
+            break;
+          case 'at':
+          case 'wa':
+            lineStr.push(' ', p.type, ' ',
+                         mr(p.x - this.arcScaleX_ * p.radius), ',',
+                         mr(p.y - this.arcScaleY_ * p.radius), ' ',
+                         mr(p.x + this.arcScaleX_ * p.radius), ',',
+                         mr(p.y + this.arcScaleY_ * p.radius), ' ',
+                         mr(p.xStart), ',', mr(p.yStart), ' ',
+                         mr(p.xEnd), ',', mr(p.yEnd));
+            break;
+        }
+  
+  
+        // TODO: Following is broken for curves due to
+        //       move to proper paths.
+  
+        // Figure out dimensions so we can do gradient fills
+        // properly
+        if (p) {
+          if (min.x == null || p.x < min.x) {
+            min.x = p.x;
+          }
+          if (max.x == null || p.x > max.x) {
+            max.x = p.x;
+          }
+          if (min.y == null || p.y < min.y) {
+            min.y = p.y;
+          }
+          if (max.y == null || p.y > max.y) {
+            max.y = p.y;
+          }
+        }
+      }
+      lineStr.push(' ">');
+  
+      if (!aFill) {
+        appendStroke(this, lineStr);
+      } else {
+        appendFill(this, lineStr, min, max);
+      }
+  
+      lineStr.push('</g_vml_:shape>');
+  
+      this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
+    }
+  };
+
+  function appendStroke(ctx, lineStr) {
+    var a = processStyle(ctx.strokeStyle);
+    var color = a.color;
+    var opacity = a.alpha * ctx.globalAlpha;
+    var lineWidth = ctx.lineScale_ * ctx.lineWidth;
+
+    // VML cannot correctly render a line if the width is less than 1px.
+    // In that case, we dilute the color to make the line look thinner.
+    if (lineWidth < 1) {
+      opacity *= lineWidth;
+    }
+
+    lineStr.push(
+      '<g_vml_:stroke',
+      ' opacity="', opacity, '"',
+      ' joinstyle="', ctx.lineJoin, '"',
+      ' miterlimit="', ctx.miterLimit, '"',
+      ' endcap="', processLineCap(ctx.lineCap), '"',
+      ' weight="', lineWidth, 'px"',
+      ' color="', color, '" />'
+    );
+  }
+
+  function appendFill(ctx, lineStr, min, max) {
+    var fillStyle = ctx.fillStyle;
+    var arcScaleX = ctx.arcScaleX_;
+    var arcScaleY = ctx.arcScaleY_;
+    var width = max.x - min.x;
+    var height = max.y - min.y;
+    if (fillStyle instanceof CanvasGradient_) {
+      // TODO: Gradients transformed with the transformation matrix.
+      var angle = 0;
+      var focus = {x: 0, y: 0};
+
+      // additional offset
+      var shift = 0;
+      // scale factor for offset
+      var expansion = 1;
+
+      if (fillStyle.type_ == 'gradient') {
+        var x0 = fillStyle.x0_ / arcScaleX;
+        var y0 = fillStyle.y0_ / arcScaleY;
+        var x1 = fillStyle.x1_ / arcScaleX;
+        var y1 = fillStyle.y1_ / arcScaleY;
+        var p0 = ctx.getCoords_(x0, y0);
+        var p1 = ctx.getCoords_(x1, y1);
+        var dx = p1.x - p0.x;
+        var dy = p1.y - p0.y;
+        angle = Math.atan2(dx, dy) * 180 / Math.PI;
+
+        // The angle should be a non-negative number.
+        if (angle < 0) {
+          angle += 360;
+        }
+
+        // Very small angles produce an unexpected result because they are
+        // converted to a scientific notation string.
+        if (angle < 1e-6) {
+          angle = 0;
+        }
+      } else {
+        var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_);
+        focus = {
+          x: (p0.x - min.x) / width,
+          y: (p0.y - min.y) / height
+        };
+
+        width  /= arcScaleX * Z;
+        height /= arcScaleY * Z;
+        var dimension = m.max(width, height);
+        shift = 2 * fillStyle.r0_ / dimension;
+        expansion = 2 * fillStyle.r1_ / dimension - shift;
+      }
+
+      // We need to sort the color stops in ascending order by offset,
+      // otherwise IE won't interpret it correctly.
+      var stops = fillStyle.colors_;
+      stops.sort(function(cs1, cs2) {
+        return cs1.offset - cs2.offset;
+      });
+
+      var length = stops.length;
+      var color1 = stops[0].color;
+      var color2 = stops[length - 1].color;
+      var opacity1 = stops[0].alpha * ctx.globalAlpha;
+      var opacity2 = stops[length - 1].alpha * ctx.globalAlpha;
+
+      var colors = [];
+      for (var i = 0; i < length; i++) {
+        var stop = stops[i];
+        colors.push(stop.offset * expansion + shift + ' ' + stop.color);
+      }
+
+      // When colors attribute is used, the meanings of opacity and o:opacity2
+      // are reversed.
+      lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"',
+                   ' method="none" focus="100%"',
+                   ' color="', color1, '"',
+                   ' color2="', color2, '"',
+                   ' colors="', colors.join(','), '"',
+                   ' opacity="', opacity2, '"',
+                   ' g_o_:opacity2="', opacity1, '"',
+                   ' angle="', angle, '"',
+                   ' focusposition="', focus.x, ',', focus.y, '" />');
+    } else if (fillStyle instanceof CanvasPattern_) {
+      if (width && height) {
+        var deltaLeft = -min.x;
+        var deltaTop = -min.y;
+        lineStr.push('<g_vml_:fill',
+                     ' position="',
+                     deltaLeft / width * arcScaleX * arcScaleX, ',',
+                     deltaTop / height * arcScaleY * arcScaleY, '"',
+                     ' type="tile"',
+                     // TODO: Figure out the correct size to fit the scale.
+                     //' size="', w, 'px ', h, 'px"',
+                     ' src="', fillStyle.src_, '" />');
+       }
+    } else {
+      var a = processStyle(ctx.fillStyle);
+      var color = a.color;
+      var opacity = a.alpha * ctx.globalAlpha;
+      lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity,
+                   '" />');
+    }
+  }
+
+  contextPrototype.fill = function() {
+    this.stroke(true);
+  };
+
+  contextPrototype.closePath = function() {
+    this.currentPath_.push({type: 'close'});
+  };
+
+  /**
+   * @private
+   */
+  contextPrototype.getCoords_ = function(aX, aY) {
+    var m = this.m_;
+    return {
+      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
+      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
+    };
+  };
+
+  contextPrototype.save = function() {
+    var o = {};
+    copyState(this, o);
+    this.aStack_.push(o);
+    this.mStack_.push(this.m_);
+    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
+  };
+
+  contextPrototype.restore = function() {
+    if (this.aStack_.length) {
+      copyState(this.aStack_.pop(), this);
+      this.m_ = this.mStack_.pop();
+    }
+  };
+
+  function matrixIsFinite(m) {
+    return isFinite(m[0][0]) && isFinite(m[0][1]) &&
+        isFinite(m[1][0]) && isFinite(m[1][1]) &&
+        isFinite(m[2][0]) && isFinite(m[2][1]);
+  }
+
+  function setM(ctx, m, updateLineScale) {
+    if (!matrixIsFinite(m)) {
+      return;
+    }
+    ctx.m_ = m;
+
+    if (updateLineScale) {
+      // Get the line scale.
+      // Determinant of this.m_ means how much the area is enlarged by the
+      // transformation. So its square root can be used as a scale factor
+      // for width.
+      var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
+      ctx.lineScale_ = sqrt(abs(det));
+    }
+  }
+
+  contextPrototype.translate = function(aX, aY) {
+    var m1 = [
+      [1,  0,  0],
+      [0,  1,  0],
+      [aX, aY, 1]
+    ];
+
+    setM(this, matrixMultiply(m1, this.m_), false);
+  };
+
+  contextPrototype.rotate = function(aRot) {
+    var c = mc(aRot);
+    var s = ms(aRot);
+
+    var m1 = [
+      [c,  s, 0],
+      [-s, c, 0],
+      [0,  0, 1]
+    ];
+
+    setM(this, matrixMultiply(m1, this.m_), false);
+  };
+
+  contextPrototype.scale = function(aX, aY) {
+    this.arcScaleX_ *= aX;
+    this.arcScaleY_ *= aY;
+    var m1 = [
+      [aX, 0,  0],
+      [0,  aY, 0],
+      [0,  0,  1]
+    ];
+
+    setM(this, matrixMultiply(m1, this.m_), true);
+  };
+
+  contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
+    var m1 = [
+      [m11, m12, 0],
+      [m21, m22, 0],
+      [dx,  dy,  1]
+    ];
+
+    setM(this, matrixMultiply(m1, this.m_), true);
+  };
+
+  contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
+    var m = [
+      [m11, m12, 0],
+      [m21, m22, 0],
+      [dx,  dy,  1]
+    ];
+
+    setM(this, m, true);
+  };
+
+  /**
+   * The text drawing function.
+   * The maxWidth argument isn't taken in account, since no browser supports
+   * it yet.
+   */
+  contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) {
+    var m = this.m_,
+        delta = 1000,
+        left = 0,
+        right = delta,
+        offset = {x: 0, y: 0},
+        lineStr = [];
+
+    var fontStyle = getComputedStyle(processFontStyle(this.font),
+                                     this.element_);
+
+    var fontStyleString = buildStyle(fontStyle);
+
+    var elementStyle = this.element_.currentStyle;
+    var textAlign = this.textAlign.toLowerCase();
+    switch (textAlign) {
+      case 'left':
+      case 'center':
+      case 'right':
+        break;
+      case 'end':
+        textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left';
+        break;
+      case 'start':
+        textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left';
+        break;
+      default:
+        textAlign = 'left';
+    }
+
+    // 1.75 is an arbitrary number, as there is no info about the text baseline
+    switch (this.textBaseline) {
+      case 'hanging':
+      case 'top':
+        offset.y = fontStyle.size / 1.75;
+        break;
+      case 'middle':
+        break;
+      default:
+      case null:
+      case 'alphabetic':
+      case 'ideographic':
+      case 'bottom':
+        offset.y = -fontStyle.size / 2.25;
+        break;
+    }
+
+    switch(textAlign) {
+      case 'right':
+        left = delta;
+        right = 0.05;
+        break;
+      case 'center':
+        left = right = delta / 2;
+        break;
+    }
+
+    var d = this.getCoords_(x + offset.x, y + offset.y);
+
+    lineStr.push('<g_vml_:line from="', -left ,' 0" to="', right ,' 0.05" ',
+                 ' coordsize="100 100" coordorigin="0 0"',
+                 ' filled="', !stroke, '" stroked="', !!stroke,
+                 '" style="position:absolute;width:1px;height:1px;">');
+
+    if (stroke) {
+      appendStroke(this, lineStr);
+    } else {
+      // TODO: Fix the min and max params.
+      appendFill(this, lineStr, {x: -left, y: 0},
+                 {x: right, y: fontStyle.size});
+    }
+
+    var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' +
+                m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0';
+
+    var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z);
+
+    lineStr.push('<g_vml_:skew on="t" matrix="', skewM ,'" ',
+                 ' offset="', skewOffset, '" origin="', left ,' 0" />',
+                 '<g_vml_:path textpathok="true" />',
+                 '<g_vml_:textpath on="true" string="',
+                 encodeHtmlAttribute(text),
+                 '" style="v-text-align:', textAlign,
+                 ';font:', encodeHtmlAttribute(fontStyleString),
+                 '" /></g_vml_:line>');
+
+    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
+  };
+
+  contextPrototype.fillText = function(text, x, y, maxWidth) {
+    this.drawText_(text, x, y, maxWidth, false);
+  };
+
+  contextPrototype.strokeText = function(text, x, y, maxWidth) {
+    this.drawText_(text, x, y, maxWidth, true);
+  };
+
+  contextPrototype.measureText = function(text) {
+    if (!this.textMeasureEl_) {
+      var s = '<span style="position:absolute;' +
+          'top:-20000px;left:0;padding:0;margin:0;border:none;' +
+          'white-space:pre;"></span>';
+      this.element_.insertAdjacentHTML('beforeEnd', s);
+      this.textMeasureEl_ = this.element_.lastChild;
+    }
+    var doc = this.element_.ownerDocument;
+    this.textMeasureEl_.innerHTML = '';
+    this.textMeasureEl_.style.font = this.font;
+    // Don't use innerHTML or innerText because they allow markup/whitespace.
+    this.textMeasureEl_.appendChild(doc.createTextNode(text));
+    return {width: this.textMeasureEl_.offsetWidth};
+  };
+
+  /******** STUBS ********/
+  contextPrototype.clip = function() {
+    // TODO: Implement
+  };
+
+  contextPrototype.arcTo = function() {
+    // TODO: Implement
+  };
+
+  contextPrototype.createPattern = function(image, repetition) {
+    return new CanvasPattern_(image, repetition);
+  };
+
+  // Gradient / Pattern Stubs
+  function CanvasGradient_(aType) {
+    this.type_ = aType;
+    this.x0_ = 0;
+    this.y0_ = 0;
+    this.r0_ = 0;
+    this.x1_ = 0;
+    this.y1_ = 0;
+    this.r1_ = 0;
+    this.colors_ = [];
+  }
+
+  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
+    aColor = processStyle(aColor);
+    this.colors_.push({offset: aOffset,
+                       color: aColor.color,
+                       alpha: aColor.alpha});
+  };
+
+  function CanvasPattern_(image, repetition) {
+    assertImageIsValid(image);
+    switch (repetition) {
+      case 'repeat':
+      case null:
+      case '':
+        this.repetition_ = 'repeat';
+        break
+      case 'repeat-x':
+      case 'repeat-y':
+      case 'no-repeat':
+        this.repetition_ = repetition;
+        break;
+      default:
+        throwException('SYNTAX_ERR');
+    }
+
+    this.src_ = image.src;
+    this.width_ = image.width;
+    this.height_ = image.height;
+  }
+
+  function throwException(s) {
+    throw new DOMException_(s);
+  }
+
+  function assertImageIsValid(img) {
+    if (!img || img.nodeType != 1 || img.tagName != 'IMG') {
+      throwException('TYPE_MISMATCH_ERR');
+    }
+    if (img.readyState != 'complete') {
+      throwException('INVALID_STATE_ERR');
+    }
+  }
+
+  function DOMException_(s) {
+    this.code = this[s];
+    this.message = s +': DOM Exception ' + this.code;
+  }
+  var p = DOMException_.prototype = new Error;
+  p.INDEX_SIZE_ERR = 1;
+  p.DOMSTRING_SIZE_ERR = 2;
+  p.HIERARCHY_REQUEST_ERR = 3;
+  p.WRONG_DOCUMENT_ERR = 4;
+  p.INVALID_CHARACTER_ERR = 5;
+  p.NO_DATA_ALLOWED_ERR = 6;
+  p.NO_MODIFICATION_ALLOWED_ERR = 7;
+  p.NOT_FOUND_ERR = 8;
+  p.NOT_SUPPORTED_ERR = 9;
+  p.INUSE_ATTRIBUTE_ERR = 10;
+  p.INVALID_STATE_ERR = 11;
+  p.SYNTAX_ERR = 12;
+  p.INVALID_MODIFICATION_ERR = 13;
+  p.NAMESPACE_ERR = 14;
+  p.INVALID_ACCESS_ERR = 15;
+  p.VALIDATION_ERR = 16;
+  p.TYPE_MISMATCH_ERR = 17;
+
+  // set up externs
+  G_vmlCanvasManager = G_vmlCanvasManager_;
+  CanvasRenderingContext2D = CanvasRenderingContext2D_;
+  CanvasGradient = CanvasGradient_;
+  CanvasPattern = CanvasPattern_;
+  DOMException = DOMException_;
+})();
+
+} // if
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/excanvas.min.js 2.3.1.src/ext/flot/excanvas.min.js
--- 2.2rc2a.cp.src/ext/flot/excanvas.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/excanvas.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()};
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.colorhelpers.js 2.3.1.src/ext/flot/jquery.colorhelpers.js
--- 2.2rc2a.cp.src/ext/flot/jquery.colorhelpers.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.colorhelpers.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,174 @@
+/* Plugin for jQuery for working with colors.
+ * 
+ * Version 1.0.
+ * 
+ * Inspiration from jQuery color animation plugin by John Resig.
+ *
+ * Released under the MIT license by Ole Laursen, October 2009.
+ *
+ * Examples:
+ *
+ *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
+ *   var c = $.color.extract($("#mydiv"), 'background-color');
+ *   console.log(c.r, c.g, c.b, c.a);
+ *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
+ *
+ * Note that .scale() and .add() work in-place instead of returning
+ * new objects.
+ */ 
+
+(function() {
+    jQuery.color = {};
+
+    // construct color object with some convenient chainable helpers
+    jQuery.color.make = function (r, g, b, a) {
+        var o = {};
+        o.r = r || 0;
+        o.g = g || 0;
+        o.b = b || 0;
+        o.a = a != null ? a : 1;
+
+        o.add = function (c, d) {
+            for (var i = 0; i < c.length; ++i)
+                o[c.charAt(i)] += d;
+            return o.normalize();
+        };
+        
+        o.scale = function (c, f) {
+            for (var i = 0; i < c.length; ++i)
+                o[c.charAt(i)] *= f;
+            return o.normalize();
+        };
+        
+        o.toString = function () {
+            if (o.a >= 1.0) {
+                return "rgb("+[o.r, o.g, o.b].join(",")+")";
+            } else {
+                return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")";
+            }
+        };
+
+        o.normalize = function () {
+            function clamp(min, value, max) {
+                return value < min ? min: (value > max ? max: value);
+            }
+            
+            o.r = clamp(0, parseInt(o.r), 255);
+            o.g = clamp(0, parseInt(o.g), 255);
+            o.b = clamp(0, parseInt(o.b), 255);
+            o.a = clamp(0, o.a, 1);
+            return o;
+        };
+
+        o.clone = function () {
+            return jQuery.color.make(o.r, o.b, o.g, o.a);
+        };
+
+        return o.normalize();
+    }
+
+    // extract CSS color property from element, going up in the DOM
+    // if it's "transparent"
+    jQuery.color.extract = function (elem, css) {
+        var c;
+        do {
+            c = elem.css(css).toLowerCase();
+            // keep going until we find an element that has color, or
+            // we hit the body
+            if (c != '' && c != 'transparent')
+                break;
+            elem = elem.parent();
+        } while (!jQuery.nodeName(elem.get(0), "body"));
+
+        // catch Safari's way of signalling transparent
+        if (c == "rgba(0, 0, 0, 0)")
+            c = "transparent";
+        
+        return jQuery.color.parse(c);
+    }
+    
+    // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"),
+    // returns color object
+    jQuery.color.parse = function (str) {
+        var res, m = jQuery.color.make;
+
+        // Look for rgb(num,num,num)
+        if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))
+            return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10));
+        
+        // Look for rgba(num,num,num,num)
+        if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
+            return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4]));
+            
+        // Look for rgb(num%,num%,num%)
+        if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))
+            return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55);
+
+        // Look for rgba(num%,num%,num%,num)
+        if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))
+            return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4]));
+        
+        // Look for #a0b1c2
+        if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))
+            return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16));
+
+        // Look for #fff
+        if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))
+            return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16));
+
+        // Otherwise, we're most likely dealing with a named color
+        var name = jQuery.trim(str).toLowerCase();
+        if (name == "transparent")
+            return m(255, 255, 255, 0);
+        else {
+            res = lookupColors[name];
+            return m(res[0], res[1], res[2]);
+        }
+    }
+    
+    var lookupColors = {
+        aqua:[0,255,255],
+        azure:[240,255,255],
+        beige:[245,245,220],
+        black:[0,0,0],
+        blue:[0,0,255],
+        brown:[165,42,42],
+        cyan:[0,255,255],
+        darkblue:[0,0,139],
+        darkcyan:[0,139,139],
+        darkgrey:[169,169,169],
+        darkgreen:[0,100,0],
+        darkkhaki:[189,183,107],
+        darkmagenta:[139,0,139],
+        darkolivegreen:[85,107,47],
+        darkorange:[255,140,0],
+        darkorchid:[153,50,204],
+        darkred:[139,0,0],
+        darksalmon:[233,150,122],
+        darkviolet:[148,0,211],
+        fuchsia:[255,0,255],
+        gold:[255,215,0],
+        green:[0,128,0],
+        indigo:[75,0,130],
+        khaki:[240,230,140],
+        lightblue:[173,216,230],
+        lightcyan:[224,255,255],
+        lightgreen:[144,238,144],
+        lightgrey:[211,211,211],
+        lightpink:[255,182,193],
+        lightyellow:[255,255,224],
+        lime:[0,255,0],
+        magenta:[255,0,255],
+        maroon:[128,0,0],
+        navy:[0,0,128],
+        olive:[128,128,0],
+        orange:[255,165,0],
+        pink:[255,192,203],
+        purple:[128,0,128],
+        violet:[128,0,128],
+        red:[255,0,0],
+        silver:[192,192,192],
+        white:[255,255,255],
+        yellow:[255,255,0]
+    };    
+})();
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.colorhelpers.min.js 2.3.1.src/ext/flot/jquery.colorhelpers.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.colorhelpers.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.colorhelpers.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(){jQuery.color={};jQuery.color.make=function(E,D,B,C){var F={};F.r=E||0;F.g=D||0;F.b=B||0;F.a=C!=null?C:1;F.add=function(I,H){for(var G=0;G<I.length;++G){F[I.charAt(G)]+=H}return F.normalize()};F.scale=function(I,H){for(var G=0;G<I.length;++G){F[I.charAt(G)]*=H}return F.normalize()};F.toString=function(){if(F.a>=1){return"rgb("+[F.r,F.g,F.b].join(",")+")"}else{return"rgba("+[F.r,F.g,F.b,F.a].join(",")+")"}};F.normalize=function(){function G(I,J,H){return J<I?I:(J>H?H:J)}F.r=G(0,parseInt(F.r),255);F.g=G(0,parseInt(F.g),255);F.b=G(0,parseInt(F.b),255);F.a=G(0,F.a,1);return F};F.clone=function(){return jQuery.color.make(F.r,F.b,F.g,F.a)};return F.normalize()};jQuery.color.extract=function(C,B){var D;do{D=C.css(B).toLowerCase();if(D!=""&&D!="transparent"){break}C=C.parent()}while(!jQuery.nodeName(C.get(0),"body"));if(D=="rgba(0, 0, 0, 0)"){D="transparent"}return jQuery.color.parse(D)};jQuery.color.parse=function(E){var D,B=jQuery.color.make;if(D=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10))}if(D=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10),parseFloat(D[4]))}if(D=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55)}if(D=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55,parseFloat(D[4]))}if(D=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(E)){return B(parseInt(D[1],16),parseInt(D[2],16),parseInt(D[3],16))}if(D=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(E)){return B(parseInt(D[1]+D[1],16),parseInt(D[2]+D[2],16),parseInt(D[3]+D[3],16))}var C=jQuery.trim(E).toLowerCase();if(C=="transparent"){return B(255,255,255,0)}else{D=A[C];return B(D[0],D[1],D[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.crosshair.js 2.3.1.src/ext/flot/jquery.flot.crosshair.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.crosshair.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.crosshair.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,156 @@
+/*
+Flot plugin for showing a crosshair, thin lines, when the mouse hovers
+over the plot.
+
+  crosshair: {
+    mode: null or "x" or "y" or "xy"
+    color: color
+    lineWidth: number
+  }
+
+Set the mode to one of "x", "y" or "xy". The "x" mode enables a
+vertical crosshair that lets you trace the values on the x axis, "y"
+enables a horizontal crosshair and "xy" enables them both. "color" is
+the color of the crosshair (default is "rgba(170, 0, 0, 0.80)"),
+"lineWidth" is the width of the drawn lines (default is 1).
+
+The plugin also adds four public methods:
+
+  - setCrosshair(pos)
+
+    Set the position of the crosshair. Note that this is cleared if
+    the user moves the mouse. "pos" should be on the form { x: xpos,
+    y: ypos } (or x2 and y2 if you're using the secondary axes), which
+    is coincidentally the same format as what you get from a "plothover"
+    event. If "pos" is null, the crosshair is cleared.
+
+  - clearCrosshair()
+
+    Clear the crosshair.
+
+  - lockCrosshair(pos)
+
+    Cause the crosshair to lock to the current location, no longer
+    updating if the user moves the mouse. Optionally supply a position
+    (passed on to setCrosshair()) to move it to.
+
+    Example usage:
+      var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
+      $("#graph").bind("plothover", function (evt, position, item) {
+        if (item) {
+          // Lock the crosshair to the data point being hovered
+          myFlot.lockCrosshair({ x: item.datapoint[0], y: item.datapoint[1] });
+        }
+        else {
+          // Return normal crosshair operation
+          myFlot.unlockCrosshair();
+        }
+      });
+
+  - unlockCrosshair()
+
+    Free the crosshair to move again after locking it.
+*/
+
+(function ($) {
+    var options = {
+        crosshair: {
+            mode: null, // one of null, "x", "y" or "xy",
+            color: "rgba(170, 0, 0, 0.80)",
+            lineWidth: 1
+        }
+    };
+    
+    function init(plot) {
+        // position of crosshair in pixels
+        var crosshair = { x: -1, y: -1, locked: false };
+
+        plot.setCrosshair = function setCrosshair(pos) {
+            if (!pos)
+                crosshair.x = -1;
+            else {
+                var axes = plot.getAxes();
+                
+                crosshair.x = Math.max(0, Math.min(pos.x != null ? axes.xaxis.p2c(pos.x) : axes.x2axis.p2c(pos.x2), plot.width()));
+                crosshair.y = Math.max(0, Math.min(pos.y != null ? axes.yaxis.p2c(pos.y) : axes.y2axis.p2c(pos.y2), plot.height()));
+            }
+            
+            plot.triggerRedrawOverlay();
+        };
+        
+        plot.clearCrosshair = plot.setCrosshair; // passes null for pos
+        
+        plot.lockCrosshair = function lockCrosshair(pos) {
+            if (pos)
+                plot.setCrosshair(pos);
+            crosshair.locked = true;
+        }
+
+        plot.unlockCrosshair = function unlockCrosshair() {
+            crosshair.locked = false;
+        }
+
+        plot.hooks.bindEvents.push(function (plot, eventHolder) {
+            if (!plot.getOptions().crosshair.mode)
+                return;
+
+            eventHolder.mouseout(function () {
+                if (crosshair.x != -1) {
+                    crosshair.x = -1;
+                    plot.triggerRedrawOverlay();
+                }
+            });
+            
+            eventHolder.mousemove(function (e) {
+                if (plot.getSelection && plot.getSelection()) {
+                    crosshair.x = -1; // hide the crosshair while selecting
+                    return;
+                }
+                
+                if (crosshair.locked)
+                    return;
+                
+                var offset = plot.offset();
+                crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));
+                crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));
+                plot.triggerRedrawOverlay();
+            });
+        });
+
+        plot.hooks.drawOverlay.push(function (plot, ctx) {
+            var c = plot.getOptions().crosshair;
+            if (!c.mode)
+                return;
+
+            var plotOffset = plot.getPlotOffset();
+            
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            if (crosshair.x != -1) {
+                ctx.strokeStyle = c.color;
+                ctx.lineWidth = c.lineWidth;
+                ctx.lineJoin = "round";
+
+                ctx.beginPath();
+                if (c.mode.indexOf("x") != -1) {
+                    ctx.moveTo(crosshair.x, 0);
+                    ctx.lineTo(crosshair.x, plot.height());
+                }
+                if (c.mode.indexOf("y") != -1) {
+                    ctx.moveTo(0, crosshair.y);
+                    ctx.lineTo(plot.width(), crosshair.y);
+                }
+                ctx.stroke();
+            }
+            ctx.restore();
+        });
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'crosshair',
+        version: '1.0'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.crosshair.min.js 2.3.1.src/ext/flot/jquery.flot.crosshair.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.crosshair.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.crosshair.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(B){var A={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function C(G){var H={x:-1,y:-1,locked:false};G.setCrosshair=function D(J){if(!J){H.x=-1}else{var I=G.getAxes();H.x=Math.max(0,Math.min(J.x!=null?I.xaxis.p2c(J.x):I.x2axis.p2c(J.x2),G.width()));H.y=Math.max(0,Math.min(J.y!=null?I.yaxis.p2c(J.y):I.y2axis.p2c(J.y2),G.height()))}G.triggerRedrawOverlay()};G.clearCrosshair=G.setCrosshair;G.lockCrosshair=function E(I){if(I){G.setCrosshair(I)}H.locked=true};G.unlockCrosshair=function F(){H.locked=false};G.hooks.bindEvents.push(function(J,I){if(!J.getOptions().crosshair.mode){return }I.mouseout(function(){if(H.x!=-1){H.x=-1;J.triggerRedrawOverlay()}});I.mousemove(function(K){if(J.getSelection&&J.getSelection()){H.x=-1;return }if(H.locked){return }var L=J.offset();H.x=Math.max(0,Math.min(K.pageX-L.left,J.width()));H.y=Math.max(0,Math.min(K.pageY-L.top,J.height()));J.triggerRedrawOverlay()})});G.hooks.drawOverlay.push(function(K,I){var L=K.getOptions().crosshair;if(!L.mode){return }var J=K.getPlotOffset();I.save();I.translate(J.left,J.top);if(H.x!=-1){I.strokeStyle=L.color;I.lineWidth=L.lineWidth;I.lineJoin="round";I.beginPath();if(L.mode.indexOf("x")!=-1){I.moveTo(H.x,0);I.lineTo(H.x,K.height())}if(L.mode.indexOf("y")!=-1){I.moveTo(0,H.y);I.lineTo(K.width(),H.y)}I.stroke()}I.restore()})}B.plot.plugins.push({init:C,options:A,name:"crosshair",version:"1.0"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.image.js 2.3.1.src/ext/flot/jquery.flot.image.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.image.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.image.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,237 @@
+/*
+Flot plugin for plotting images, e.g. useful for putting ticks on a
+prerendered complex visualization.
+
+The data syntax is [[image, x1, y1, x2, y2], ...] where (x1, y1) and
+(x2, y2) are where you intend the two opposite corners of the image to
+end up in the plot. Image must be a fully loaded Javascript image (you
+can make one with new Image()). If the image is not complete, it's
+skipped when plotting.
+
+There are two helpers included for retrieving images. The easiest work
+the way that you put in URLs instead of images in the data (like
+["myimage.png", 0, 0, 10, 10]), then call $.plot.image.loadData(data,
+options, callback) where data and options are the same as you pass in
+to $.plot. This loads the images, replaces the URLs in the data with
+the corresponding images and calls "callback" when all images are
+loaded (or failed loading). In the callback, you can then call $.plot
+with the data set. See the included example.
+
+A more low-level helper, $.plot.image.load(urls, callback) is also
+included. Given a list of URLs, it calls callback with an object
+mapping from URL to Image object when all images are loaded or have
+failed loading.
+
+Options for the plugin are
+
+  series: {
+      images: {
+          show: boolean
+          anchor: "corner" or "center"
+          alpha: [0,1]
+      }
+  }
+
+which can be specified for a specific series
+
+  $.plot($("#placeholder"), [{ data: [ ... ], images: { ... } ])
+
+Note that because the data format is different from usual data points,
+you can't use images with anything else in a specific data series.
+
+Setting "anchor" to "center" causes the pixels in the image to be
+anchored at the corner pixel centers inside of at the pixel corners,
+effectively letting half a pixel stick out to each side in the plot.
+
+
+A possible future direction could be support for tiling for large
+images (like Google Maps).
+
+*/
+
+(function ($) {
+    var options = {
+        series: {
+            images: {
+                show: false,
+                alpha: 1,
+                anchor: "corner" // or "center"
+            }
+        }
+    };
+
+    $.plot.image = {};
+
+    $.plot.image.loadDataImages = function (series, options, callback) {
+        var urls = [], points = [];
+
+        var defaultShow = options.series.images.show;
+        
+        $.each(series, function (i, s) {
+            if (!(defaultShow || s.images.show))
+                return;
+            
+            if (s.data)
+                s = s.data;
+
+            $.each(s, function (i, p) {
+                if (typeof p[0] == "string") {
+                    urls.push(p[0]);
+                    points.push(p);
+                }
+            });
+        });
+
+        $.plot.image.load(urls, function (loadedImages) {
+            $.each(points, function (i, p) {
+                var url = p[0];
+                if (loadedImages[url])
+                    p[0] = loadedImages[url];
+            });
+
+            callback();
+        });
+    }
+    
+    $.plot.image.load = function (urls, callback) {
+        var missing = urls.length, loaded = {};
+        if (missing == 0)
+            callback({});
+
+        $.each(urls, function (i, url) {
+            var handler = function () {
+                --missing;
+                
+                loaded[url] = this;
+                
+                if (missing == 0)
+                    callback(loaded);
+            };
+
+            $('<img />').load(handler).error(handler).attr('src', url);
+        });
+    }
+    
+    function draw(plot, ctx) {
+        var plotOffset = plot.getPlotOffset();
+        
+        $.each(plot.getData(), function (i, series) {
+            var points = series.datapoints.points,
+                ps = series.datapoints.pointsize;
+            
+            for (var i = 0; i < points.length; i += ps) {
+                var img = points[i],
+                    x1 = points[i + 1], y1 = points[i + 2],
+                    x2 = points[i + 3], y2 = points[i + 4],
+                    xaxis = series.xaxis, yaxis = series.yaxis,
+                    tmp;
+
+                // actually we should check img.complete, but it
+                // appears to be a somewhat unreliable indicator in
+                // IE6 (false even after load event)
+                if (!img || img.width <= 0 || img.height <= 0)
+                    continue;
+
+                if (x1 > x2) {
+                    tmp = x2;
+                    x2 = x1;
+                    x1 = tmp;
+                }
+                if (y1 > y2) {
+                    tmp = y2;
+                    y2 = y1;
+                    y1 = tmp;
+                }
+                
+                // if the anchor is at the center of the pixel, expand the 
+                // image by 1/2 pixel in each direction
+                if (series.images.anchor == "center") {
+                    tmp = 0.5 * (x2-x1) / (img.width - 1);
+                    x1 -= tmp;
+                    x2 += tmp;
+                    tmp = 0.5 * (y2-y1) / (img.height - 1);
+                    y1 -= tmp;
+                    y2 += tmp;
+                }
+                
+                // clip
+                if (x1 == x2 || y1 == y2 ||
+                    x1 >= xaxis.max || x2 <= xaxis.min ||
+                    y1 >= yaxis.max || y2 <= yaxis.min)
+                    continue;
+
+                var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height;
+                if (x1 < xaxis.min) {
+                    sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1);
+                    x1 = xaxis.min;
+                }
+
+                if (x2 > xaxis.max) {
+                    sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1);
+                    x2 = xaxis.max;
+                }
+
+                if (y1 < yaxis.min) {
+                    sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1);
+                    y1 = yaxis.min;
+                }
+
+                if (y2 > yaxis.max) {
+                    sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1);
+                    y2 = yaxis.max;
+                }
+                
+                x1 = xaxis.p2c(x1);
+                x2 = xaxis.p2c(x2);
+                y1 = yaxis.p2c(y1);
+                y2 = yaxis.p2c(y2);
+                
+                // the transformation may have swapped us
+                if (x1 > x2) {
+                    tmp = x2;
+                    x2 = x1;
+                    x1 = tmp;
+                }
+                if (y1 > y2) {
+                    tmp = y2;
+                    y2 = y1;
+                    y1 = tmp;
+                }
+
+                tmp = ctx.globalAlpha;
+                ctx.globalAlpha *= series.images.alpha;
+                ctx.drawImage(img,
+                              sx1, sy1, sx2 - sx1, sy2 - sy1,
+                              x1 + plotOffset.left, y1 + plotOffset.top,
+                              x2 - x1, y2 - y1);
+                ctx.globalAlpha = tmp;
+            }
+        });
+    }
+
+    function processRawData(plot, series, data, datapoints) {
+        if (!series.images.show)
+            return;
+
+        // format is Image, x1, y1, x2, y2 (opposite corners)
+        datapoints.format = [
+            { required: true },
+            { x: true, number: true, required: true },
+            { y: true, number: true, required: true },
+            { x: true, number: true, required: true },
+            { y: true, number: true, required: true }
+        ];
+    }
+    
+    function init(plot) {
+        plot.hooks.processRawData.push(processRawData);
+        plot.hooks.draw.push(draw);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'image',
+        version: '1.1'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.image.min.js 2.3.1.src/ext/flot/jquery.flot.image.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.image.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.image.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(D){var B={series:{images:{show:false,alpha:1,anchor:"corner"}}};D.plot.image={};D.plot.image.loadDataImages=function(G,F,K){var J=[],H=[];var I=F.series.images.show;D.each(G,function(L,M){if(!(I||M.images.show)){return }if(M.data){M=M.data}D.each(M,function(N,O){if(typeof O[0]=="string"){J.push(O[0]);H.push(O)}})});D.plot.image.load(J,function(L){D.each(H,function(N,O){var M=O[0];if(L[M]){O[0]=L[M]}});K()})};D.plot.image.load=function(H,I){var G=H.length,F={};if(G==0){I({})}D.each(H,function(K,J){var L=function(){--G;F[J]=this;if(G==0){I(F)}};D("<img />").load(L).error(L).attr("src",J)})};function A(H,F){var G=H.getPlotOffset();D.each(H.getData(),function(O,P){var X=P.datapoints.points,I=P.datapoints.pointsize;for(var O=0;O<X.length;O+=I){var Q=X[O],M=X[O+1],V=X[O+2],K=X[O+3],T=X[O+4],W=P.xaxis,S=P.yaxis,N;if(!Q||Q.width<=0||Q.height<=0){continue}if(M>K){N=K;K=M;M=N}if(V>T){N=T;T=V;V=N}if(P.images.anchor=="center"){N=0.5*(K-M)/(Q.width-1);M-=N;K+=N;N=0.5*(T-V)/(Q.height-1);V-=N;T+=N}if(M==K||V==T||M>=W.max||K<=W.min||V>=S.max||T<=S.min){continue}var L=0,U=0,J=Q.width,R=Q.height;if(M<W.min){L+=(J-L)*(W.min-M)/(K-M);M=W.min}if(K>W.max){J+=(J-L)*(W.max-K)/(K-M);K=W.max}if(V<S.min){R+=(U-R)*(S.min-V)/(T-V);V=S.min}if(T>S.max){U+=(U-R)*(S.max-T)/(T-V);T=S.max}M=W.p2c(M);K=W.p2c(K);V=S.p2c(V);T=S.p2c(T);if(M>K){N=K;K=M;M=N}if(V>T){N=T;T=V;V=N}N=F.globalAlpha;F.globalAlpha*=P.images.alpha;F.drawImage(Q,L,U,J-L,R-U,M+G.left,V+G.top,K-M,T-V);F.globalAlpha=N}})}function C(I,F,G,H){if(!F.images.show){return }H.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function E(F){F.hooks.processRawData.push(C);F.hooks.draw.push(A)}D.plot.plugins.push({init:E,options:B,name:"image",version:"1.1"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.js 2.3.1.src/ext/flot/jquery.flot.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,2119 @@
+/* Javascript plotting library for jQuery, v. 0.6.
+ *
+ * Released under the MIT license by IOLA, December 2007.
+ *
+ */
+
+// first an inline dependency, jquery.colorhelpers.js, we inline it here
+// for convenience
+
+/* Plugin for jQuery for working with colors.
+ * 
+ * Version 1.0.
+ * 
+ * Inspiration from jQuery color animation plugin by John Resig.
+ *
+ * Released under the MIT license by Ole Laursen, October 2009.
+ *
+ * Examples:
+ *
+ *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
+ *   var c = $.color.extract($("#mydiv"), 'background-color');
+ *   console.log(c.r, c.g, c.b, c.a);
+ *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
+ *
+ * Note that .scale() and .add() work in-place instead of returning
+ * new objects.
+ */ 
+(function(){jQuery.color={};jQuery.color.make=function(E,D,B,C){var F={};F.r=E||0;F.g=D||0;F.b=B||0;F.a=C!=null?C:1;F.add=function(I,H){for(var G=0;G<I.length;++G){F[I.charAt(G)]+=H}return F.normalize()};F.scale=function(I,H){for(var G=0;G<I.length;++G){F[I.charAt(G)]*=H}return F.normalize()};F.toString=function(){if(F.a>=1){return"rgb("+[F.r,F.g,F.b].join(",")+")"}else{return"rgba("+[F.r,F.g,F.b,F.a].join(",")+")"}};F.normalize=function(){function G(I,J,H){return J<I?I:(J>H?H:J)}F.r=G(0,parseInt(F.r),255);F.g=G(0,parseInt(F.g),255);F.b=G(0,parseInt(F.b),255);F.a=G(0,F.a,1);return F};F.clone=function(){return jQuery.color.make(F.r,F.b,F.g,F.a)};return F.normalize()};jQuery.color.extract=function(C,B){var D;do{D=C.css(B).toLowerCase();if(D!=""&&D!="transparent"){break}C=C.parent()}while(!jQuery.nodeName(C.get(0),"body"));if(D=="rgba(0, 0, 0, 0)"){D="transparent"}return jQuery.color.parse(D)};jQuery.color.parse=function(E){var D,B=jQuery.color.make;if(D=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10))}if(D=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseInt(D[1],10),parseInt(D[2],10),parseInt(D[3],10),parseFloat(D[4]))}if(D=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55)}if(D=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(E)){return B(parseFloat(D[1])*2.55,parseFloat(D[2])*2.55,parseFloat(D[3])*2.55,parseFloat(D[4]))}if(D=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(E)){return B(parseInt(D[1],16),parseInt(D[2],16),parseInt(D[3],16))}if(D=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(E)){return B(parseInt(D[1]+D[1],16),parseInt(D[2]+D[2],16),parseInt(D[3]+D[3],16))}var C=jQuery.trim(E).toLowerCase();if(C=="transparent"){return B(255,255,255,0)}else{D=A[C];return B(D[0],D[1],D[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();
+
+// the actual Flot code
+(function($) {
+    function Plot(placeholder, data_, options_, plugins) {
+        // data is on the form:
+        //   [ series1, series2 ... ]
+        // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
+        // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
+        
+        var series = [],
+            options = {
+                // the color theme used for graphs
+                colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
+                legend: {
+                    show: true,
+                    noColumns: 1, // number of colums in legend table
+                    labelFormatter: null, // fn: string -> string
+                    labelBoxBorderColor: "#ccc", // border color for the little label boxes
+                    container: null, // container (as jQuery object) to put legend in, null means default on top of graph
+                    position: "ne", // position of default legend container within plot
+                    margin: 5, // distance from grid edge to default legend container within plot
+                    backgroundColor: null, // null means auto-detect
+                    backgroundOpacity: 0.85 // set to 0 to avoid background
+                },
+                xaxis: {
+                    mode: null, // null or "time"
+                    transform: null, // null or f: number -> number to transform axis
+                    inverseTransform: null, // if transform is set, this should be the inverse function
+                    min: null, // min. value to show, null means set automatically
+                    max: null, // max. value to show, null means set automatically
+                    autoscaleMargin: null, // margin in % to add if auto-setting min/max
+                    ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
+                    tickFormatter: null, // fn: number -> string
+                    labelWidth: null, // size of tick labels in pixels
+                    labelHeight: null,
+                    
+                    // mode specific options
+                    tickDecimals: null, // no. of decimals, null means auto
+                    tickSize: null, // number or [number, "unit"]
+                    minTickSize: null, // number or [number, "unit"]
+                    monthNames: null, // list of names of months
+                    timeformat: null, // format string to use
+                    twelveHourClock: false // 12 or 24 time in time mode
+                },
+                yaxis: {
+                    autoscaleMargin: 0.02
+                },
+                x2axis: {
+                    autoscaleMargin: null
+                },
+                y2axis: {
+                    autoscaleMargin: 0.02
+                },
+                series: {
+                    points: {
+                        show: false,
+                        radius: 3,
+                        lineWidth: 2, // in pixels
+                        fill: true,
+                        fillColor: "#ffffff"
+                    },
+                    lines: {
+                        // we don't put in show: false so we can see
+                        // whether lines were actively disabled 
+                        lineWidth: 2, // in pixels
+                        fill: false,
+                        fillColor: null,
+                        steps: false
+                    },
+                    bars: {
+                        show: false,
+                        lineWidth: 2, // in pixels
+                        barWidth: 1, // in units of the x axis
+                        fill: true,
+                        fillColor: null,
+                        align: "left", // or "center" 
+                        horizontal: false // when horizontal, left is now top
+                    },
+                    shadowSize: 3
+                },
+                grid: {
+                    show: true,
+                    aboveData: false,
+                    color: "#545454", // primary color used for outline and labels
+                    backgroundColor: null, // null for transparent, else color
+                    tickColor: "rgba(0,0,0,0.15)", // color used for the ticks
+                    labelMargin: 5, // in pixels
+                    borderWidth: 2, // in pixels
+                    borderColor: null, // set if different from the grid color
+                    markings: null, // array of ranges or fn: axes -> array of ranges
+                    markingsColor: "#f4f4f4",
+                    markingsLineWidth: 2,
+                    // interactive stuff
+                    clickable: false,
+                    hoverable: false,
+                    autoHighlight: true, // highlight in case mouse is near
+                    mouseActiveRadius: 10 // how far the mouse can be away to activate an item
+                },
+                hooks: {}
+            },
+        canvas = null,      // the canvas for the plot itself
+        overlay = null,     // canvas for interactive stuff on top of plot
+        eventHolder = null, // jQuery object that events should be bound to
+        ctx = null, octx = null,
+        axes = { xaxis: {}, yaxis: {}, x2axis: {}, y2axis: {} },
+        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
+        canvasWidth = 0, canvasHeight = 0,
+        plotWidth = 0, plotHeight = 0,
+        hooks = {
+            processOptions: [],
+            processRawData: [],
+            processDatapoints: [],
+            draw: [],
+            bindEvents: [],
+            drawOverlay: []
+        },
+        plot = this;
+
+        // public functions
+        plot.setData = setData;
+        plot.setupGrid = setupGrid;
+        plot.draw = draw;
+        plot.getPlaceholder = function() { return placeholder; };
+        plot.getCanvas = function() { return canvas; };
+        plot.getPlotOffset = function() { return plotOffset; };
+        plot.width = function () { return plotWidth; };
+        plot.height = function () { return plotHeight; };
+        plot.offset = function () {
+            var o = eventHolder.offset();
+            o.left += plotOffset.left;
+            o.top += plotOffset.top;
+            return o;
+        };
+        plot.getData = function() { return series; };
+        plot.getAxes = function() { return axes; };
+        plot.getOptions = function() { return options; };
+        plot.highlight = highlight;
+        plot.unhighlight = unhighlight;
+        plot.triggerRedrawOverlay = triggerRedrawOverlay;
+        plot.pointOffset = function(point) {
+            return { left: parseInt(axisSpecToRealAxis(point, "xaxis").p2c(+point.x) + plotOffset.left),
+                     top: parseInt(axisSpecToRealAxis(point, "yaxis").p2c(+point.y) + plotOffset.top) };
+        };
+        
+
+        // public attributes
+        plot.hooks = hooks;
+        
+        // initialize
+        initPlugins(plot);
+        parseOptions(options_);
+        constructCanvas();
+        setData(data_);
+        setupGrid();
+        draw();
+        bindEvents();
+
+
+        function executeHooks(hook, args) {
+            args = [plot].concat(args);
+            for (var i = 0; i < hook.length; ++i)
+                hook[i].apply(this, args);
+        }
+
+        function initPlugins() {
+            for (var i = 0; i < plugins.length; ++i) {
+                var p = plugins[i];
+                p.init(plot);
+                if (p.options)
+                    $.extend(true, options, p.options);
+            }
+        }
+        
+        function parseOptions(opts) {
+            $.extend(true, options, opts);
+            if (options.grid.borderColor == null)
+                options.grid.borderColor = options.grid.color;
+            // backwards compatibility, to be removed in future
+            if (options.xaxis.noTicks && options.xaxis.ticks == null)
+                options.xaxis.ticks = options.xaxis.noTicks;
+            if (options.yaxis.noTicks && options.yaxis.ticks == null)
+                options.yaxis.ticks = options.yaxis.noTicks;
+            if (options.grid.coloredAreas)
+                options.grid.markings = options.grid.coloredAreas;
+            if (options.grid.coloredAreasColor)
+                options.grid.markingsColor = options.grid.coloredAreasColor;
+            if (options.lines)
+                $.extend(true, options.series.lines, options.lines);
+            if (options.points)
+                $.extend(true, options.series.points, options.points);
+            if (options.bars)
+                $.extend(true, options.series.bars, options.bars);
+            if (options.shadowSize)
+                options.series.shadowSize = options.shadowSize;
+
+            for (var n in hooks)
+                if (options.hooks[n] && options.hooks[n].length)
+                    hooks[n] = hooks[n].concat(options.hooks[n]);
+
+            executeHooks(hooks.processOptions, [options]);
+        }
+
+        function setData(d) {
+            series = parseData(d);
+            fillInSeriesOptions();
+            processData();
+        }
+        
+        function parseData(d) {
+            var res = [];
+            for (var i = 0; i < d.length; ++i) {
+                var s = $.extend(true, {}, options.series);
+
+                if (d[i].data) {
+                    s.data = d[i].data; // move the data instead of deep-copy
+                    delete d[i].data;
+
+                    $.extend(true, s, d[i]);
+
+                    d[i].data = s.data;
+                }
+                else
+                    s.data = d[i];
+                res.push(s);
+            }
+
+            return res;
+        }
+        
+        function axisSpecToRealAxis(obj, attr) {
+            var a = obj[attr];
+            if (!a || a == 1)
+                return axes[attr];
+            if (typeof a == "number")
+                return axes[attr.charAt(0) + a + attr.slice(1)];
+            return a; // assume it's OK
+        }
+        
+        function fillInSeriesOptions() {
+            var i;
+            
+            // collect what we already got of colors
+            var neededColors = series.length,
+                usedColors = [],
+                assignedColors = [];
+            for (i = 0; i < series.length; ++i) {
+                var sc = series[i].color;
+                if (sc != null) {
+                    --neededColors;
+                    if (typeof sc == "number")
+                        assignedColors.push(sc);
+                    else
+                        usedColors.push($.color.parse(series[i].color));
+                }
+            }
+            
+            // we might need to generate more colors if higher indices
+            // are assigned
+            for (i = 0; i < assignedColors.length; ++i) {
+                neededColors = Math.max(neededColors, assignedColors[i] + 1);
+            }
+
+            // produce colors as needed
+            var colors = [], variation = 0;
+            i = 0;
+            while (colors.length < neededColors) {
+                var c;
+                if (options.colors.length == i) // check degenerate case
+                    c = $.color.make(100, 100, 100);
+                else
+                    c = $.color.parse(options.colors[i]);
+
+                // vary color if needed
+                var sign = variation % 2 == 1 ? -1 : 1;
+                c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2)
+
+                // FIXME: if we're getting to close to something else,
+                // we should probably skip this one
+                colors.push(c);
+                
+                ++i;
+                if (i >= options.colors.length) {
+                    i = 0;
+                    ++variation;
+                }
+            }
+
+            // fill in the options
+            var colori = 0, s;
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                
+                // assign colors
+                if (s.color == null) {
+                    s.color = colors[colori].toString();
+                    ++colori;
+                }
+                else if (typeof s.color == "number")
+                    s.color = colors[s.color].toString();
+
+                // turn on lines automatically in case nothing is set
+                if (s.lines.show == null) {
+                    var v, show = true;
+                    for (v in s)
+                        if (s[v].show) {
+                            show = false;
+                            break;
+                        }
+                    if (show)
+                        s.lines.show = true;
+                }
+
+                // setup axes
+                s.xaxis = axisSpecToRealAxis(s, "xaxis");
+                s.yaxis = axisSpecToRealAxis(s, "yaxis");
+            }
+        }
+        
+        function processData() {
+            var topSentry = Number.POSITIVE_INFINITY,
+                bottomSentry = Number.NEGATIVE_INFINITY,
+                i, j, k, m, length,
+                s, points, ps, x, y, axis, val, f, p;
+
+            for (axis in axes) {
+                axes[axis].datamin = topSentry;
+                axes[axis].datamax = bottomSentry;
+                axes[axis].used = false;
+            }
+
+            function updateAxis(axis, min, max) {
+                if (min < axis.datamin)
+                    axis.datamin = min;
+                if (max > axis.datamax)
+                    axis.datamax = max;
+            }
+
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                s.datapoints = { points: [] };
+                
+                executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
+            }
+            
+            // first pass: clean and copy data
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                var data = s.data, format = s.datapoints.format;
+
+                if (!format) {
+                    format = [];
+                    // find out how to copy
+                    format.push({ x: true, number: true, required: true });
+                    format.push({ y: true, number: true, required: true });
+
+                    if (s.bars.show)
+                        format.push({ y: true, number: true, required: false, defaultValue: 0 });
+                    
+                    s.datapoints.format = format;
+                }
+
+                if (s.datapoints.pointsize != null)
+                    continue; // already filled in
+
+                if (s.datapoints.pointsize == null)
+                    s.datapoints.pointsize = format.length;
+                
+                ps = s.datapoints.pointsize;
+                points = s.datapoints.points;
+
+                insertSteps = s.lines.show && s.lines.steps;
+                s.xaxis.used = s.yaxis.used = true;
+                
+                for (j = k = 0; j < data.length; ++j, k += ps) {
+                    p = data[j];
+
+                    var nullify = p == null;
+                    if (!nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = p[m];
+                            f = format[m];
+
+                            if (f) {
+                                if (f.number && val != null) {
+                                    val = +val; // convert to number
+                                    if (isNaN(val))
+                                        val = null;
+                                }
+
+                                if (val == null) {
+                                    if (f.required)
+                                        nullify = true;
+                                    
+                                    if (f.defaultValue != null)
+                                        val = f.defaultValue;
+                                }
+                            }
+                            
+                            points[k + m] = val;
+                        }
+                    }
+                    
+                    if (nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = points[k + m];
+                            if (val != null) {
+                                f = format[m];
+                                // extract min/max info
+                                if (f.x)
+                                    updateAxis(s.xaxis, val, val);
+                                if (f.y)
+                                    updateAxis(s.yaxis, val, val);
+                            }
+                            points[k + m] = null;
+                        }
+                    }
+                    else {
+                        // a little bit of line specific stuff that
+                        // perhaps shouldn't be here, but lacking
+                        // better means...
+                        if (insertSteps && k > 0
+                            && points[k - ps] != null
+                            && points[k - ps] != points[k]
+                            && points[k - ps + 1] != points[k + 1]) {
+                            // copy the point to make room for a middle point
+                            for (m = 0; m < ps; ++m)
+                                points[k + ps + m] = points[k + m];
+
+                            // middle point has same y
+                            points[k + 1] = points[k - ps + 1];
+
+                            // we've added a point, better reflect that
+                            k += ps;
+                        }
+                    }
+                }
+            }
+
+            // give the hooks a chance to run
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                
+                executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
+            }
+
+            // second pass: find datamax/datamin for auto-scaling
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                points = s.datapoints.points,
+                ps = s.datapoints.pointsize;
+
+                var xmin = topSentry, ymin = topSentry,
+                    xmax = bottomSentry, ymax = bottomSentry;
+                
+                for (j = 0; j < points.length; j += ps) {
+                    if (points[j] == null)
+                        continue;
+
+                    for (m = 0; m < ps; ++m) {
+                        val = points[j + m];
+                        f = format[m];
+                        if (!f)
+                            continue;
+                        
+                        if (f.x) {
+                            if (val < xmin)
+                                xmin = val;
+                            if (val > xmax)
+                                xmax = val;
+                        }
+                        if (f.y) {
+                            if (val < ymin)
+                                ymin = val;
+                            if (val > ymax)
+                                ymax = val;
+                        }
+                    }
+                }
+                
+                if (s.bars.show) {
+                    // make sure we got room for the bar on the dancing floor
+                    var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2;
+                    if (s.bars.horizontal) {
+                        ymin += delta;
+                        ymax += delta + s.bars.barWidth;
+                    }
+                    else {
+                        xmin += delta;
+                        xmax += delta + s.bars.barWidth;
+                    }
+                }
+                
+                updateAxis(s.xaxis, xmin, xmax);
+                updateAxis(s.yaxis, ymin, ymax);
+            }
+
+            for (axis in axes) {
+                if (axes[axis].datamin == topSentry)
+                    axes[axis].datamin = null;
+                if (axes[axis].datamax == bottomSentry)
+                    axes[axis].datamax = null;
+            }
+        }
+
+        function constructCanvas() {
+            function makeCanvas(width, height) {
+                var c = document.createElement('canvas');
+                c.width = width;
+                c.height = height;
+                if ($.browser.msie) // excanvas hack
+                    c = window.G_vmlCanvasManager.initElement(c);
+                return c;
+            }
+            
+            canvasWidth = placeholder.width();
+            canvasHeight = placeholder.height();
+            placeholder.html(""); // clear placeholder
+            if (placeholder.css("position") == 'static')
+                placeholder.css("position", "relative"); // for positioning labels and overlay
+
+            if (canvasWidth <= 0 || canvasHeight <= 0)
+                throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight;
+
+            if ($.browser.msie) // excanvas hack
+                window.G_vmlCanvasManager.init_(document); // make sure everything is setup
+            
+            // the canvas
+            canvas = $(makeCanvas(canvasWidth, canvasHeight)).appendTo(placeholder).get(0);
+            ctx = canvas.getContext("2d");
+
+            // overlay canvas for interactive features
+            overlay = $(makeCanvas(canvasWidth, canvasHeight)).css({ position: 'absolute', left: 0, top: 0 }).appendTo(placeholder).get(0);
+            octx = overlay.getContext("2d");
+            octx.stroke();
+        }
+
+        function bindEvents() {
+            // we include the canvas in the event holder too, because IE 7
+            // sometimes has trouble with the stacking order
+            eventHolder = $([overlay, canvas]);
+
+            // bind events
+            if (options.grid.hoverable)
+                eventHolder.mousemove(onMouseMove);
+
+            if (options.grid.clickable)
+                eventHolder.click(onClick);
+
+            executeHooks(hooks.bindEvents, [eventHolder]);
+        }
+
+        function setupGrid() {
+            function setTransformationHelpers(axis, o) {
+                function identity(x) { return x; }
+                
+                var s, m, t = o.transform || identity,
+                    it = o.inverseTransform;
+                    
+                // add transformation helpers
+                if (axis == axes.xaxis || axis == axes.x2axis) {
+                    // precompute how much the axis is scaling a point
+                    // in canvas space
+                    s = axis.scale = plotWidth / (t(axis.max) - t(axis.min));
+                    m = t(axis.min);
+
+                    // data point to canvas coordinate
+                    if (t == identity) // slight optimization
+                        axis.p2c = function (p) { return (p - m) * s; };
+                    else
+                        axis.p2c = function (p) { return (t(p) - m) * s; };
+                    // canvas coordinate to data point
+                    if (!it)
+                        axis.c2p = function (c) { return m + c / s; };
+                    else
+                        axis.c2p = function (c) { return it(m + c / s); };
+                }
+                else {
+                    s = axis.scale = plotHeight / (t(axis.max) - t(axis.min));
+                    m = t(axis.max);
+                    
+                    if (t == identity)
+                        axis.p2c = function (p) { return (m - p) * s; };
+                    else
+                        axis.p2c = function (p) { return (m - t(p)) * s; };
+                    if (!it)
+                        axis.c2p = function (c) { return m - c / s; };
+                    else
+                        axis.c2p = function (c) { return it(m - c / s); };
+                }
+            }
+
+            function measureLabels(axis, axisOptions) {
+                var i, labels = [], l;
+                
+                axis.labelWidth = axisOptions.labelWidth;
+                axis.labelHeight = axisOptions.labelHeight;
+
+                if (axis == axes.xaxis || axis == axes.x2axis) {
+                    // to avoid measuring the widths of the labels, we
+                    // construct fixed-size boxes and put the labels inside
+                    // them, we don't need the exact figures and the
+                    // fixed-size box content is easy to center
+                    if (axis.labelWidth == null)
+                        axis.labelWidth = canvasWidth / (axis.ticks.length > 0 ? axis.ticks.length : 1);
+
+                    // measure x label heights
+                    if (axis.labelHeight == null) {
+                        labels = [];
+                        for (i = 0; i < axis.ticks.length; ++i) {
+                            l = axis.ticks[i].label;
+                            if (l)
+                                labels.push('<div class="tickLabel" style="float:left;width:' + axis.labelWidth + 'px">' + l + '</div>');
+                        }
+                        
+                        if (labels.length > 0) {
+                            var dummyDiv = $('<div style="position:absolute;top:-10000px;width:10000px;font-size:smaller">'
+                                             + labels.join("") + '<div style="clear:left"></div></div>').appendTo(placeholder);
+                            axis.labelHeight = dummyDiv.height();
+                            dummyDiv.remove();
+                        }
+                    }
+                }
+                else if (axis.labelWidth == null || axis.labelHeight == null) {
+                    // calculate y label dimensions
+                    for (i = 0; i < axis.ticks.length; ++i) {
+                        l = axis.ticks[i].label;
+                        if (l)
+                            labels.push('<div class="tickLabel">' + l + '</div>');
+                    }
+                    
+                    if (labels.length > 0) {
+                        var dummyDiv = $('<div style="position:absolute;top:-10000px;font-size:smaller">'
+                                         + labels.join("") + '</div>').appendTo(placeholder);
+                        if (axis.labelWidth == null)
+                            axis.labelWidth = dummyDiv.width();
+                        if (axis.labelHeight == null)
+                            axis.labelHeight = dummyDiv.find("div").height();
+                        dummyDiv.remove();
+                    }
+                    
+                }
+
+                if (axis.labelWidth == null)
+                    axis.labelWidth = 0;
+                if (axis.labelHeight == null)
+                    axis.labelHeight = 0;
+            }
+            
+            function setGridSpacing() {
+                // get the most space needed around the grid for things
+                // that may stick out
+                var maxOutset = options.grid.borderWidth;
+                for (i = 0; i < series.length; ++i)
+                    maxOutset = Math.max(maxOutset, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
+                
+                plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = maxOutset;
+                
+                var margin = options.grid.labelMargin + options.grid.borderWidth;
+                
+                if (axes.xaxis.labelHeight > 0)
+                    plotOffset.bottom = Math.max(maxOutset, axes.xaxis.labelHeight + margin);
+                if (axes.yaxis.labelWidth > 0)
+                    plotOffset.left = Math.max(maxOutset, axes.yaxis.labelWidth + margin);
+                if (axes.x2axis.labelHeight > 0)
+                    plotOffset.top = Math.max(maxOutset, axes.x2axis.labelHeight + margin);
+                if (axes.y2axis.labelWidth > 0)
+                    plotOffset.right = Math.max(maxOutset, axes.y2axis.labelWidth + margin);
+            
+                plotWidth = canvasWidth - plotOffset.left - plotOffset.right;
+                plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top;
+            }
+            
+            var axis;
+            for (axis in axes)
+                setRange(axes[axis], options[axis]);
+            
+            if (options.grid.show) {
+                for (axis in axes) {
+                    prepareTickGeneration(axes[axis], options[axis]);
+                    setTicks(axes[axis], options[axis]);
+                    measureLabels(axes[axis], options[axis]);
+                }
+
+                setGridSpacing();
+            }
+            else {
+                plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0;
+                plotWidth = canvasWidth;
+                plotHeight = canvasHeight;
+            }
+            
+            for (axis in axes)
+                setTransformationHelpers(axes[axis], options[axis]);
+
+            if (options.grid.show)
+                insertLabels();
+            
+            insertLegend();
+        }
+        
+        function setRange(axis, axisOptions) {
+            var min = +(axisOptions.min != null ? axisOptions.min : axis.datamin),
+                max = +(axisOptions.max != null ? axisOptions.max : axis.datamax),
+                delta = max - min;
+
+            if (delta == 0.0) {
+                // degenerate case
+                var widen = max == 0 ? 1 : 0.01;
+
+                if (axisOptions.min == null)
+                    min -= widen;
+                // alway widen max if we couldn't widen min to ensure we
+                // don't fall into min == max which doesn't work
+                if (axisOptions.max == null || axisOptions.min != null)
+                    max += widen;
+            }
+            else {
+                // consider autoscaling
+                var margin = axisOptions.autoscaleMargin;
+                if (margin != null) {
+                    if (axisOptions.min == null) {
+                        min -= delta * margin;
+                        // make sure we don't go below zero if all values
+                        // are positive
+                        if (min < 0 && axis.datamin != null && axis.datamin >= 0)
+                            min = 0;
+                    }
+                    if (axisOptions.max == null) {
+                        max += delta * margin;
+                        if (max > 0 && axis.datamax != null && axis.datamax <= 0)
+                            max = 0;
+                    }
+                }
+            }
+            axis.min = min;
+            axis.max = max;
+        }
+
+        function prepareTickGeneration(axis, axisOptions) {
+            // estimate number of ticks
+            var noTicks;
+            if (typeof axisOptions.ticks == "number" && axisOptions.ticks > 0)
+                noTicks = axisOptions.ticks;
+            else if (axis == axes.xaxis || axis == axes.x2axis)
+                 // heuristic based on the model a*sqrt(x) fitted to
+                 // some reasonable data points
+                noTicks = 0.3 * Math.sqrt(canvasWidth);
+            else
+                noTicks = 0.3 * Math.sqrt(canvasHeight);
+            
+            var delta = (axis.max - axis.min) / noTicks,
+                size, generator, unit, formatter, i, magn, norm;
+
+            if (axisOptions.mode == "time") {
+                // pretty handling of time
+                
+                // map of app. size of time units in milliseconds
+                var timeUnitSize = {
+                    "second": 1000,
+                    "minute": 60 * 1000,
+                    "hour": 60 * 60 * 1000,
+                    "day": 24 * 60 * 60 * 1000,
+                    "month": 30 * 24 * 60 * 60 * 1000,
+                    "year": 365.2425 * 24 * 60 * 60 * 1000
+                };
+
+
+                // the allowed tick sizes, after 1 year we use
+                // an integer algorithm
+                var spec = [
+                    [1, "second"], [2, "second"], [5, "second"], [10, "second"],
+                    [30, "second"], 
+                    [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
+                    [30, "minute"], 
+                    [1, "hour"], [2, "hour"], [4, "hour"],
+                    [8, "hour"], [12, "hour"],
+                    [1, "day"], [2, "day"], [3, "day"],
+                    [0.25, "month"], [0.5, "month"], [1, "month"],
+                    [2, "month"], [3, "month"], [6, "month"],
+                    [1, "year"]
+                ];
+
+                var minSize = 0;
+                if (axisOptions.minTickSize != null) {
+                    if (typeof axisOptions.tickSize == "number")
+                        minSize = axisOptions.tickSize;
+                    else
+                        minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]];
+                }
+
+                for (i = 0; i < spec.length - 1; ++i)
+                    if (delta < (spec[i][0] * timeUnitSize[spec[i][1]]
+                                 + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2
+                       && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize)
+                        break;
+                size = spec[i][0];
+                unit = spec[i][1];
+                
+                // special-case the possibility of several years
+                if (unit == "year") {
+                    magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10));
+                    norm = (delta / timeUnitSize.year) / magn;
+                    if (norm < 1.5)
+                        size = 1;
+                    else if (norm < 3)
+                        size = 2;
+                    else if (norm < 7.5)
+                        size = 5;
+                    else
+                        size = 10;
+
+                    size *= magn;
+                }
+
+                if (axisOptions.tickSize) {
+                    size = axisOptions.tickSize[0];
+                    unit = axisOptions.tickSize[1];
+                }
+                
+                generator = function(axis) {
+                    var ticks = [],
+                        tickSize = axis.tickSize[0], unit = axis.tickSize[1],
+                        d = new Date(axis.min);
+                    
+                    var step = tickSize * timeUnitSize[unit];
+
+                    if (unit == "second")
+                        d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize));
+                    if (unit == "minute")
+                        d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize));
+                    if (unit == "hour")
+                        d.setUTCHours(floorInBase(d.getUTCHours(), tickSize));
+                    if (unit == "month")
+                        d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize));
+                    if (unit == "year")
+                        d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize));
+                    
+                    // reset smaller components
+                    d.setUTCMilliseconds(0);
+                    if (step >= timeUnitSize.minute)
+                        d.setUTCSeconds(0);
+                    if (step >= timeUnitSize.hour)
+                        d.setUTCMinutes(0);
+                    if (step >= timeUnitSize.day)
+                        d.setUTCHours(0);
+                    if (step >= timeUnitSize.day * 4)
+                        d.setUTCDate(1);
+                    if (step >= timeUnitSize.year)
+                        d.setUTCMonth(0);
+
+
+                    var carry = 0, v = Number.NaN, prev;
+                    do {
+                        prev = v;
+                        v = d.getTime();
+                        ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
+                        if (unit == "month") {
+                            if (tickSize < 1) {
+                                // a bit complicated - we'll divide the month
+                                // up but we need to take care of fractions
+                                // so we don't end up in the middle of a day
+                                d.setUTCDate(1);
+                                var start = d.getTime();
+                                d.setUTCMonth(d.getUTCMonth() + 1);
+                                var end = d.getTime();
+                                d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
+                                carry = d.getUTCHours();
+                                d.setUTCHours(0);
+                            }
+                            else
+                                d.setUTCMonth(d.getUTCMonth() + tickSize);
+                        }
+                        else if (unit == "year") {
+                            d.setUTCFullYear(d.getUTCFullYear() + tickSize);
+                        }
+                        else
+                            d.setTime(v + step);
+                    } while (v < axis.max && v != prev);
+
+                    return ticks;
+                };
+
+                formatter = function (v, axis) {
+                    var d = new Date(v);
+
+                    // first check global format
+                    if (axisOptions.timeformat != null)
+                        return $.plot.formatDate(d, axisOptions.timeformat, axisOptions.monthNames);
+                    
+                    var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
+                    var span = axis.max - axis.min;
+                    var suffix = (axisOptions.twelveHourClock) ? " %p" : "";
+                    
+                    if (t < timeUnitSize.minute)
+                        fmt = "%h:%M:%S" + suffix;
+                    else if (t < timeUnitSize.day) {
+                        if (span < 2 * timeUnitSize.day)
+                            fmt = "%h:%M" + suffix;
+                        else
+                            fmt = "%b %d %h:%M" + suffix;
+                    }
+                    else if (t < timeUnitSize.month)
+                        fmt = "%b %d";
+                    else if (t < timeUnitSize.year) {
+                        if (span < timeUnitSize.year)
+                            fmt = "%b";
+                        else
+                            fmt = "%b %y";
+                    }
+                    else
+                        fmt = "%y";
+                    
+                    return $.plot.formatDate(d, fmt, axisOptions.monthNames);
+                };
+            }
+            else {
+                // pretty rounding of base-10 numbers
+                var maxDec = axisOptions.tickDecimals;
+                var dec = -Math.floor(Math.log(delta) / Math.LN10);
+                if (maxDec != null && dec > maxDec)
+                    dec = maxDec;
+
+                magn = Math.pow(10, -dec);
+                norm = delta / magn; // norm is between 1.0 and 10.0
+                
+                if (norm < 1.5)
+                    size = 1;
+                else if (norm < 3) {
+                    size = 2;
+                    // special case for 2.5, requires an extra decimal
+                    if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
+                        size = 2.5;
+                        ++dec;
+                    }
+                }
+                else if (norm < 7.5)
+                    size = 5;
+                else
+                    size = 10;
+
+                size *= magn;
+                
+                if (axisOptions.minTickSize != null && size < axisOptions.minTickSize)
+                    size = axisOptions.minTickSize;
+
+                if (axisOptions.tickSize != null)
+                    size = axisOptions.tickSize;
+
+                axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec);
+
+                generator = function (axis) {
+                    var ticks = [];
+
+                    // spew out all possible ticks
+                    var start = floorInBase(axis.min, axis.tickSize),
+                        i = 0, v = Number.NaN, prev;
+                    do {
+                        prev = v;
+                        v = start + i * axis.tickSize;
+                        ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
+                        ++i;
+                    } while (v < axis.max && v != prev);
+                    return ticks;
+                };
+
+                formatter = function (v, axis) {
+                    return v.toFixed(axis.tickDecimals);
+                };
+            }
+
+            axis.tickSize = unit ? [size, unit] : size;
+            axis.tickGenerator = generator;
+            if ($.isFunction(axisOptions.tickFormatter))
+                axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); };
+            else
+                axis.tickFormatter = formatter;
+        }
+        
+        function setTicks(axis, axisOptions) {
+            axis.ticks = [];
+
+            if (!axis.used)
+                return;
+            
+            if (axisOptions.ticks == null)
+                axis.ticks = axis.tickGenerator(axis);
+            else if (typeof axisOptions.ticks == "number") {
+                if (axisOptions.ticks > 0)
+                    axis.ticks = axis.tickGenerator(axis);
+            }
+            else if (axisOptions.ticks) {
+                var ticks = axisOptions.ticks;
+
+                if ($.isFunction(ticks))
+                    // generate the ticks
+                    ticks = ticks({ min: axis.min, max: axis.max });
+                
+                // clean up the user-supplied ticks, copy them over
+                var i, v;
+                for (i = 0; i < ticks.length; ++i) {
+                    var label = null;
+                    var t = ticks[i];
+                    if (typeof t == "object") {
+                        v = t[0];
+                        if (t.length > 1)
+                            label = t[1];
+                    }
+                    else
+                        v = t;
+                    if (label == null)
+                        label = axis.tickFormatter(v, axis);
+                    axis.ticks[i] = { v: v, label: label };
+                }
+            }
+
+            if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) {
+                // snap to ticks
+                if (axisOptions.min == null)
+                    axis.min = Math.min(axis.min, axis.ticks[0].v);
+                if (axisOptions.max == null && axis.ticks.length > 1)
+                    axis.max = Math.max(axis.max, axis.ticks[axis.ticks.length - 1].v);
+            }
+        }
+      
+        function draw() {
+            ctx.clearRect(0, 0, canvasWidth, canvasHeight);
+
+            var grid = options.grid;
+            
+            if (grid.show && !grid.aboveData)
+                drawGrid();
+
+            for (var i = 0; i < series.length; ++i)
+                drawSeries(series[i]);
+
+            executeHooks(hooks.draw, [ctx]);
+            
+            if (grid.show && grid.aboveData)
+                drawGrid();
+        }
+
+        function extractRange(ranges, coord) {
+            var firstAxis = coord + "axis",
+                secondaryAxis = coord + "2axis",
+                axis, from, to, reverse;
+
+            if (ranges[firstAxis]) {
+                axis = axes[firstAxis];
+                from = ranges[firstAxis].from;
+                to = ranges[firstAxis].to;
+            }
+            else if (ranges[secondaryAxis]) {
+                axis = axes[secondaryAxis];
+                from = ranges[secondaryAxis].from;
+                to = ranges[secondaryAxis].to;
+            }
+            else {
+                // backwards-compat stuff - to be removed in future
+                axis = axes[firstAxis];
+                from = ranges[coord + "1"];
+                to = ranges[coord + "2"];
+            }
+
+            // auto-reverse as an added bonus
+            if (from != null && to != null && from > to)
+                return { from: to, to: from, axis: axis };
+            
+            return { from: from, to: to, axis: axis };
+        }
+        
+        function drawGrid() {
+            var i;
+            
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // draw background, if any
+            if (options.grid.backgroundColor) {
+                ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
+                ctx.fillRect(0, 0, plotWidth, plotHeight);
+            }
+
+            // draw markings
+            var markings = options.grid.markings;
+            if (markings) {
+                if ($.isFunction(markings))
+                    // xmin etc. are backwards-compatible, to be removed in future
+                    markings = markings({ xmin: axes.xaxis.min, xmax: axes.xaxis.max, ymin: axes.yaxis.min, ymax: axes.yaxis.max, xaxis: axes.xaxis, yaxis: axes.yaxis, x2axis: axes.x2axis, y2axis: axes.y2axis });
+
+                for (i = 0; i < markings.length; ++i) {
+                    var m = markings[i],
+                        xrange = extractRange(m, "x"),
+                        yrange = extractRange(m, "y");
+
+                    // fill in missing
+                    if (xrange.from == null)
+                        xrange.from = xrange.axis.min;
+                    if (xrange.to == null)
+                        xrange.to = xrange.axis.max;
+                    if (yrange.from == null)
+                        yrange.from = yrange.axis.min;
+                    if (yrange.to == null)
+                        yrange.to = yrange.axis.max;
+
+                    // clip
+                    if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
+                        yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
+                        continue;
+
+                    xrange.from = Math.max(xrange.from, xrange.axis.min);
+                    xrange.to = Math.min(xrange.to, xrange.axis.max);
+                    yrange.from = Math.max(yrange.from, yrange.axis.min);
+                    yrange.to = Math.min(yrange.to, yrange.axis.max);
+
+                    if (xrange.from == xrange.to && yrange.from == yrange.to)
+                        continue;
+
+                    // then draw
+                    xrange.from = xrange.axis.p2c(xrange.from);
+                    xrange.to = xrange.axis.p2c(xrange.to);
+                    yrange.from = yrange.axis.p2c(yrange.from);
+                    yrange.to = yrange.axis.p2c(yrange.to);
+                    
+                    if (xrange.from == xrange.to || yrange.from == yrange.to) {
+                        // draw line
+                        ctx.beginPath();
+                        ctx.strokeStyle = m.color || options.grid.markingsColor;
+                        ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth;
+                        //ctx.moveTo(Math.floor(xrange.from), yrange.from);
+                        //ctx.lineTo(Math.floor(xrange.to), yrange.to);
+                        ctx.moveTo(xrange.from, yrange.from);
+                        ctx.lineTo(xrange.to, yrange.to);
+                        ctx.stroke();
+                    }
+                    else {
+                        // fill area
+                        ctx.fillStyle = m.color || options.grid.markingsColor;
+                        ctx.fillRect(xrange.from, yrange.to,
+                                     xrange.to - xrange.from,
+                                     yrange.from - yrange.to);
+                    }
+                }
+            }
+            
+            // draw the inner grid
+            ctx.lineWidth = 1;
+            ctx.strokeStyle = options.grid.tickColor;
+            ctx.beginPath();
+            var v, axis = axes.xaxis;
+            for (i = 0; i < axis.ticks.length; ++i) {
+                v = axis.ticks[i].v;
+                if (v <= axis.min || v >= axes.xaxis.max)
+                    continue;   // skip those lying on the axes
+
+                ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 0);
+                ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, plotHeight);
+            }
+
+            axis = axes.yaxis;
+            for (i = 0; i < axis.ticks.length; ++i) {
+                v = axis.ticks[i].v;
+                if (v <= axis.min || v >= axis.max)
+                    continue;
+
+                ctx.moveTo(0, Math.floor(axis.p2c(v)) + ctx.lineWidth/2);
+                ctx.lineTo(plotWidth, Math.floor(axis.p2c(v)) + ctx.lineWidth/2);
+            }
+
+            axis = axes.x2axis;
+            for (i = 0; i < axis.ticks.length; ++i) {
+                v = axis.ticks[i].v;
+                if (v <= axis.min || v >= axis.max)
+                    continue;
+    
+                ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, -5);
+                ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 5);
+            }
+
+            axis = axes.y2axis;
+            for (i = 0; i < axis.ticks.length; ++i) {
+                v = axis.ticks[i].v;
+                if (v <= axis.min || v >= axis.max)
+                    continue;
+
+                ctx.moveTo(plotWidth-5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2);
+                ctx.lineTo(plotWidth+5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2);
+            }
+            
+            ctx.stroke();
+            
+            if (options.grid.borderWidth) {
+                // draw border
+                var bw = options.grid.borderWidth;
+                ctx.lineWidth = bw;
+                ctx.strokeStyle = options.grid.borderColor;
+                ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
+            }
+
+            ctx.restore();
+        }
+
+        function insertLabels() {
+            placeholder.find(".tickLabels").remove();
+            
+            var html = ['<div class="tickLabels" style="font-size:smaller;color:' + options.grid.color + '">'];
+
+            function addLabels(axis, labelGenerator) {
+                for (var i = 0; i < axis.ticks.length; ++i) {
+                    var tick = axis.ticks[i];
+                    if (!tick.label || tick.v < axis.min || tick.v > axis.max)
+                        continue;
+                    html.push(labelGenerator(tick, axis));
+                }
+            }
+
+            var margin = options.grid.labelMargin + options.grid.borderWidth;
+            
+            addLabels(axes.xaxis, function (tick, axis) {
+                return '<div style="position:absolute;top:' + (plotOffset.top + plotHeight + margin) + 'px;left:' + Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2) + 'px;width:' + axis.labelWidth + 'px;text-align:center" class="tickLabel">' + tick.label + "</div>";
+            });
+            
+            
+            addLabels(axes.yaxis, function (tick, axis) {
+                return '<div style="position:absolute;top:' + Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2) + 'px;right:' + (plotOffset.right + plotWidth + margin) + 'px;width:' + axis.labelWidth + 'px;text-align:right" class="tickLabel">' + tick.label + "</div>";
+            });
+            
+            addLabels(axes.x2axis, function (tick, axis) {
+                return '<div style="position:absolute;bottom:' + (plotOffset.bottom + plotHeight + margin) + 'px;left:' + Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2) + 'px;width:' + axis.labelWidth + 'px;text-align:center" class="tickLabel">' + tick.label + "</div>";
+            });
+            
+            addLabels(axes.y2axis, function (tick, axis) {
+                return '<div style="position:absolute;top:' + Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2) + 'px;left:' + (plotOffset.left + plotWidth + margin) +'px;width:' + axis.labelWidth + 'px;text-align:left" class="tickLabel">' + tick.label + "</div>";
+            });
+
+            html.push('</div>');
+            
+            placeholder.append(html.join(""));
+        }
+
+        function drawSeries(series) {
+            if (series.lines.show)
+                drawSeriesLines(series);
+            if (series.bars.show)
+                drawSeriesBars(series);
+            if (series.points.show)
+                drawSeriesPoints(series);
+        }
+        
+        function drawSeriesLines(series) {
+            function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    prevx = null, prevy = null;
+                
+                ctx.beginPath();
+                for (var i = ps; i < points.length; i += ps) {
+                    var x1 = points[i - ps], y1 = points[i - ps + 1],
+                        x2 = points[i], y2 = points[i + 1];
+                    
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min) {
+                        if (y2 < axisy.min)
+                            continue;   // line segment is outside
+                        // compute new intersection point
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min) {
+                        if (y1 < axisy.min)
+                            continue;
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max) {
+                        if (y2 > axisy.max)
+                            continue;
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max) {
+                        if (y1 > axisy.max)
+                            continue;
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (x1 != prevx || y1 != prevy)
+                        ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
+                    
+                    prevx = x2;
+                    prevy = y2;
+                    ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
+                }
+                ctx.stroke();
+            }
+
+            function plotLineArea(datapoints, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    bottom = Math.min(Math.max(0, axisy.min), axisy.max),
+                    top, lastX = 0, areaOpen = false;
+                
+                for (var i = ps; i < points.length; i += ps) {
+                    var x1 = points[i - ps], y1 = points[i - ps + 1],
+                        x2 = points[i], y2 = points[i + 1];
+                    
+                    if (areaOpen && x1 != null && x2 == null) {
+                        // close area
+                        ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom));
+                        ctx.fill();
+                        areaOpen = false;
+                        continue;
+                    }
+
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip x values
+                    
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (!areaOpen) {
+                        // open area
+                        ctx.beginPath();
+                        ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
+                        areaOpen = true;
+                    }
+                    
+                    // now first check the case where both is outside
+                    if (y1 >= axisy.max && y2 >= axisy.max) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
+                        lastX = x2;
+                        continue;
+                    }
+                    else if (y1 <= axisy.min && y2 <= axisy.min) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
+                        lastX = x2;
+                        continue;
+                    }
+                    
+                    // else it's a bit more complicated, there might
+                    // be two rectangles and two triangles we need to fill
+                    // in; to find these keep track of the current x values
+                    var x1old = x1, x2old = x2;
+
+                    // and clip the y values, without shortcutting
+                    
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+
+                    // if the x value was changed we got a rectangle
+                    // to fill
+                    if (x1 != x1old) {
+                        if (y1 <= axisy.min)
+                            top = axisy.min;
+                        else
+                            top = axisy.max;
+                        
+                        ctx.lineTo(axisx.p2c(x1old), axisy.p2c(top));
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(top));
+                    }
+                    
+                    // fill the triangles
+                    ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
+                    ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
+
+                    // fill the other rectangle if it's there
+                    if (x2 != x2old) {
+                        if (y2 <= axisy.min)
+                            top = axisy.min;
+                        else
+                            top = axisy.max;
+                        
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(top));
+                        ctx.lineTo(axisx.p2c(x2old), axisy.p2c(top));
+                    }
+
+                    lastX = Math.max(x2, x2old);
+                }
+
+                if (areaOpen) {
+                    ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom));
+                    ctx.fill();
+                }
+            }
+            
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+            ctx.lineJoin = "round";
+
+            var lw = series.lines.lineWidth,
+                sw = series.shadowSize;
+            // FIXME: consider another form of shadow when filling is turned on
+            if (lw > 0 && sw > 0) {
+                // draw shadow as a thick and thin line with transparency
+                ctx.lineWidth = sw;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                // position shadow at angle from the mid of line
+                var angle = Math.PI/18;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
+                ctx.lineWidth = sw/2;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
+            if (fillStyle) {
+                ctx.fillStyle = fillStyle;
+                plotLineArea(series.datapoints, series.xaxis, series.yaxis);
+            }
+
+            if (lw > 0)
+                plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function drawSeriesPoints(series) {
+            function plotPoints(datapoints, radius, fillStyle, offset, circumference, axisx, axisy) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+                
+                for (var i = 0; i < points.length; i += ps) {
+                    var x = points[i], y = points[i + 1];
+                    if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                        continue;
+                    
+                    ctx.beginPath();
+                    ctx.arc(axisx.p2c(x), axisy.p2c(y) + offset, radius, 0, circumference, false);
+                    if (fillStyle) {
+                        ctx.fillStyle = fillStyle;
+                        ctx.fill();
+                    }
+                    ctx.stroke();
+                }
+            }
+            
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            var lw = series.lines.lineWidth,
+                sw = series.shadowSize,
+                radius = series.points.radius;
+            if (lw > 0 && sw > 0) {
+                // draw shadow in two steps
+                var w = sw / 2;
+                ctx.lineWidth = w;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                plotPoints(series.datapoints, radius, null, w + w/2, Math.PI,
+                           series.xaxis, series.yaxis);
+
+                ctx.strokeStyle = "rgba(0,0,0,0.2)";
+                plotPoints(series.datapoints, radius, null, w/2, Math.PI,
+                           series.xaxis, series.yaxis);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            plotPoints(series.datapoints, radius,
+                       getFillStyle(series.points, series.color), 0, 2 * Math.PI,
+                       series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal) {
+            var left, right, bottom, top,
+                drawLeft, drawRight, drawTop, drawBottom,
+                tmp;
+
+            if (horizontal) {
+                drawBottom = drawRight = drawTop = true;
+                drawLeft = false;
+                left = b;
+                right = x;
+                top = y + barLeft;
+                bottom = y + barRight;
+
+                // account for negative bars
+                if (right < left) {
+                    tmp = right;
+                    right = left;
+                    left = tmp;
+                    drawLeft = true;
+                    drawRight = false;
+                }
+            }
+            else {
+                drawLeft = drawRight = drawTop = true;
+                drawBottom = false;
+                left = x + barLeft;
+                right = x + barRight;
+                bottom = b;
+                top = y;
+
+                // account for negative bars
+                if (top < bottom) {
+                    tmp = top;
+                    top = bottom;
+                    bottom = tmp;
+                    drawBottom = true;
+                    drawTop = false;
+                }
+            }
+           
+            // clip
+            if (right < axisx.min || left > axisx.max ||
+                top < axisy.min || bottom > axisy.max)
+                return;
+            
+            if (left < axisx.min) {
+                left = axisx.min;
+                drawLeft = false;
+            }
+
+            if (right > axisx.max) {
+                right = axisx.max;
+                drawRight = false;
+            }
+
+            if (bottom < axisy.min) {
+                bottom = axisy.min;
+                drawBottom = false;
+            }
+            
+            if (top > axisy.max) {
+                top = axisy.max;
+                drawTop = false;
+            }
+
+            left = axisx.p2c(left);
+            bottom = axisy.p2c(bottom);
+            right = axisx.p2c(right);
+            top = axisy.p2c(top);
+            
+            // fill the bar
+            if (fillStyleCallback) {
+                c.beginPath();
+                c.moveTo(left, bottom);
+                c.lineTo(left, top);
+                c.lineTo(right, top);
+                c.lineTo(right, bottom);
+                c.fillStyle = fillStyleCallback(bottom, top);
+                c.fill();
+            }
+
+            // draw outline
+            if (drawLeft || drawRight || drawTop || drawBottom) {
+                c.beginPath();
+
+                // FIXME: inline moveTo is buggy with excanvas
+                c.moveTo(left, bottom + offset);
+                if (drawLeft)
+                    c.lineTo(left, top + offset);
+                else
+                    c.moveTo(left, top + offset);
+                if (drawTop)
+                    c.lineTo(right, top + offset);
+                else
+                    c.moveTo(right, top + offset);
+                if (drawRight)
+                    c.lineTo(right, bottom + offset);
+                else
+                    c.moveTo(right, bottom + offset);
+                if (drawBottom)
+                    c.lineTo(left, bottom + offset);
+                else
+                    c.moveTo(left, bottom + offset);
+                c.stroke();
+            }
+        }
+        
+        function drawSeriesBars(series) {
+            function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+                
+                for (var i = 0; i < points.length; i += ps) {
+                    if (points[i] == null)
+                        continue;
+                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal);
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // FIXME: figure out a way to add shadows (for instance along the right edge)
+            ctx.lineWidth = series.bars.lineWidth;
+            ctx.strokeStyle = series.color;
+            var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;
+            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
+            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function getFillStyle(filloptions, seriesColor, bottom, top) {
+            var fill = filloptions.fill;
+            if (!fill)
+                return null;
+
+            if (filloptions.fillColor)
+                return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
+            
+            var c = $.color.parse(seriesColor);
+            c.a = typeof fill == "number" ? fill : 0.4;
+            c.normalize();
+            return c.toString();
+        }
+        
+        function insertLegend() {
+            placeholder.find(".legend").remove();
+
+            if (!options.legend.show)
+                return;
+            
+            var fragments = [], rowStarted = false,
+                lf = options.legend.labelFormatter, s, label;
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                label = s.label;
+                if (!label)
+                    continue;
+                
+                if (i % options.legend.noColumns == 0) {
+                    if (rowStarted)
+                        fragments.push('</tr>');
+                    fragments.push('<tr>');
+                    rowStarted = true;
+                }
+
+                if (lf)
+                    label = lf(label, s);
+                
+                fragments.push(
+                    '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden"></div></div></td>' +
+                    '<td class="legendLabel">' + label + '</td>');
+            }
+            if (rowStarted)
+                fragments.push('</tr>');
+            
+            if (fragments.length == 0)
+                return;
+
+            var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
+            if (options.legend.container != null)
+                $(options.legend.container).html(table);
+            else {
+                var pos = "",
+                    p = options.legend.position,
+                    m = options.legend.margin;
+                if (m[0] == null)
+                    m = [m, m];
+                if (p.charAt(0) == "n")
+                    pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
+                else if (p.charAt(0) == "s")
+                    pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
+                if (p.charAt(1) == "e")
+                    pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
+                else if (p.charAt(1) == "w")
+                    pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
+                var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
+                if (options.legend.backgroundOpacity != 0.0) {
+                    // put in the transparent background
+                    // separately to avoid blended labels and
+                    // label boxes
+                    var c = options.legend.backgroundColor;
+                    if (c == null) {
+                        c = options.grid.backgroundColor;
+                        if (c && typeof c == "string")
+                            c = $.color.parse(c);
+                        else
+                            c = $.color.extract(legend, 'background-color');
+                        c.a = 1;
+                        c = c.toString();
+                    }
+                    var div = legend.children();
+                    $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
+                }
+            }
+        }
+
+
+        // interactive features
+        
+        var highlights = [],
+            redrawTimeout = null;
+        
+        // returns the data item the mouse is over, or null if none is found
+        function findNearbyItem(mouseX, mouseY, seriesFilter) {
+            var maxDistance = options.grid.mouseActiveRadius,
+                smallestDistance = maxDistance * maxDistance + 1,
+                item = null, foundPoint = false, i, j;
+
+            for (i = 0; i < series.length; ++i) {
+                if (!seriesFilter(series[i]))
+                    continue;
+                
+                var s = series[i],
+                    axisx = s.xaxis,
+                    axisy = s.yaxis,
+                    points = s.datapoints.points,
+                    ps = s.datapoints.pointsize,
+                    mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
+                    my = axisy.c2p(mouseY),
+                    maxx = maxDistance / axisx.scale,
+                    maxy = maxDistance / axisy.scale;
+
+                if (s.lines.show || s.points.show) {
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1];
+                        if (x == null)
+                            continue;
+                        
+                        // For points and lines, the cursor must be within a
+                        // certain distance to the data point
+                        if (x - mx > maxx || x - mx < -maxx ||
+                            y - my > maxy || y - my < -maxy)
+                            continue;
+
+                        // We have to calculate distances in pixels, not in
+                        // data units, because the scales of the axes may be different
+                        var dx = Math.abs(axisx.p2c(x) - mouseX),
+                            dy = Math.abs(axisy.p2c(y) - mouseY),
+                            dist = dx * dx + dy * dy; // we save the sqrt
+
+                        // use <= to ensure last point takes precedence
+                        // (last generally means on top of)
+                        if (dist <= smallestDistance) {
+                            smallestDistance = dist;
+                            item = [i, j / ps];
+                        }
+                    }
+                }
+                    
+                if (s.bars.show && !item) { // no other point can be nearby
+                    var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2,
+                        barRight = barLeft + s.bars.barWidth;
+                    
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1], b = points[j + 2];
+                        if (x == null)
+                            continue;
+  
+                        // for a bar graph, the cursor must be inside the bar
+                        if (series[i].bars.horizontal ? 
+                            (mx <= Math.max(b, x) && mx >= Math.min(b, x) && 
+                             my >= y + barLeft && my <= y + barRight) :
+                            (mx >= x + barLeft && mx <= x + barRight &&
+                             my >= Math.min(b, y) && my <= Math.max(b, y)))
+                                item = [i, j / ps];
+                    }
+                }
+            }
+
+            if (item) {
+                i = item[0];
+                j = item[1];
+                ps = series[i].datapoints.pointsize;
+                
+                return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
+                         dataIndex: j,
+                         series: series[i],
+                         seriesIndex: i };
+            }
+            
+            return null;
+        }
+
+        function onMouseMove(e) {
+            if (options.grid.hoverable)
+                triggerClickHoverEvent("plothover", e,
+                                       function (s) { return s["hoverable"] != false; });
+        }
+        
+        function onClick(e) {
+            triggerClickHoverEvent("plotclick", e,
+                                   function (s) { return s["clickable"] != false; });
+        }
+
+        // trigger click or hover event (they send the same parameters
+        // so we share their code)
+        function triggerClickHoverEvent(eventname, event, seriesFilter) {
+            var offset = eventHolder.offset(),
+                pos = { pageX: event.pageX, pageY: event.pageY },
+                canvasX = event.pageX - offset.left - plotOffset.left,
+                canvasY = event.pageY - offset.top - plotOffset.top;
+
+            if (axes.xaxis.used)
+                pos.x = axes.xaxis.c2p(canvasX);
+            if (axes.yaxis.used)
+                pos.y = axes.yaxis.c2p(canvasY);
+            if (axes.x2axis.used)
+                pos.x2 = axes.x2axis.c2p(canvasX);
+            if (axes.y2axis.used)
+                pos.y2 = axes.y2axis.c2p(canvasY);
+
+            var item = findNearbyItem(canvasX, canvasY, seriesFilter);
+
+            if (item) {
+                // fill in mouse pos for any listeners out there
+                item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left);
+                item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top);
+            }
+
+            if (options.grid.autoHighlight) {
+                // clear auto-highlights
+                for (var i = 0; i < highlights.length; ++i) {
+                    var h = highlights[i];
+                    if (h.auto == eventname &&
+                        !(item && h.series == item.series && h.point == item.datapoint))
+                        unhighlight(h.series, h.point);
+                }
+                
+                if (item)
+                    highlight(item.series, item.datapoint, eventname);
+            }
+            
+            placeholder.trigger(eventname, [ pos, item ]);
+        }
+
+        function triggerRedrawOverlay() {
+            if (!redrawTimeout)
+                redrawTimeout = setTimeout(drawOverlay, 30);
+        }
+
+        function drawOverlay() {
+            redrawTimeout = null;
+
+            // draw highlights
+            octx.save();
+            octx.clearRect(0, 0, canvasWidth, canvasHeight);
+            octx.translate(plotOffset.left, plotOffset.top);
+            
+            var i, hi;
+            for (i = 0; i < highlights.length; ++i) {
+                hi = highlights[i];
+
+                if (hi.series.bars.show)
+                    drawBarHighlight(hi.series, hi.point);
+                else
+                    drawPointHighlight(hi.series, hi.point);
+            }
+            octx.restore();
+            
+            executeHooks(hooks.drawOverlay, [octx]);
+        }
+        
+        function highlight(s, point, auto) {
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number")
+                point = s.data[point];
+
+            var i = indexOfHighlight(s, point);
+            if (i == -1) {
+                highlights.push({ series: s, point: point, auto: auto });
+
+                triggerRedrawOverlay();
+            }
+            else if (!auto)
+                highlights[i].auto = false;
+        }
+            
+        function unhighlight(s, point) {
+            if (s == null && point == null) {
+                highlights = [];
+                triggerRedrawOverlay();
+            }
+            
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number")
+                point = s.data[point];
+
+            var i = indexOfHighlight(s, point);
+            if (i != -1) {
+                highlights.splice(i, 1);
+
+                triggerRedrawOverlay();
+            }
+        }
+        
+        function indexOfHighlight(s, p) {
+            for (var i = 0; i < highlights.length; ++i) {
+                var h = highlights[i];
+                if (h.series == s && h.point[0] == p[0]
+                    && h.point[1] == p[1])
+                    return i;
+            }
+            return -1;
+        }
+        
+        function drawPointHighlight(series, point) {
+            var x = point[0], y = point[1],
+                axisx = series.xaxis, axisy = series.yaxis;
+            
+            if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                return;
+            
+            var pointRadius = series.points.radius + series.points.lineWidth / 2;
+            octx.lineWidth = pointRadius;
+            octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();
+            var radius = 1.5 * pointRadius;
+            octx.beginPath();
+            octx.arc(axisx.p2c(x), axisy.p2c(y), radius, 0, 2 * Math.PI, false);
+            octx.stroke();
+        }
+
+        function drawBarHighlight(series, point) {
+            octx.lineWidth = series.bars.lineWidth;
+            octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString();
+            var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString();
+            var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;
+            drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
+                    0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal);
+        }
+
+        function getColorOrGradient(spec, bottom, top, defaultColor) {
+            if (typeof spec == "string")
+                return spec;
+            else {
+                // assume this is a gradient spec; IE currently only
+                // supports a simple vertical gradient properly, so that's
+                // what we support too
+                var gradient = ctx.createLinearGradient(0, top, 0, bottom);
+                
+                for (var i = 0, l = spec.colors.length; i < l; ++i) {
+                    var c = spec.colors[i];
+                    if (typeof c != "string") {
+                        c = $.color.parse(defaultColor).scale('rgb', c.brightness);
+                        c.a *= c.opacity;
+                        c = c.toString();
+                    }
+                    gradient.addColorStop(i / (l - 1), c);
+                }
+                
+                return gradient;
+            }
+        }
+    }
+
+    $.plot = function(placeholder, data, options) {
+        var plot = new Plot($(placeholder), data, options, $.plot.plugins);
+        /*var t0 = new Date();
+        var t1 = new Date();
+        var tstr = "time used (msecs): " + (t1.getTime() - t0.getTime())
+        if (window.console)
+            console.log(tstr);
+        else
+            alert(tstr);*/
+        return plot;
+    };
+
+    $.plot.plugins = [];
+
+    // returns a string with the date d formatted according to fmt
+    $.plot.formatDate = function(d, fmt, monthNames) {
+        var leftPad = function(n) {
+            n = "" + n;
+            return n.length == 1 ? "0" + n : n;
+        };
+        
+        var r = [];
+        var escape = false;
+        var hours = d.getUTCHours();
+        var isAM = hours < 12;
+        if (monthNames == null)
+            monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+
+        if (fmt.search(/%p|%P/) != -1) {
+            if (hours > 12) {
+                hours = hours - 12;
+            } else if (hours == 0) {
+                hours = 12;
+            }
+        }
+        for (var i = 0; i < fmt.length; ++i) {
+            var c = fmt.charAt(i);
+            
+            if (escape) {
+                switch (c) {
+                case 'h': c = "" + hours; break;
+                case 'H': c = leftPad(hours); break;
+                case 'M': c = leftPad(d.getUTCMinutes()); break;
+                case 'S': c = leftPad(d.getUTCSeconds()); break;
+                case 'd': c = "" + d.getUTCDate(); break;
+                case 'm': c = "" + (d.getUTCMonth() + 1); break;
+                case 'y': c = "" + d.getUTCFullYear(); break;
+                case 'b': c = "" + monthNames[d.getUTCMonth()]; break;
+                case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
+                case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
+                }
+                r.push(c);
+                escape = false;
+            }
+            else {
+                if (c == "%")
+                    escape = true;
+                else
+                    r.push(c);
+            }
+        }
+        return r.join("");
+    };
+    
+    // round to nearby lower multiple of base
+    function floorInBase(n, base) {
+        return base * Math.floor(n / base);
+    }
+    
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.min.js 2.3.1.src/ext/flot/jquery.flot.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E<C.length;++E){A[C.charAt(E)]+=D}return A.normalize()};A.scale=function(C,D){for(var E=0;E<C.length;++E){A[C.charAt(E)]*=D}return A.normalize()};A.toString=function(){if(A.a>=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return D<E?E:(D>F?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL<AM.length;++AL){AM[AL].apply(this,AK)}}function b(){for(var AK=0;AK<E.length;++AK){var AL=E[AK];AL.init(G);if(AL.options){C.extend(true,g,AL.options)}}}function r(AK){C.extend(true,g,AK);if(g.grid.borderColor==null){g.grid.borderColor=g.grid.color}if(g.xaxis.noTicks&&g.xaxis.ticks==null){g.xaxis.ticks=g.xaxis.noTicks}if(g.yaxis.noTicks&&g.yaxis.ticks==null){g.yaxis.ticks=g.yaxis.noTicks}if(g.grid.coloredAreas){g.grid.markings=g.grid.coloredAreas}if(g.grid.coloredAreasColor){g.grid.markingsColor=g.grid.coloredAreasColor}if(g.lines){C.extend(true,g.series.lines,g.lines)}if(g.points){C.extend(true,g.series.points,g.points)}if(g.bars){C.extend(true,g.series.bars,g.bars)}if(g.shadowSize){g.series.shadowSize=g.shadowSize}for(var AL in L){if(g.hooks[AL]&&g.hooks[AL].length){L[AL]=L[AL].concat(g.hooks[AL])}}Z(L.processOptions,[g])}function f(AK){O=M(AK);U();m()}function M(AN){var AL=[];for(var AK=0;AK<AN.length;++AK){var AM=C.extend(true,{},g.series);if(AN[AK].data){AM.data=AN[AK].data;delete AN[AK].data;C.extend(true,AM,AN[AK]);AN[AK].data=AM.data}else{AM.data=AN[AK]}AL.push(AM)}return AL}function T(AM,AK){var AL=AM[AK];if(!AL||AL==1){return s[AK]}if(typeof AL=="number"){return s[AK.charAt(0)+AL+AK.slice(1)]}return AL}function U(){var AP;var AV=O.length,AK=[],AN=[];for(AP=0;AP<O.length;++AP){var AS=O[AP].color;if(AS!=null){--AV;if(typeof AS=="number"){AN.push(AS)}else{AK.push(C.color.parse(O[AP].color))}}}for(AP=0;AP<AN.length;++AP){AV=Math.max(AV,AN[AP]+1)}var AL=[],AO=0;AP=0;while(AL.length<AV){var AR;if(g.colors.length==AP){AR=C.color.make(100,100,100)}else{AR=C.color.parse(g.colors[AP])}var AM=AO%2==1?-1:1;AR.scale("rgb",1+AM*Math.ceil(AO/2)*0.2);AL.push(AR);++AP;if(AP>=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;AP<O.length;++AP){AW=O[AP];if(AW.color==null){AW.color=AL[AQ].toString();++AQ}else{if(typeof AW.color=="number"){AW.color=AL[AW.color].toString()}}if(AW.lines.show==null){var AU,AT=true;for(AU in AW){if(AW[AU].show){AT=false;break}}if(AT){AW.lines.show=true}}AW.xaxis=T(AW,"xaxis");AW.yaxis=T(AW,"yaxis")}}function m(){var AW=Number.POSITIVE_INFINITY,AQ=Number.NEGATIVE_INFINITY,Ac,Aa,AZ,AV,AL,AR,Ab,AX,AP,AO,AK,Ai,Af,AT;for(AK in s){s[AK].datamin=AW;s[AK].datamax=AQ;s[AK].used=false}function AN(Al,Ak,Aj){if(Ak<Al.datamin){Al.datamin=Ak}if(Aj>Al.datamax){Al.datamax=Aj}}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];AR.datapoints={points:[]};Z(L.processRawData,[AR,AR.data,AR.datapoints])}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];var Ah=AR.data,Ae=AR.datapoints.format;if(!Ae){Ae=[];Ae.push({x:true,number:true,required:true});Ae.push({y:true,number:true,required:true});if(AR.bars.show){Ae.push({y:true,number:true,required:false,defaultValue:0})}AR.datapoints.format=Ae}if(AR.datapoints.pointsize!=null){continue}if(AR.datapoints.pointsize==null){AR.datapoints.pointsize=Ae.length}AX=AR.datapoints.pointsize;Ab=AR.datapoints.points;insertSteps=AR.lines.show&&AR.lines.steps;AR.xaxis.used=AR.yaxis.used=true;for(Aa=AZ=0;Aa<Ah.length;++Aa,AZ+=AX){AT=Ah[Aa];var AM=AT==null;if(!AM){for(AV=0;AV<AX;++AV){Ai=AT[AV];Af=Ae[AV];if(Af){if(Af.number&&Ai!=null){Ai=+Ai;if(isNaN(Ai)){Ai=null}}if(Ai==null){if(Af.required){AM=true}if(Af.defaultValue!=null){Ai=Af.defaultValue}}}Ab[AZ+AV]=Ai}}if(AM){for(AV=0;AV<AX;++AV){Ai=Ab[AZ+AV];if(Ai!=null){Af=Ae[AV];if(Af.x){AN(AR.xaxis,Ai,Ai)}if(Af.y){AN(AR.yaxis,Ai,Ai)}}Ab[AZ+AV]=null}}else{if(insertSteps&&AZ>0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AV<AX;++AV){Ab[AZ+AX+AV]=Ab[AZ+AV]}Ab[AZ+1]=Ab[AZ-AX+1];AZ+=AX}}}}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];Z(L.processDatapoints,[AR,AR.datapoints])}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];Ab=AR.datapoints.points,AX=AR.datapoints.pointsize;var AS=AW,AY=AW,AU=AQ,Ad=AQ;for(Aa=0;Aa<Ab.length;Aa+=AX){if(Ab[Aa]==null){continue}for(AV=0;AV<AX;++AV){Ai=Ab[Aa+AV];Af=Ae[AV];if(!Af){continue}if(Af.x){if(Ai<AS){AS=Ai}if(Ai>AU){AU=Ai}}if(Af.y){if(Ai<AY){AY=Ai}if(Ai>Ad){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ<AR.ticks.length;++AQ){AP=AR.ticks[AQ].label;if(AP){AS.push('<div class="tickLabel" style="float:left;width:'+AR.labelWidth+'px">'+AP+"</div>")}}if(AS.length>0){var AO=C('<div style="position:absolute;top:-10000px;width:10000px;font-size:smaller">'+AS.join("")+'<div style="clear:left"></div></div>').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ<AR.ticks.length;++AQ){AP=AR.ticks[AQ].label;if(AP){AS.push('<div class="tickLabel">'+AP+"</div>")}}if(AS.length>0){var AO=C('<div style="position:absolute;top:-10000px;font-size:smaller">'+AS.join("")+"</div>").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i<O.length;++i){AP=Math.max(AP,2*(O[i].points.radius+O[i].points.lineWidth/2))}e.left=e.right=e.top=e.bottom=AP;var AO=g.grid.labelMargin+g.grid.borderWidth;if(s.xaxis.labelHeight>0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR<AY.length-1;++AR){if(AX<(AY[AR][0]*AU[AY[AR][1]]+AY[AR+1][0]*AU[AY[AR+1][1]])/2&&AY[AR][0]*AU[AY[AR][1]]>=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(Aj<Ac.max&&Aj!=Ad);return Ah};AW=function(Aa,Ad){var Af=new Date(Aa);if(AS.timeformat!=null){return C.plot.formatDate(Af,AS.timeformat,AS.monthNames)}var Ab=Ad.tickSize[0]*AU[Ad.tickSize[1]];var Ac=Ad.max-Ad.min;var Ae=(AS.twelveHourClock)?" %p":"";if(Ab<AU.minute){fmt="%h:%M:%S"+Ae}else{if(Ab<AU.day){if(Ac<2*AU.day){fmt="%h:%M"+Ae}else{fmt="%b %d %h:%M"+Ae}}else{if(Ab<AU.month){fmt="%b %d"}else{if(Ab<AU.year){if(Ac<AU.year){fmt="%b"}else{fmt="%b %y"}}else{fmt="%y"}}}}return C.plot.formatDate(Af,fmt,AS.monthNames)}}else{var AK=AS.tickDecimals;var AQ=-Math.floor(Math.log(AX)/Math.LN10);if(AK!=null&&AQ>AK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ<AS.minTickSize){AZ=AS.minTickSize}if(AS.tickSize!=null){AZ=AS.tickSize}AP.tickDecimals=Math.max(0,(AK!=null)?AK:AQ);AT=function(Ac){var Ae=[];var Af=A(Ac.min,Ac.tickSize),Ab=0,Aa=Number.NaN,Ad;do{Ad=Aa;Aa=Af+Ab*Ac.tickSize;Ae.push({v:Aa,label:Ac.tickFormatter(Aa,Ac)});++Ab}while(Aa<Ac.max&&Aa!=Ad);return Ae};AW=function(Aa,Ab){return Aa.toFixed(Ab.tickDecimals)}}AP.tickSize=AV?[AZ,AV]:AZ;AP.tickGenerator=AT;if(C.isFunction(AS.tickFormatter)){AP.tickFormatter=function(Aa,Ab){return""+AS.tickFormatter(Aa,Ab)}}else{AP.tickFormatter=AW}}function p(AO,AQ){AO.ticks=[];if(!AO.used){return }if(AQ.ticks==null){AO.ticks=AO.tickGenerator(AO)}else{if(typeof AQ.ticks=="number"){if(AQ.ticks>0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN<AP.length;++AN){var AL=null;var AM=AP[AN];if(typeof AM=="object"){AK=AM[0];if(AM.length>1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AK<O.length;++AK){AA(O[AK])}Z(L.draw,[Y]);if(AL.show&&AL.aboveData){S()}}function N(AL,AR){var AO=AR+"axis",AK=AR+"2axis",AN,AQ,AP,AM;if(AL[AO]){AN=s[AO];AQ=AL[AO].from;AP=AL[AO].to}else{if(AL[AK]){AN=s[AK];AQ=AL[AK].from;AP=AL[AK].to}else{AN=s[AO];AQ=AL[AR+"1"];AP=AL[AR+"2"]}}if(AQ!=null&&AP!=null&&AQ>AP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AO<AL.length;++AO){var AK=AL[AO],AQ=N(AK,"x"),AN=N(AK,"y");if(AQ.from==null){AQ.from=AQ.axis.min}if(AQ.to==null){AQ.to=AQ.axis.max}if(AN.from==null){AN.from=AN.axis.min}if(AN.to==null){AN.to=AN.axis.max}if(AQ.to<AQ.axis.min||AQ.from>AQ.axis.max||AN.to<AN.axis.min||AN.from>AN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['<div class="tickLabels" style="font-size:smaller;color:'+g.grid.color+'">'];function AM(AP,AQ){for(var AO=0;AO<AP.ticks.length;++AO){var AN=AP.ticks[AO];if(!AN.label||AN.v<AP.min||AN.v>AP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'<div style="position:absolute;top:'+(e.top+t+AL)+"px;left:"+Math.round(e.left+AO.p2c(AN.v)-AO.labelWidth/2)+"px;width:"+AO.labelWidth+'px;text-align:center" class="tickLabel">'+AN.label+"</div>"});AM(s.yaxis,function(AN,AO){return'<div style="position:absolute;top:'+Math.round(e.top+AO.p2c(AN.v)-AO.labelHeight/2)+"px;right:"+(e.right+I+AL)+"px;width:"+AO.labelWidth+'px;text-align:right" class="tickLabel">'+AN.label+"</div>"});AM(s.x2axis,function(AN,AO){return'<div style="position:absolute;bottom:'+(e.bottom+t+AL)+"px;left:"+Math.round(e.left+AO.p2c(AN.v)-AO.labelWidth/2)+"px;width:"+AO.labelWidth+'px;text-align:center" class="tickLabel">'+AN.label+"</div>"});AM(s.y2axis,function(AN,AO){return'<div style="position:absolute;top:'+Math.round(e.top+AO.p2c(AN.v)-AO.labelHeight/2)+"px;left:"+(e.left+I+AL)+"px;width:"+AO.labelWidth+'px;text-align:left" class="tickLabel">'+AN.label+"</div>"});AK.push("</div>");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX<Ae.length;AX+=AS){var AU=Ae[AX-AS],Ab=Ae[AX-AS+1],AT=Ae[AX],Aa=Ae[AX+1];if(AU==null||AT==null){continue}if(Ab<=Aa&&Ab<Ac.min){if(Aa<Ac.min){continue}AU=(Ac.min-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(Aa<=Ab&&Aa<Ac.min){if(Ab<Ac.min){continue}AT=(Ac.min-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.min}}if(Ab>=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU<Ad.min){if(AT<Ad.min){continue}Ab=(Ad.min-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.min}else{if(AT<=AU&&AT<Ad.min){if(AU<Ad.min){continue}Aa=(Ad.min-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.min}}if(AU>=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW<Af.length;AW+=AR){var AU=Af[AW-AR],Ab=Af[AW-AR+1],AT=Af[AW],AZ=Af[AW+1];if(Ad&&AU!=null&&AT==null){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill();Ad=false;continue}if(AU==null||AT==null){continue}if(AU<=AT&&AU<Ae.min){if(AT<Ae.min){continue}Ab=(Ae.min-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.min}else{if(AT<=AU&&AT<Ae.min){if(AU<Ae.min){continue}AZ=(Ae.min-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.min}}if(AU>=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab<Ac.min&&AZ>=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ<Ac.min&&Ab>=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;AS<Aa.length;AS+=AQ){var AX=Aa[AS],AW=Aa[AS+1];if(AX==null||AX<AZ.min||AX>AZ.max||AW<AY.min||AW>AY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(Ab<AM){Aa=Ab;Ab=AM;AM=Aa;AO=true;AK=false}}else{AO=AK=AW=true;AP=false;AM=AV+AQ;Ab=AV+AY;AR=Ad;AX=AU;if(AX<AR){Aa=AX;AX=AR;AR=Aa;AP=true;AW=false}}if(Ab<AT.min||AM>AT.max||AX<AS.min||AR>AS.max){return }if(AM<AT.min){AM=AT.min;AO=false}if(Ab>AT.max){Ab=AT.max;AK=false}if(AR<AS.min){AR=AS.min;AP=false}if(AX>AS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ<AX.length;AQ+=AO){if(AX[AQ]==null){continue}AB(AX[AQ],AX[AQ+1],AX[AQ+2],AR,AU,AP,AT,AW,AV,Y,AM.bars.horizontal)}}Y.save();Y.translate(e.left,e.top);Y.lineWidth=AM.bars.lineWidth;Y.strokeStyle=AM.color;var AK=AM.bars.align=="left"?0:-AM.bars.barWidth/2;var AN=AM.bars.fill?function(AO,AP){return V(AM.bars,AM.color,AO,AP)}:null;AL(AM.datapoints,AK,AK+AM.bars.barWidth,0,AN,AM.xaxis,AM.yaxis);Y.restore()}function V(AM,AK,AL,AO){var AN=AM.fill;if(!AN){return null}if(AM.fillColor){return R(AM.fillColor,AL,AO,AK)}var AP=C.color.parse(AK);AP.a=typeof AN=="number"?AN:0.4;AP.normalize();return AP.toString()}function AI(){l.find(".legend").remove();if(!g.legend.show){return }var AP=[],AN=false,AV=g.legend.labelFormatter,AU,AR;for(i=0;i<O.length;++i){AU=O[i];AR=AU.label;if(!AR){continue}if(i%g.legend.noColumns==0){if(AN){AP.push("</tr>")}AP.push("<tr>");AN=true}if(AV){AR=AV(AR,AU)}AP.push('<td class="legendColorBox"><div style="border:1px solid '+g.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+AU.color+';overflow:hidden"></div></div></td><td class="legendLabel">'+AR+"</td>")}if(AN){AP.push("</tr>")}if(AP.length==0){return }var AT='<table style="font-size:smaller;color:'+g.grid.color+'">'+AP.join("")+"</table>";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('<div class="legend">'+AT.replace('style="','style="position:absolute;'+AQ+";")+"</div>").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('<div style="position:absolute;width:'+AK.width()+"px;height:"+AK.height()+"px;"+AQ+"background-color:"+AO+';"> </div>').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;Af<O.length;++Af){if(!AM(O[Af])){continue}var AY=O[Af],AQ=AY.xaxis,AO=AY.yaxis,Ae=AY.datapoints.points,Ac=AY.datapoints.pointsize,AZ=AQ.c2p(AR),AW=AO.c2p(AP),AL=AX/AQ.scale,AK=AX/AO.scale;if(AY.lines.show||AY.points.show){for(Ad=0;Ad<Ae.length;Ad+=Ac){var AT=Ae[Ad],AS=Ae[Ad+1];if(AT==null){continue}if(AT-AZ>AL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad<Ae.length;Ad+=Ac){var AT=Ae[Ad],AS=Ae[Ad+1],Ai=Ae[Ad+2];if(AT==null){continue}if(O[Af].bars.horizontal?(AZ<=Math.max(Ai,AT)&&AZ>=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;AP<w.length;++AP){var AR=w[AP];if(AR.auto==AL&&!(AT&&AR.series==AT.series&&AR.point==AT.datapoint)){x(AR.series,AR.point)}}if(AT){AE(AT.series,AT.datapoint,AL)}}l.trigger(AL,[AS,AT])}function q(){if(!J){J=setTimeout(v,30)}}function v(){J=null;AJ.save();AJ.clearRect(0,0,y,Q);AJ.translate(e.left,e.top);var AL,AK;for(AL=0;AL<w.length;++AL){AK=w[AL];if(AK.series.bars.show){z(AK.series,AK.point)}else{u(AK.series,AK.point)}}AJ.restore();Z(L.drawOverlay,[AJ])}function AE(AM,AK,AN){if(typeof AM=="number"){AM=O[AM]}if(typeof AK=="number"){AK=AM.data[AK]}var AL=j(AM,AK);if(AL==-1){w.push({series:AM,point:AK,auto:AN});q()}else{if(!AN){w[AL].auto=false}}}function x(AM,AK){if(AM==null&&AK==null){w=[];q()}if(typeof AM=="number"){AM=O[AM]}if(typeof AK=="number"){AK=AM.data[AK]}var AL=j(AM,AK);if(AL!=-1){w.splice(AL,1);q()}}function j(AM,AN){for(var AK=0;AK<w.length;++AK){var AL=w[AK];if(AL.series==AM&&AL.point[0]==AN[0]&&AL.point[1]==AN[1]){return AK}}return -1}function u(AN,AM){var AL=AM[0],AR=AM[1],AQ=AN.xaxis,AP=AN.yaxis;if(AL<AQ.min||AL>AQ.max||AR<AP.min||AR>AP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN<AK;++AN){var AR=AM.colors[AN];if(typeof AR!="string"){AR=C.color.parse(AO).scale("rgb",AR.brightness);AR.a*=AR.opacity;AR=AR.toString()}AP.addColorStop(AN/(AK-1),AR)}return AP}}}C.plot=function(G,E,D){var F=new B(C(G),E,D,C.plot.plugins);return F};C.plot.plugins=[];C.plot.formatDate=function(H,E,G){var L=function(N){N=""+N;return N.length==1?"0"+N:N};var D=[];var M=false;var K=H.getUTCHours();var I=K<12;if(G==null){G=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(E.search(/%p|%P/)!=-1){if(K>12){K=K-12}else{if(K==0){K=12}}}for(var F=0;F<E.length;++F){var J=E.charAt(F);if(M){switch(J){case"h":J=""+K;break;case"H":J=L(K);break;case"M":J=L(H.getUTCMinutes());break;case"S":J=L(H.getUTCSeconds());break;case"d":J=""+H.getUTCDate();break;case"m":J=""+(H.getUTCMonth()+1);break;case"y":J=""+H.getUTCFullYear();break;case"b":J=""+G[H.getUTCMonth()];break;case"p":J=(I)?("am"):("pm");break;case"P":J=(I)?("AM"):("PM");break}D.push(J);M=false}else{if(J=="%"){M=true}else{D.push(J)}}}return D.join("")};function A(E,D){return D*Math.floor(E/D)}})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.navigate.js 2.3.1.src/ext/flot/jquery.flot.navigate.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.navigate.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.navigate.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,272 @@
+/*
+Flot plugin for adding panning and zooming capabilities to a plot.
+
+The default behaviour is double click and scrollwheel up/down to zoom
+in, drag to pan. The plugin defines plot.zoom({ center }),
+plot.zoomOut() and plot.pan(offset) so you easily can add custom
+controls. It also fires a "plotpan" and "plotzoom" event when
+something happens, useful for synchronizing plots.
+
+Example usage:
+
+  plot = $.plot(...);
+  
+  // zoom default amount in on the pixel (100, 200) 
+  plot.zoom({ center: { left: 10, top: 20 } });
+
+  // zoom out again
+  plot.zoomOut({ center: { left: 10, top: 20 } });
+
+  // pan 100 pixels to the left and 20 down
+  plot.pan({ left: -100, top: 20 })
+
+
+Options:
+
+  zoom: {
+    interactive: false
+    trigger: "dblclick" // or "click" for single click
+    amount: 1.5         // 2 = 200% (zoom in), 0.5 = 50% (zoom out)
+  }
+  
+  pan: {
+    interactive: false
+  }
+
+  xaxis, yaxis, x2axis, y2axis: {
+    zoomRange: null  // or [number, number] (min range, max range)
+    panRange: null   // or [number, number] (min, max)
+  }
+  
+"interactive" enables the built-in drag/click behaviour. "amount" is
+the amount to zoom the viewport relative to the current range, so 1 is
+100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out).
+
+"zoomRange" is the interval in which zooming can happen, e.g. with
+zoomRange: [1, 100] the zoom will never scale the axis so that the
+difference between min and max is smaller than 1 or larger than 100.
+You can set either of them to null to ignore.
+
+"panRange" confines the panning to stay within a range, e.g. with
+panRange: [-10, 20] panning stops at -10 in one end and at 20 in the
+other. Either can be null.
+*/
+
+
+// First two dependencies, jquery.event.drag.js and
+// jquery.mousewheel.js, we put them inline here to save people the
+// effort of downloading them.
+
+/*
+jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)  
+Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
+*/
+(function(E){E.fn.drag=function(L,K,J){if(K){this.bind("dragstart",L)}if(J){this.bind("dragend",J)}return !L?this.trigger("drag"):this.bind("drag",K?K:L)};var A=E.event,B=A.special,F=B.drag={not:":input",distance:0,which:1,dragging:false,setup:function(J){J=E.extend({distance:F.distance,which:F.which,not:F.not},J||{});J.distance=I(J.distance);A.add(this,"mousedown",H,J);if(this.attachEvent){this.attachEvent("ondragstart",D)}},teardown:function(){A.remove(this,"mousedown",H);if(this===F.dragging){F.dragging=F.proxy=false}G(this,true);if(this.detachEvent){this.detachEvent("ondragstart",D)}}};B.dragstart=B.dragend={setup:function(){},teardown:function(){}};function H(L){var K=this,J,M=L.data||{};if(M.elem){K=L.dragTarget=M.elem;L.dragProxy=F.proxy||K;L.cursorOffsetX=M.pageX-M.left;L.cursorOffsetY=M.pageY-M.top;L.offsetX=L.pageX-L.cursorOffsetX;L.offsetY=L.pageY-L.cursorOffsetY}else{if(F.dragging||(M.which>0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY)<M.distance){break}L.target=M.target;J=C(L,"dragstart",K);if(J!==false){F.dragging=K;F.proxy=L.dragProxy=E(J||K)[0]}case"mousemove":if(F.dragging){J=C(L,"drag",K);if(B.drop){B.drop.allowed=(J!==false);B.drop.handler(L)}if(J!==false){break}L.type="mouseup"}case"mouseup":A.remove(document,"mousemove mouseup",H);if(F.dragging){if(B.drop){B.drop.handler(L)}C(L,"dragend",K)}G(K,true);F.dragging=F.proxy=M.elem=false;break}return true}function C(M,K,L){M.type=K;var J=E.event.handle.call(L,M);return J===false?false:J||M.result}function I(J){return Math.pow(J,2)}function D(){return(F.dragging===false)}function G(K,J){if(!K){return }K.unselectable=J?"off":"on";K.onselectstart=function(){return J};if(K.style){K.style.MozUserSelect=J?"":"none"}}})(jQuery);
+
+
+/* jquery.mousewheel.min.js
+ * Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
+ * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
+ *
+ * Version: 3.0.2
+ * 
+ * Requires: 1.2.2+
+ */
+(function(c){var a=["DOMMouseScroll","mousewheel"];c.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var d=a.length;d;){this.addEventListener(a[--d],b,false)}}else{this.onmousewheel=b}},teardown:function(){if(this.removeEventListener){for(var d=a.length;d;){this.removeEventListener(a[--d],b,false)}}else{this.onmousewheel=null}}};c.fn.extend({mousewheel:function(d){return d?this.bind("mousewheel",d):this.trigger("mousewheel")},unmousewheel:function(d){return this.unbind("mousewheel",d)}});function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(f||window.event);f.type="mousewheel";if(f.wheelDelta){g=f.wheelDelta/120}if(f.detail){g=-f.detail/3}d.unshift(f,g);return c.event.handle.apply(this,d)}})(jQuery);
+
+
+
+
+(function ($) {
+    var options = {
+        xaxis: {
+            zoomRange: null, // or [number, number] (min range, max range)
+            panRange: null // or [number, number] (min, max)
+        },
+        zoom: {
+            interactive: false,
+            trigger: "dblclick", // or "click" for single click
+            amount: 1.5 // how much to zoom relative to current position, 2 = 200% (zoom in), 0.5 = 50% (zoom out)
+        },
+        pan: {
+            interactive: false
+        }
+    };
+
+    function init(plot) {
+        function bindEvents(plot, eventHolder) {
+            var o = plot.getOptions();
+            if (o.zoom.interactive) {
+                function clickHandler(e, zoomOut) {
+                    var c = plot.offset();
+                    c.left = e.pageX - c.left;
+                    c.top = e.pageY - c.top;
+                    if (zoomOut)
+                        plot.zoomOut({ center: c });
+                    else
+                        plot.zoom({ center: c });
+                }
+                
+                eventHolder[o.zoom.trigger](clickHandler);
+
+                eventHolder.mousewheel(function (e, delta) {
+                    clickHandler(e, delta < 0);
+                    return false;
+                });
+            }
+            if (o.pan.interactive) {
+                var prevCursor = 'default', pageX = 0, pageY = 0;
+                
+                eventHolder.bind("dragstart", { distance: 10 }, function (e) {
+                    if (e.which != 1)  // only accept left-click
+                        return false;
+                    eventHolderCursor = eventHolder.css('cursor');
+                    eventHolder.css('cursor', 'move');
+                    pageX = e.pageX;
+                    pageY = e.pageY;
+                });
+                eventHolder.bind("drag", function (e) {
+                    // unused at the moment, but we need it here to
+                    // trigger the dragstart/dragend events
+                });
+                eventHolder.bind("dragend", function (e) {
+                    eventHolder.css('cursor', prevCursor);
+                    plot.pan({ left: pageX - e.pageX,
+                               top: pageY - e.pageY });
+                });
+            }
+        }
+
+        plot.zoomOut = function (args) {
+            if (!args)
+                args = {};
+            
+            if (!args.amount)
+                args.amount = plot.getOptions().zoom.amount
+
+            args.amount = 1 / args.amount;
+            plot.zoom(args);
+        }
+        
+        plot.zoom = function (args) {
+            if (!args)
+                args = {};
+            
+            var axes = plot.getAxes(),
+                options = plot.getOptions(),
+                c = args.center,
+                amount = args.amount ? args.amount : options.zoom.amount,
+                w = plot.width(), h = plot.height();
+
+            if (!c)
+                c = { left: w / 2, top: h / 2 };
+                
+            var xf = c.left / w,
+                x1 = c.left - xf * w / amount,
+                x2 = c.left + (1 - xf) * w / amount,
+                yf = c.top / h,
+                y1 = c.top - yf * h / amount,
+                y2 = c.top + (1 - yf) * h / amount;
+
+            function scaleAxis(min, max, name) {
+                var axis = axes[name],
+                    axisOptions = options[name];
+                
+                if (!axis.used)
+                    return;
+                    
+                min = axis.c2p(min);
+                max = axis.c2p(max);
+                if (max < min) { // make sure min < max
+                    var tmp = min
+                    min = max;
+                    max = tmp;
+                }
+
+                var range = max - min, zr = axisOptions.zoomRange;
+                if (zr &&
+                    ((zr[0] != null && range < zr[0]) ||
+                     (zr[1] != null && range > zr[1])))
+                    return;
+            
+                axisOptions.min = min;
+                axisOptions.max = max;
+            }
+
+            scaleAxis(x1, x2, 'xaxis');
+            scaleAxis(x1, x2, 'x2axis');
+            scaleAxis(y1, y2, 'yaxis');
+            scaleAxis(y1, y2, 'y2axis');
+            
+            plot.setupGrid();
+            plot.draw();
+            
+            if (!args.preventEvent)
+                plot.getPlaceholder().trigger("plotzoom", [ plot ]);
+        }
+
+        plot.pan = function (args) {
+            var l = +args.left, t = +args.top,
+                axes = plot.getAxes(), options = plot.getOptions();
+
+            if (isNaN(l))
+                l = 0;
+            if (isNaN(t))
+                t = 0;
+
+            function panAxis(delta, name) {
+                var axis = axes[name],
+                    axisOptions = options[name],
+                    min, max;
+                
+                if (!axis.used)
+                    return;
+
+                min = axis.c2p(axis.p2c(axis.min) + delta),
+                max = axis.c2p(axis.p2c(axis.max) + delta);
+
+                var pr = axisOptions.panRange;
+                if (pr) {
+                    // check whether we hit the wall
+                    if (pr[0] != null && pr[0] > min) {
+                        delta = pr[0] - min;
+                        min += delta;
+                        max += delta;
+                    }
+                    
+                    if (pr[1] != null && pr[1] < max) {
+                        delta = pr[1] - max;
+                        min += delta;
+                        max += delta;
+                    }
+                }
+                
+                axisOptions.min = min;
+                axisOptions.max = max;
+            }
+
+            panAxis(l, 'xaxis');
+            panAxis(l, 'x2axis');
+            panAxis(t, 'yaxis');
+            panAxis(t, 'y2axis');
+            
+            plot.setupGrid();
+            plot.draw();
+            
+            if (!args.preventEvent)
+                plot.getPlaceholder().trigger("plotpan", [ plot ]);
+        }
+        
+        plot.hooks.bindEvents.push(bindEvents);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'navigate',
+        version: '1.1'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.navigate.min.js 2.3.1.src/ext/flot/jquery.flot.navigate.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.navigate.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.navigate.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(R){R.fn.drag=function(A,B,C){if(B){this.bind("dragstart",A)}if(C){this.bind("dragend",C)}return !A?this.trigger("drag"):this.bind("drag",B?B:A)};var M=R.event,L=M.special,Q=L.drag={not:":input",distance:0,which:1,dragging:false,setup:function(A){A=R.extend({distance:Q.distance,which:Q.which,not:Q.not},A||{});A.distance=N(A.distance);M.add(this,"mousedown",O,A);if(this.attachEvent){this.attachEvent("ondragstart",J)}},teardown:function(){M.remove(this,"mousedown",O);if(this===Q.dragging){Q.dragging=Q.proxy=false}P(this,true);if(this.detachEvent){this.detachEvent("ondragstart",J)}}};L.dragstart=L.dragend={setup:function(){},teardown:function(){}};function O(A){var B=this,C,D=A.data||{};if(D.elem){B=A.dragTarget=D.elem;A.dragProxy=Q.proxy||B;A.cursorOffsetX=D.pageX-D.left;A.cursorOffsetY=D.pageY-D.top;A.offsetX=A.pageX-A.cursorOffsetX;A.offsetY=A.pageY-A.cursorOffsetY}else{if(Q.dragging||(D.which>0&&A.which!=D.which)||R(A.target).is(D.not)){return }}switch(A.type){case"mousedown":R.extend(D,R(B).offset(),{elem:B,target:A.target,pageX:A.pageX,pageY:A.pageY});M.add(document,"mousemove mouseup",O,D);P(B,false);Q.dragging=null;return false;case !Q.dragging&&"mousemove":if(N(A.pageX-D.pageX)+N(A.pageY-D.pageY)<D.distance){break}A.target=D.target;C=K(A,"dragstart",B);if(C!==false){Q.dragging=B;Q.proxy=A.dragProxy=R(C||B)[0]}case"mousemove":if(Q.dragging){C=K(A,"drag",B);if(L.drop){L.drop.allowed=(C!==false);L.drop.handler(A)}if(C!==false){break}A.type="mouseup"}case"mouseup":M.remove(document,"mousemove mouseup",O);if(Q.dragging){if(L.drop){L.drop.handler(A)}K(A,"dragend",B)}P(B,true);Q.dragging=Q.proxy=D.elem=false;break}return true}function K(D,B,A){D.type=B;var C=R.event.handle.call(A,D);return C===false?false:C||D.result}function N(A){return Math.pow(A,2)}function J(){return(Q.dragging===false)}function P(A,B){if(!A){return }A.unselectable=B?"off":"on";A.onselectstart=function(){return B};if(A.style){A.style.MozUserSelect=B?"":"none"}}})(jQuery);(function(C){var B=["DOMMouseScroll","mousewheel"];C.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var D=B.length;D;){this.addEventListener(B[--D],A,false)}}else{this.onmousewheel=A}},teardown:function(){if(this.removeEventListener){for(var D=B.length;D;){this.removeEventListener(B[--D],A,false)}}else{this.onmousewheel=null}}};C.fn.extend({mousewheel:function(D){return D?this.bind("mousewheel",D):this.trigger("mousewheel")},unmousewheel:function(D){return this.unbind("mousewheel",D)}});function A(E){var G=[].slice.call(arguments,1),D=0,F=true;E=C.event.fix(E||window.event);E.type="mousewheel";if(E.wheelDelta){D=E.wheelDelta/120}if(E.detail){D=-E.detail/3}G.unshift(E,D);return C.event.handle.apply(this,G)}})(jQuery);(function(B){var A={xaxis:{zoomRange:null,panRange:null},zoom:{interactive:false,trigger:"dblclick",amount:1.5},pan:{interactive:false}};function C(D){function E(J,F){var K=J.getOptions();if(K.zoom.interactive){function L(N,M){var O=J.offset();O.left=N.pageX-O.left;O.top=N.pageY-O.top;if(M){J.zoomOut({center:O})}else{J.zoom({center:O})}}F[K.zoom.trigger](L);F.mousewheel(function(M,N){L(M,N<0);return false})}if(K.pan.interactive){var I="default",H=0,G=0;F.bind("dragstart",{distance:10},function(M){if(M.which!=1){return false}eventHolderCursor=F.css("cursor");F.css("cursor","move");H=M.pageX;G=M.pageY});F.bind("drag",function(M){});F.bind("dragend",function(M){F.css("cursor",I);J.pan({left:H-M.pageX,top:G-M.pageY})})}}D.zoomOut=function(F){if(!F){F={}}if(!F.amount){F.amount=D.getOptions().zoom.amount}F.amount=1/F.amount;D.zoom(F)};D.zoom=function(M){if(!M){M={}}var L=D.getAxes(),S=D.getOptions(),N=M.center,J=M.amount?M.amount:S.zoom.amount,R=D.width(),I=D.height();if(!N){N={left:R/2,top:I/2}}var Q=N.left/R,G=N.left-Q*R/J,F=N.left+(1-Q)*R/J,H=N.top/I,P=N.top-H*I/J,O=N.top+(1-H)*I/J;function K(X,T,V){var Y=L[V],a=S[V];if(!Y.used){return }X=Y.c2p(X);T=Y.c2p(T);if(T<X){var W=X;X=T;T=W}var U=T-X,Z=a.zoomRange;if(Z&&((Z[0]!=null&&U<Z[0])||(Z[1]!=null&&U>Z[1]))){return }a.min=X;a.max=T}K(G,F,"xaxis");K(G,F,"x2axis");K(P,O,"yaxis");K(P,O,"y2axis");D.setupGrid();D.draw();if(!M.preventEvent){D.getPlaceholder().trigger("plotzoom",[D])}};D.pan=function(I){var F=+I.left,J=+I.top,K=D.getAxes(),H=D.getOptions();if(isNaN(F)){F=0}if(isNaN(J)){J=0}function G(R,M){var O=K[M],Q=H[M],N,L;if(!O.used){return }N=O.c2p(O.p2c(O.min)+R),L=O.c2p(O.p2c(O.max)+R);var P=Q.panRange;if(P){if(P[0]!=null&&P[0]>N){R=P[0]-N;N+=R;L+=R}if(P[1]!=null&&P[1]<L){R=P[1]-L;N+=R;L+=R}}Q.min=N;Q.max=L}G(F,"xaxis");G(F,"x2axis");G(J,"yaxis");G(J,"y2axis");D.setupGrid();D.draw();if(!I.preventEvent){D.getPlaceholder().trigger("plotpan",[D])}};D.hooks.bindEvents.push(E)}B.plot.plugins.push({init:C,options:A,name:"navigate",version:"1.1"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.selection.js 2.3.1.src/ext/flot/jquery.flot.selection.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.selection.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.selection.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,299 @@
+/*
+Flot plugin for selecting regions.
+
+The plugin defines the following options:
+
+  selection: {
+    mode: null or "x" or "y" or "xy",
+    color: color
+  }
+
+You enable selection support by setting the mode to one of "x", "y" or
+"xy". In "x" mode, the user will only be able to specify the x range,
+similarly for "y" mode. For "xy", the selection becomes a rectangle
+where both ranges can be specified. "color" is color of the selection.
+
+When selection support is enabled, a "plotselected" event will be emitted
+on the DOM element you passed into the plot function. The event
+handler gets one extra parameter with the ranges selected on the axes,
+like this:
+
+  placeholder.bind("plotselected", function(event, ranges) {
+    alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to)
+    // similar for yaxis, secondary axes are in x2axis
+    // and y2axis if present
+  });
+
+The "plotselected" event is only fired when the user has finished
+making the selection. A "plotselecting" event is fired during the
+process with the same parameters as the "plotselected" event, in case
+you want to know what's happening while it's happening,
+
+A "plotunselected" event with no arguments is emitted when the user
+clicks the mouse to remove the selection.
+
+The plugin allso adds the following methods to the plot object:
+
+- setSelection(ranges, preventEvent)
+
+  Set the selection rectangle. The passed in ranges is on the same
+  form as returned in the "plotselected" event. If the selection
+  mode is "x", you should put in either an xaxis (or x2axis) object,
+  if the mode is "y" you need to put in an yaxis (or y2axis) object
+  and both xaxis/x2axis and yaxis/y2axis if the selection mode is
+  "xy", like this:
+
+    setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });
+
+  setSelection will trigger the "plotselected" event when called. If
+  you don't want that to happen, e.g. if you're inside a
+  "plotselected" handler, pass true as the second parameter.
+  
+- clearSelection(preventEvent)
+
+  Clear the selection rectangle. Pass in true to avoid getting a
+  "plotunselected" event.
+
+- getSelection()
+
+  Returns the current selection in the same format as the
+  "plotselected" event. If there's currently no selection, the
+  function returns null.
+
+*/
+
+(function ($) {
+    function init(plot) {
+        var selection = {
+                first: { x: -1, y: -1}, second: { x: -1, y: -1},
+                show: false,
+                active: false
+            };
+
+        // FIXME: The drag handling implemented here should be
+        // abstracted out, there's some similar code from a library in
+        // the navigation plugin, this should be massaged a bit to fit
+        // the Flot cases here better and reused. Doing this would
+        // make this plugin much slimmer.
+        var savedhandlers = {};
+
+        function onMouseMove(e) {
+            if (selection.active) {
+                plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]);
+
+                updateSelection(e);
+            }
+        }
+
+        function onMouseDown(e) {
+            if (e.which != 1)  // only accept left-click
+                return;
+            
+            // cancel out any text selections
+            document.body.focus();
+
+            // prevent text selection and drag in old-school browsers
+            if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {
+                savedhandlers.onselectstart = document.onselectstart;
+                document.onselectstart = function () { return false; };
+            }
+            if (document.ondrag !== undefined && savedhandlers.ondrag == null) {
+                savedhandlers.ondrag = document.ondrag;
+                document.ondrag = function () { return false; };
+            }
+
+            setSelectionPos(selection.first, e);
+
+            selection.active = true;
+            
+            $(document).one("mouseup", onMouseUp);
+        }
+
+        function onMouseUp(e) {
+            // revert drag stuff for old-school browsers
+            if (document.onselectstart !== undefined)
+                document.onselectstart = savedhandlers.onselectstart;
+            if (document.ondrag !== undefined)
+                document.ondrag = savedhandlers.ondrag;
+
+            // no more draggy-dee-drag
+            selection.active = false;
+            updateSelection(e);
+
+            if (selectionIsSane())
+                triggerSelectedEvent();
+            else {
+                // this counts as a clear
+                plot.getPlaceholder().trigger("plotunselected", [ ]);
+                plot.getPlaceholder().trigger("plotselecting", [ null ]);
+            }
+
+            return false;
+        }
+
+        function getSelection() {
+            if (!selectionIsSane())
+                return null;
+
+            var x1 = Math.min(selection.first.x, selection.second.x),
+                x2 = Math.max(selection.first.x, selection.second.x),
+                y1 = Math.max(selection.first.y, selection.second.y),
+                y2 = Math.min(selection.first.y, selection.second.y);
+
+            var r = {};
+            var axes = plot.getAxes();
+            if (axes.xaxis.used)
+                r.xaxis = { from: axes.xaxis.c2p(x1), to: axes.xaxis.c2p(x2) };
+            if (axes.x2axis.used)
+                r.x2axis = { from: axes.x2axis.c2p(x1), to: axes.x2axis.c2p(x2) };
+            if (axes.yaxis.used)
+                r.yaxis = { from: axes.yaxis.c2p(y1), to: axes.yaxis.c2p(y2) };
+            if (axes.y2axis.used)
+                r.y2axis = { from: axes.y2axis.c2p(y1), to: axes.y2axis.c2p(y2) };
+            return r;
+        }
+
+        function triggerSelectedEvent() {
+            var r = getSelection();
+
+            plot.getPlaceholder().trigger("plotselected", [ r ]);
+
+            // backwards-compat stuff, to be removed in future
+            var axes = plot.getAxes();
+            if (axes.xaxis.used && axes.yaxis.used)
+                plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]);
+        }
+
+        function clamp(min, value, max) {
+            return value < min? min: (value > max? max: value);
+        }
+
+        function setSelectionPos(pos, e) {
+            var o = plot.getOptions();
+            var offset = plot.getPlaceholder().offset();
+            var plotOffset = plot.getPlotOffset();
+            pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());
+            pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());
+
+            if (o.selection.mode == "y")
+                pos.x = pos == selection.first? 0: plot.width();
+
+            if (o.selection.mode == "x")
+                pos.y = pos == selection.first? 0: plot.height();
+        }
+
+        function updateSelection(pos) {
+            if (pos.pageX == null)
+                return;
+
+            setSelectionPos(selection.second, pos);
+            if (selectionIsSane()) {
+                selection.show = true;
+                plot.triggerRedrawOverlay();
+            }
+            else
+                clearSelection(true);
+        }
+
+        function clearSelection(preventEvent) {
+            if (selection.show) {
+                selection.show = false;
+                plot.triggerRedrawOverlay();
+                if (!preventEvent)
+                    plot.getPlaceholder().trigger("plotunselected", [ ]);
+            }
+        }
+
+        function setSelection(ranges, preventEvent) {
+            var axis, range, axes = plot.getAxes();
+            var o = plot.getOptions();
+
+            if (o.selection.mode == "y") {
+                selection.first.x = 0;
+                selection.second.x = plot.width();
+            }
+            else {
+                axis = ranges["xaxis"]? axes["xaxis"]: (ranges["x2axis"]? axes["x2axis"]: axes["xaxis"]);
+                range = ranges["xaxis"] || ranges["x2axis"] || { from:ranges["x1"], to:ranges["x2"] }
+                selection.first.x = axis.p2c(Math.min(range.from, range.to));
+                selection.second.x = axis.p2c(Math.max(range.from, range.to));
+            }
+
+            if (o.selection.mode == "x") {
+                selection.first.y = 0;
+                selection.second.y = plot.height();
+            }
+            else {
+                axis = ranges["yaxis"]? axes["yaxis"]: (ranges["y2axis"]? axes["y2axis"]: axes["yaxis"]);
+                range = ranges["yaxis"] || ranges["y2axis"] || { from:ranges["y1"], to:ranges["y2"] }
+                selection.first.y = axis.p2c(Math.min(range.from, range.to));
+                selection.second.y = axis.p2c(Math.max(range.from, range.to));
+            }
+
+            selection.show = true;
+            plot.triggerRedrawOverlay();
+            if (!preventEvent)
+                triggerSelectedEvent();
+        }
+
+        function selectionIsSane() {
+            var minSize = 5;
+            return Math.abs(selection.second.x - selection.first.x) >= minSize &&
+                Math.abs(selection.second.y - selection.first.y) >= minSize;
+        }
+
+        plot.clearSelection = clearSelection;
+        plot.setSelection = setSelection;
+        plot.getSelection = getSelection;
+
+        plot.hooks.bindEvents.push(function(plot, eventHolder) {
+            var o = plot.getOptions();
+            if (o.selection.mode != null)
+                eventHolder.mousemove(onMouseMove);
+
+            if (o.selection.mode != null)
+                eventHolder.mousedown(onMouseDown);
+        });
+
+
+        plot.hooks.drawOverlay.push(function (plot, ctx) {
+            // draw selection
+            if (selection.show && selectionIsSane()) {
+                var plotOffset = plot.getPlotOffset();
+                var o = plot.getOptions();
+
+                ctx.save();
+                ctx.translate(plotOffset.left, plotOffset.top);
+
+                var c = $.color.parse(o.selection.color);
+
+                ctx.strokeStyle = c.scale('a', 0.8).toString();
+                ctx.lineWidth = 1;
+                ctx.lineJoin = "round";
+                ctx.fillStyle = c.scale('a', 0.4).toString();
+
+                var x = Math.min(selection.first.x, selection.second.x),
+                    y = Math.min(selection.first.y, selection.second.y),
+                    w = Math.abs(selection.second.x - selection.first.x),
+                    h = Math.abs(selection.second.y - selection.first.y);
+
+                ctx.fillRect(x, y, w, h);
+                ctx.strokeRect(x, y, w, h);
+
+                ctx.restore();
+            }
+        });
+    }
+
+    $.plot.plugins.push({
+        init: init,
+        options: {
+            selection: {
+                mode: null, // one of null, "x", "y" or "xy"
+                color: "#e8cfac"
+            }
+        },
+        name: 'selection',
+        version: '1.0'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.selection.min.js 2.3.1.src/ext/flot/jquery.flot.selection.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.selection.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.selection.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(A){function B(J){var O={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var L={};function D(Q){if(O.active){J.getPlaceholder().trigger("plotselecting",[F()]);K(Q)}}function M(Q){if(Q.which!=1){return }document.body.focus();if(document.onselectstart!==undefined&&L.onselectstart==null){L.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&L.ondrag==null){L.ondrag=document.ondrag;document.ondrag=function(){return false}}C(O.first,Q);O.active=true;A(document).one("mouseup",I)}function I(Q){if(document.onselectstart!==undefined){document.onselectstart=L.onselectstart}if(document.ondrag!==undefined){document.ondrag=L.ondrag}O.active=false;K(Q);if(E()){H()}else{J.getPlaceholder().trigger("plotunselected",[]);J.getPlaceholder().trigger("plotselecting",[null])}return false}function F(){if(!E()){return null}var R=Math.min(O.first.x,O.second.x),Q=Math.max(O.first.x,O.second.x),T=Math.max(O.first.y,O.second.y),S=Math.min(O.first.y,O.second.y);var U={};var V=J.getAxes();if(V.xaxis.used){U.xaxis={from:V.xaxis.c2p(R),to:V.xaxis.c2p(Q)}}if(V.x2axis.used){U.x2axis={from:V.x2axis.c2p(R),to:V.x2axis.c2p(Q)}}if(V.yaxis.used){U.yaxis={from:V.yaxis.c2p(T),to:V.yaxis.c2p(S)}}if(V.y2axis.used){U.y2axis={from:V.y2axis.c2p(T),to:V.y2axis.c2p(S)}}return U}function H(){var Q=F();J.getPlaceholder().trigger("plotselected",[Q]);var R=J.getAxes();if(R.xaxis.used&&R.yaxis.used){J.getPlaceholder().trigger("selected",[{x1:Q.xaxis.from,y1:Q.yaxis.from,x2:Q.xaxis.to,y2:Q.yaxis.to}])}}function G(R,S,Q){return S<R?R:(S>Q?Q:S)}function C(U,R){var T=J.getOptions();var S=J.getPlaceholder().offset();var Q=J.getPlotOffset();U.x=G(0,R.pageX-S.left-Q.left,J.width());U.y=G(0,R.pageY-S.top-Q.top,J.height());if(T.selection.mode=="y"){U.x=U==O.first?0:J.width()}if(T.selection.mode=="x"){U.y=U==O.first?0:J.height()}}function K(Q){if(Q.pageX==null){return }C(O.second,Q);if(E()){O.show=true;J.triggerRedrawOverlay()}else{P(true)}}function P(Q){if(O.show){O.show=false;J.triggerRedrawOverlay();if(!Q){J.getPlaceholder().trigger("plotunselected",[])}}}function N(R,Q){var T,S,U=J.getAxes();var V=J.getOptions();if(V.selection.mode=="y"){O.first.x=0;O.second.x=J.width()}else{T=R.xaxis?U.xaxis:(R.x2axis?U.x2axis:U.xaxis);S=R.xaxis||R.x2axis||{from:R.x1,to:R.x2};O.first.x=T.p2c(Math.min(S.from,S.to));O.second.x=T.p2c(Math.max(S.from,S.to))}if(V.selection.mode=="x"){O.first.y=0;O.second.y=J.height()}else{T=R.yaxis?U.yaxis:(R.y2axis?U.y2axis:U.yaxis);S=R.yaxis||R.y2axis||{from:R.y1,to:R.y2};O.first.y=T.p2c(Math.min(S.from,S.to));O.second.y=T.p2c(Math.max(S.from,S.to))}O.show=true;J.triggerRedrawOverlay();if(!Q){H()}}function E(){var Q=5;return Math.abs(O.second.x-O.first.x)>=Q&&Math.abs(O.second.y-O.first.y)>=Q}J.clearSelection=P;J.setSelection=N;J.getSelection=F;J.hooks.bindEvents.push(function(R,Q){var S=R.getOptions();if(S.selection.mode!=null){Q.mousemove(D)}if(S.selection.mode!=null){Q.mousedown(M)}});J.hooks.drawOverlay.push(function(T,Y){if(O.show&&E()){var R=T.getPlotOffset();var Q=T.getOptions();Y.save();Y.translate(R.left,R.top);var U=A.color.parse(Q.selection.color);Y.strokeStyle=U.scale("a",0.8).toString();Y.lineWidth=1;Y.lineJoin="round";Y.fillStyle=U.scale("a",0.4).toString();var W=Math.min(O.first.x,O.second.x),V=Math.min(O.first.y,O.second.y),X=Math.abs(O.second.x-O.first.x),S=Math.abs(O.second.y-O.first.y);Y.fillRect(W,V,X,S);Y.strokeRect(W,V,X,S);Y.restore()}})}A.plot.plugins.push({init:B,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.0"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.stack.js 2.3.1.src/ext/flot/jquery.flot.stack.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.stack.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.stack.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,152 @@
+/*
+Flot plugin for stacking data sets, i.e. putting them on top of each
+other, for accumulative graphs. Note that the plugin assumes the data
+is sorted on x. Also note that stacking a mix of positive and negative
+values in most instances doesn't make sense (so it looks weird).
+
+Two or more series are stacked when their "stack" attribute is set to
+the same key (which can be any number or string or just "true"). To
+specify the default stack, you can set
+
+  series: {
+    stack: null or true or key (number/string)
+  }
+
+or specify it for a specific series
+
+  $.plot($("#placeholder"), [{ data: [ ... ], stack: true ])
+  
+The stacking order is determined by the order of the data series in
+the array (later series end up on top of the previous).
+
+Internally, the plugin modifies the datapoints in each series, adding
+an offset to the y value. For line series, extra data points are
+inserted through interpolation. For bar charts, the second y value is
+also adjusted.
+*/
+
+(function ($) {
+    var options = {
+        series: { stack: null } // or number/string
+    };
+    
+    function init(plot) {
+        function findMatchingSeries(s, allseries) {
+            var res = null
+            for (var i = 0; i < allseries.length; ++i) {
+                if (s == allseries[i])
+                    break;
+                
+                if (allseries[i].stack == s.stack)
+                    res = allseries[i];
+            }
+            
+            return res;
+        }
+        
+        function stackData(plot, s, datapoints) {
+            if (s.stack == null)
+                return;
+
+            var other = findMatchingSeries(s, plot.getData());
+            if (!other)
+                return;
+            
+            var ps = datapoints.pointsize,
+                points = datapoints.points,
+                otherps = other.datapoints.pointsize,
+                otherpoints = other.datapoints.points,
+                newpoints = [],
+                px, py, intery, qx, qy, bottom,
+                withlines = s.lines.show, withbars = s.bars.show,
+                withsteps = withlines && s.lines.steps,
+                i = 0, j = 0, l;
+
+            while (true) {
+                if (i >= points.length)
+                    break;
+
+                l = newpoints.length;
+
+                if (j >= otherpoints.length
+                    || otherpoints[j] == null
+                    || points[i] == null) {
+                    // degenerate cases
+                    for (m = 0; m < ps; ++m)
+                        newpoints.push(points[i + m]);
+                    i += ps;
+                }
+                else {
+                    // cases where we actually got two points
+                    px = points[i];
+                    py = points[i + 1];
+                    qx = otherpoints[j];
+                    qy = otherpoints[j + 1];
+                    bottom = 0;
+
+                    if (px == qx) {
+                        for (m = 0; m < ps; ++m)
+                            newpoints.push(points[i + m]);
+
+                        newpoints[l + 1] += qy;
+                        bottom = qy;
+                        
+                        i += ps;
+                        j += otherps;
+                    }
+                    else if (px > qx) {
+                        // we got past point below, might need to
+                        // insert interpolated extra point
+                        if (withlines && i > 0 && points[i - ps] != null) {
+                            intery = py + (points[i - ps + 1] - py) * (qx - px) / (points[i - ps] - px);
+                            newpoints.push(qx);
+                            newpoints.push(intery + qy)
+                            for (m = 2; m < ps; ++m)
+                                newpoints.push(points[i + m]);
+                            bottom = qy; 
+                        }
+
+                        j += otherps;
+                    }
+                    else {
+                        for (m = 0; m < ps; ++m)
+                            newpoints.push(points[i + m]);
+                        
+                        // we might be able to interpolate a point below,
+                        // this can give us a better y
+                        if (withlines && j > 0 && otherpoints[j - ps] != null)
+                            bottom = qy + (otherpoints[j - ps + 1] - qy) * (px - qx) / (otherpoints[j - ps] - qx);
+
+                        newpoints[l + 1] += bottom;
+                        
+                        i += ps;
+                    }
+                    
+                    if (l != newpoints.length && withbars)
+                        newpoints[l + 2] += bottom;
+                }
+
+                // maintain the line steps invariant
+                if (withsteps && l != newpoints.length && l > 0
+                    && newpoints[l] != null
+                    && newpoints[l] != newpoints[l - ps]
+                    && newpoints[l + 1] != newpoints[l - ps + 1]) {
+                    for (m = 0; m < ps; ++m)
+                        newpoints[l + ps + m] = newpoints[l + m];
+                    newpoints[l + 1] = newpoints[l - ps + 1];
+                }
+            }
+            
+            datapoints.points = newpoints;
+        }
+        
+        plot.hooks.processDatapoints.push(stackData);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'stack',
+        version: '1.0'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.stack.min.js 2.3.1.src/ext/flot/jquery.flot.stack.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.stack.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.stack.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(B){var A={series:{stack:null}};function C(F){function D(J,I){var H=null;for(var G=0;G<I.length;++G){if(J==I[G]){break}if(I[G].stack==J.stack){H=I[G]}}return H}function E(W,P,G){if(P.stack==null){return }var L=D(P,W.getData());if(!L){return }var T=G.pointsize,Y=G.points,H=L.datapoints.pointsize,S=L.datapoints.points,N=[],R,Q,I,a,Z,M,O=P.lines.show,K=P.bars.show,J=O&&P.lines.steps,X=0,V=0,U;while(true){if(X>=Y.length){break}U=N.length;if(V>=S.length||S[V]==null||Y[X]==null){for(m=0;m<T;++m){N.push(Y[X+m])}X+=T}else{R=Y[X];Q=Y[X+1];a=S[V];Z=S[V+1];M=0;if(R==a){for(m=0;m<T;++m){N.push(Y[X+m])}N[U+1]+=Z;M=Z;X+=T;V+=H}else{if(R>a){if(O&&X>0&&Y[X-T]!=null){I=Q+(Y[X-T+1]-Q)*(a-R)/(Y[X-T]-R);N.push(a);N.push(I+Z);for(m=2;m<T;++m){N.push(Y[X+m])}M=Z}V+=H}else{for(m=0;m<T;++m){N.push(Y[X+m])}if(O&&V>0&&S[V-T]!=null){M=Z+(S[V-T+1]-Z)*(R-a)/(S[V-T]-a)}N[U+1]+=M;X+=T}}if(U!=N.length&&K){N[U+2]+=M}}if(J&&U!=N.length&&U>0&&N[U]!=null&&N[U]!=N[U-T]&&N[U+1]!=N[U-T+1]){for(m=0;m<T;++m){N[U+T+m]=N[U+m]}N[U+1]=N[U-T+1]}}G.points=N}F.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"stack",version:"1.0"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.threshold.js 2.3.1.src/ext/flot/jquery.flot.threshold.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.threshold.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.threshold.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,103 @@
+/*
+Flot plugin for thresholding data. Controlled through the option
+"threshold" in either the global series options
+
+  series: {
+    threshold: {
+      below: number
+      color: colorspec
+    }
+  }
+
+or in a specific series
+
+  $.plot($("#placeholder"), [{ data: [ ... ], threshold: { ... }}])
+
+The data points below "below" are drawn with the specified color. This
+makes it easy to mark points below 0, e.g. for budget data.
+
+Internally, the plugin works by splitting the data into two series,
+above and below the threshold. The extra series below the threshold
+will have its label cleared and the special "originSeries" attribute
+set to the original series. You may need to check for this in hover
+events.
+*/
+
+(function ($) {
+    var options = {
+        series: { threshold: null } // or { below: number, color: color spec}
+    };
+    
+    function init(plot) {
+        function thresholdData(plot, s, datapoints) {
+            if (!s.threshold)
+                return;
+            
+            var ps = datapoints.pointsize, i, x, y, p, prevp,
+                thresholded = $.extend({}, s); // note: shallow copy
+
+            thresholded.datapoints = { points: [], pointsize: ps };
+            thresholded.label = null;
+            thresholded.color = s.threshold.color;
+            thresholded.threshold = null;
+            thresholded.originSeries = s;
+            thresholded.data = [];
+
+            var below = s.threshold.below,
+                origpoints = datapoints.points,
+                addCrossingPoints = s.lines.show;
+
+            threspoints = [];
+            newpoints = [];
+
+            for (i = 0; i < origpoints.length; i += ps) {
+                x = origpoints[i]
+                y = origpoints[i + 1];
+
+                prevp = p;
+                if (y < below)
+                    p = threspoints;
+                else
+                    p = newpoints;
+
+                if (addCrossingPoints && prevp != p && x != null
+                    && i > 0 && origpoints[i - ps] != null) {
+                    var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x;
+                    prevp.push(interx);
+                    prevp.push(below);
+                    for (m = 2; m < ps; ++m)
+                        prevp.push(origpoints[i + m]);
+                    
+                    p.push(null); // start new segment
+                    p.push(null);
+                    for (m = 2; m < ps; ++m)
+                        p.push(origpoints[i + m]);
+                    p.push(interx);
+                    p.push(below);
+                    for (m = 2; m < ps; ++m)
+                        p.push(origpoints[i + m]);
+                }
+
+                p.push(x);
+                p.push(y);
+            }
+
+            datapoints.points = newpoints;
+            thresholded.datapoints.points = threspoints;
+            
+            if (thresholded.datapoints.points.length > 0)
+                plot.getData().push(thresholded);
+                
+            // FIXME: there are probably some edge cases left in bars
+        }
+        
+        plot.hooks.processDatapoints.push(thresholdData);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'threshold',
+        version: '1.0'
+    });
+})(jQuery);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/jquery.flot.threshold.min.js 2.3.1.src/ext/flot/jquery.flot.threshold.min.js
--- 2.2rc2a.cp.src/ext/flot/jquery.flot.threshold.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/jquery.flot.threshold.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+(function(B){var A={series:{threshold:null}};function C(D){function E(L,S,M){if(!S.threshold){return }var F=M.pointsize,I,O,N,G,K,H=B.extend({},S);H.datapoints={points:[],pointsize:F};H.label=null;H.color=S.threshold.color;H.threshold=null;H.originSeries=S;H.data=[];var P=S.threshold.below,Q=M.points,R=S.lines.show;threspoints=[];newpoints=[];for(I=0;I<Q.length;I+=F){O=Q[I];N=Q[I+1];K=G;if(N<P){G=threspoints}else{G=newpoints}if(R&&K!=G&&O!=null&&I>0&&Q[I-F]!=null){var J=(O-Q[I-F])/(N-Q[I-F+1])*(P-N)+O;K.push(J);K.push(P);for(m=2;m<F;++m){K.push(Q[I+m])}G.push(null);G.push(null);for(m=2;m<F;++m){G.push(Q[I+m])}G.push(J);G.push(P);for(m=2;m<F;++m){G.push(Q[I+m])}}G.push(O);G.push(N)}M.points=newpoints;H.datapoints.points=threspoints;if(H.datapoints.points.length>0){L.getData().push(H)}}D.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"threshold",version:"1.0"})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/flot/LICENSE.txt 2.3.1.src/ext/flot/LICENSE.txt
--- 2.2rc2a.cp.src/ext/flot/LICENSE.txt	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/flot/LICENSE.txt	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,22 @@
+Copyright (c) 2007-2009 IOLA and Ole Laursen
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js 2.3.1.src/ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js
--- 2.2rc2a.cp.src/ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+/*
+bxGallery v1.1
+Plugin developed by: Steven Wanderski
+http://bxgalleryplugin.com
+http://stevenwanderski.com
+
+Released under the GPL license:
+http://www.gnu.org/licenses/gpl.html
+*/
+
+(function($){$.fn.extend({bxGallery:function(options){var defaults={maxwidth:'',maxheight:'',thumbwidth:200,thumbcrop:false,croppercent:.35,thumbplacement:'bottom',thumbcontainer:'',opacity:.7,load_text:'',load_image:'http://i302.photobucket.com/albums/nn92/wandoledzep/spinner.gif',wrapperclass:'outer'}
+var options=$.extend(defaults,options);var o=options;var cont='';var caption='';var $outer='';var $orig=this;var tall=0;var wide=0;var showing=0;var i=0;var k=$orig.find('img').size();var current;preload_img();function preload_img(){$orig.hide();if(o.load_text!=''){$orig.before('<div id="loading">'+o.load_text+'</div>');}else{$orig.before('<div id="loading"><img src="'+o.load_image+'" /></div>');}
+$orig.parent().find('#loading').css({'textAlign':'center','width':o.maxwidth});$orig.find('img').each(function(){var the_source=$(this).attr('src');var the_img=new Image();the_img.onload=function(){preload_check();};the_img.src=the_source;});}
+function preload_check(){i++;if(i==k){init();}}
+function init(){set_layout();set_main_img();place_thumbcontainer();set_thumbs();}
+function set_layout(){$orig.parent().find('#loading').hide();$orig.show();$orig.wrap('<div class="'+o.wrapperclass+'"></div>');$outer=$orig.parent();$orig.find('li').css({'position':'absolute'});}
+function set_main_img(){$orig.find('img').each(function(){var $this=$(this);var $imgheight=$this.height();var $imgwidth=$this.width();if($this.attr('title')!=''){caption=$this.attr('title');$this.parent().append('<div class="caption">'+caption+'</div>');}
+if(o.maxwidth!=''){if($this.width()>o.maxwidth){$this.width(o.maxwidth);$this.height(($imgheight/$imgwidth)*o.maxwidth);}}
+if(o.maxheight!=''){if($this.height()>o.maxheight){$this.height(o.maxheight);$this.width(($imgwidth/$imgheight)*o.maxheight);}}
+if($this.height()+$this.parent().find('.caption').height()>tall){tall=$this.height()+$this.parent().find('.caption').height();}
+if($this.width()>wide){wide=$this.width();}
+cont+='<li><img src="'+$this.attr('src')+'" /></li>';});$orig.find('li:not(:first)').hide();$orig.height(tall);$orig.width(wide);$outer.find('.caption').width(wide);}
+function place_thumbcontainer(){if(o.thumbplacement=='top'){$outer.prepend('<ul class="thumbs">'+cont+'</ul>');$outer.find('.thumbs').css({'overflow':'auto'});}else if(o.thumbplacement=='left'){$outer.prepend('<ul class="thumbs">'+cont+'</ul>');$orig.css({'float':'left'});$outer.find('.thumbs').css({'float':'left'});}else if(o.thumbplacement=='bottom'){$outer.append('<ul class="thumbs">'+cont+'</ul>');}else if(o.thumbplacement=='right'){$outer.append('<ul class="thumbs">'+cont+'</ul>');$orig.css({'float':'left'});$outer.find('.thumbs').css({'float':'left'});}
+$outer.append('<div style="clear:both"></div>');if(o.thumbcontainer!=''){$outer.find('.thumbs').width(o.thumbcontainer);}}
+function set_thumbs(){$outer.find('.thumbs li').each(function(){var $this=$(this);var $img=$this.find('img');var $imgwidth=$img.width();var $imgheight=$img.height();if(o.thumbcrop){$img.width($imgwidth*o.croppercent);$img.height(($imgheight/$imgwidth)*$img.width());$this.css({'float':'left','width':o.thumbwidth,'height':o.thumbwidth,'overflow':'hidden','cursor':'pointer'});}else{$img.width(o.thumbwidth);$img.height(($imgheight/$imgwidth)*o.thumbwidth);$this.css({'float':'left','cursor':'pointer'});$this.height($img.height());}
+$this.click(function(){var x=$outer.find('.thumbs li').index($this);if(showing!=x){$orig.find('li').fadeOut();$orig.find('li').eq(x).fadeIn();showing=x;}});});var $thumb=$outer.find('.thumbs li');$thumb.eq(0).addClass('on');$thumb.not('.on').fadeTo(0,o.opacity);$thumb.click(function(){var t=$(this);var i=$thumb.index(this);if(current!=i){$thumb.removeClass('on');t.addClass('on');$thumb.not('.on').fadeTo(200,o.opacity);current=i;}}).hover(function(){$(this).stop().fadeTo(200,1);$(this).click();},function(){$(this).not('.on').stop().fadeTo(200,o.opacity);});}}});})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/bxGallery/spinner.gif 2.3.1.src/ext/jquery/bxGallery/spinner.gif
--- 2.2rc2a.cp.src/ext/jquery/bxGallery/spinner.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/bxGallery/spinner.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,50 @@
+GIF89a      DFDdfd$&$ԴTVT|~|464̬lnlܼ\^\LNL<><Ĥljl424Դ\Z\<:<̬trtܼdbdTRT                                 !G44 !NETSCAPE2.0   !   ,         @pH$N rI,$sJ<F$tE-&R0JĬ]+uktz|Hńd)"G)2y2}LE()2 o|JC"3DR	+C},-CV
d $CJ*("
p+2qS""4L	iS{+~,E]fg	mTe.T$AOf!$`b
+>bI0 XP"!\p$L
,`@;Bt]LRF`@QР	B.((d	m2  /PPߋ ])ăt T)sT4k,
+< Ґds8Bb `	 !   ,        LJL䤢,.,dfdtvtTVT<:<쬪lnlTRT464LNL䤦424ljl|~|\Z\<><쬮trt                                 @pH$JPriIHpL01 ŗPH0X]QD(  vE"#2fB oSE#"q2/ JC1 
1D+	}I ^C	--D*  	CVf 2-%J&
+1E0 2ȵR!{Kk-$R&ʃ
+'E$0_h	MC|Ȥ0P),Ă	0p!@
+!AR6^ٶ- !E
+l8-Â
1D>0z2}U"7!3
qab/pA
U+B:y16 f!w_ *wm@dn㶃"lԯS,yT^ !   ,        DFD䤢dfd$"$tvtTVT424LNL쬪lnl,.,|~|<><LJL䤦ljl$&$|z|\^\464TRT쬮trt                        @pH$rI,$sJ09Y%FL\퐱bKxVwE1!$4ZR4/+`1E
+4r
++7XB$D!	g-
D(% 	C2$Bg+4!  %kD'C+ 27SNT
w2S.{T*li cp@* H8q)*\B`BWL"B&
+)&iA.Jq4f	/q/P B,P 8	LP%^P*Alq" !	VfQVAy0n !"Y EBOwAϻCTAA
"o!cbdC\nvsH !   ,        DFDdfd$&$\Z\tvt464윚LNLlnl424dbdĤljl,*,\^\|~|<><윞TRT                                       @pH$*0rIl-$sZD"F)JPCH2&F%Vdƌ$<axE0fC+_|E(0~B/EOB(.dC
+,D/)*
+C	B!01**)D$(B E+(SL"
x(S*2CS$T
+
+>0Æ%E%1.R"A?&.\(צ	^LPAV.@I"#	L	)pVd"rA=C.ya
+D.u)i`FPK//aD"!"Ũ6բO@!\b.`[q  !   ,        DBD䤢$&$dbd464trtTRT쬪,.,lnl|~|\Z\LNL䤦,*,dfd<><tvtTVT쬮424                                 @pH$&HriT*XXȢqC@dxLY ؈X=<=@vE{q2* ^1Ej|2 "/C
+cC&| ]B0	C%(4&C'|" B004B'E 	0)oL.'K/0v"4R$C%S(3S
+L"H[အÆITJ
+	 hB
+  R4RBTpSl*M"2ch k@@ 
+' m( 
8Rah!0RhE'Ft,ZCQ2,B(#eԕ 퐪me_8pࣄ=d}'NY*/ !   ,        DBDdfd$"$ԴtvtTVT424̬lnlܼ
+LNL,.,|~|\^\<:<DFDljl$&$Դ|z|\Z\̬trtܼ<><                     @pH$.8riW$sJTUDFdBqRJe1\i[T(`@+B <Jm&wE	(BfT|E()6r6/2J
+p}
+
+XD3~6,^B&dB*	CV"
+C%E)
+0*4}B&6+
+S+5S16*-vl5S4,CTJ/	_ ApĽJ&|	
ނAC/,qI$6p4mLI8pBvO
+0r~ lCV H
<i(!OA̡|!Մ6 po!j$  зG 0 ^	D '6.+EU
$1  !   ,        DBDdbd$"$ԴtrtTRT424̬ljlܼLNL|~|\^\<><DFDdfd,*,ԴtvtTVT464̬lnlܼ                              pH$*rI$RI%~q:\UBqjJŞ@RDHB]0'DN4jvD3
+4B[C2eU"K4
+3wg5JCEd-oC	#C..]X5#YD.{5B5(#TEuT&TԘBT
+`T.J ֯ycںeXplL, ,6-hb qxGւ	 @Ðh1(6Ǔb$yg:8JEP̲Sg,H`%Eb*D
cǶ	lוH
+*։pW!HpXB*tpe*} !   ,        DBD䤢,.,dfdTRT<:<tvt쬪LJL464trt\Z\䤦424ljlTVT<><|~|쬮LNL                                 pH$Vri$+$sJD㩈QVˈ46"!BF6'ڡk%%xeB
+ _!K1&
+s0^EYmD	b1GR"C+C--B[-z+D-XC+LS	++
+t	%S!͕~1S2_bT	$ j`GP	:&Kf<#UkHX!*\cq#0 Cn]% PQ`Dt!`p K OF҂;BB ;c0I/ < l#X{Vn)dȰ &0  b6F# @ᪧDD8xaFHhk. !   ,        DFDdfd$"$Ԝ\Z\tvt424LNLlnlܤ,.,dbd|~|<><LJLljl$&$ܜ\^\|z|464TRTtrt䤦                              pH$ Ť1Eȥx9WR(ިjoq&:a!#Pñ1täD$"cpCqRJ/"$faB]E/nzmE1a*YBWB3*C$P3B'{'-|5	I3Bf		(I*"_'v1{K$	R"^aI"	d"e0%
+sb  &`TJTCE!T%8@Z8A
.F\``DU
+ePAf4D$Ya|YźAFl!10 :,21Wԩp`D(ƫ`D:;X|ƻY\vȀ  !   ,        DFDdfd$&$tvt\Z\464lnlLNL424|~|dbdĤljl,*,|z|\^\<><trtTRT                                 @pH$Z0Ťh)01ȥx8EQMPc;Y{G^2.;;CI2qB
+eC3WPjD|2C1	%p\PBUa!l2&		1XhP&Bhs%3RUMS
+w-	x^R ^S&$0LS1*+Rf3
VPAO#%`C|<PpH'ó"FdɅ
+
\dH! $`ڂhdAb
+240 *6@01B"8pr~
,	@z:,dbHU" D@FAU0pl
+n0(X!k& !   ,        DBD$&$dbdԴ464trtTRT̬,.,ܼlnl|~|\Z\LNL,*,dfdԴ<><tvtTVT̬424ܼ                              pH$b\Ť)0#ȥh8DqQn(&{8b_8mCqJ*I	sQz|B	  )nBaY.	aXwH"~XE -5(Wo.uM.J 
+KK'#R(P{c-E+^
++S'X!/S1R&TL
1b<	%*0l؂A!r)`qȅ
3|(Ґb0 PQC@ C`(g$A bC

&DQdN
+1jRTvDR!6t֏CgkL@ a2KDB@DFT aK}^g  !   ,        DFD䤢dfd$&$TVT|z|<:<쬪lnl,.,\^\LNLLJL䤦ljl,*,\Z\|~|<><쬮trt424dbd                           @pH$ZXŤH-rJ &FR@2<zeoDY-h &![ҋ #hpBsJ
+O 6R	~\C$$D
+ -P[2,C	g!/2V/i zI	+$q,	hrKK_3*S},K0_f,ZTPJ
+ySd `J
+<#`(%%0p Ѕ	@@ 
	.LHr'H0A^d aHo3`x`LSFGHHqD !S!N+b=gh*XxQBW!0`gB?
+ H{H`R4YI?A  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/blank.gif 2.3.1.src/ext/jquery/fancybox/blank.gif
--- 2.2rc2a.cp.src/ext/jquery/fancybox/blank.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/blank.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+GIF89a       !    ,       D ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox.png 2.3.1.src/ext/jquery/fancybox/fancybox.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancybox.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,64 @@
+PNG
+
+   
IHDR   F       ;~IDATx	x\eIڦMB@AYdQ+Vd. "XvdS@A@]]AQ%i&=M%]辰y̽OIw{|ycݥM[7GZ	#(ԧ>w}뮻կ~Uqg9Z_oH{WZzi[~WLJ+|=|玾;vw'׿>?{9猽v1kK3	ti3%MiDM~_}]wodɒ[?z|Ӗ/_oqG@<zS[v%z#via'tҸ?^9-c+WY,l8`Ç=K\!)$?]a)Ŀo/~?nR6I@,h<gݤ;?X~&}t:tprV"QLz%ʀ!C8#w}O{ȍk?~[ws=N:#c=N* 8ojWĥUX,U0ο/裏ڹ~ՙD1?ho{o?ֿto@رck4g'WGGAlH_6Dw}U_CVI|_ҿ6#GV7r>ysk~,[9vaѣG<y&ougg燼כo3yK
+߿	K۷ӅP/?ck_[QQQCa*䦶QGwߵ{\]ve_9ۯK.Iicjʂ
+3ftDH$+	"BAj\\WW_WRRR;#Fa?c9jݺuӹO,+-n̆7گ9rU
9a:Ug}v<"j1j]m	42ߨ=Oon	'0Xj^~Cu-</)|z#G|e]8x=6ڝ2#ݧZ&C5:$LuȢzkũ|gqG=WpB+u2O:i-rZ_u@aEwM444|ʩ"Ά
MRB{饗6ttڶ:tg?q 7V)po[*&Y#w toļ뱲 #>䳲֙M̜9tslanᆍ/8)?(m{|a_|q_|5t|gXKnNi8`n\>qzrC5eee
^>qRYY>;qe˖}JY
+$E1VUU?Q_a:9/8]O>I&5Ÿy$t7UĘ@X"tu]	aRg>Y]܈{.sw9\pdONΐ-o8^ǡS~/,A<_`!8`D/0c>XYoq#]tQd)CećkXW邓Ei>+%l0?˧Ug5t{TBLc["b}>f>'lf^U-H':sC|9s	Z~~;i,S/|=O	&ԉq؇݆ki{I=Fnn~Ӽ%AL9`ɵ~8X,tMeShOa2a8ҏƚ
+dK,w:Y>M²A6>v'xүgz3ffZd&T|t5ރ8F/,$MNQrY&7Zߖsgy#;}xK5q_~32
+aTvnH]*s"Y"M^zш3gΜ
rz߱{ｗt"
+3yO}29ҭ:Ą\KͺL?|&Q)[J;RX-	
c
LesMt̐snE-Ҿ{{v`{g6]~m?Oھ7pۺ62s,8pg>󙙇rL&~>FnUT:@1#O;9KhoooMR}/ύ0hqpheN5Ctdh}k_˰P0sD a[؆>H
+SĢoC _җ߫jMV"v3{`m$;hƥ[~1O>Q3
+-9gg("tv|8^06Fj`4HkCYگ_l\>wvfxZaWq}	~N\Ï`%ta%vt&'-&i	ڴ@[|X	N+2`,/VԃTQ:כ}Զ^]Sz"{15lN^FRRefk
+ccYP_-*\m>̊_7j\a2fɞl##F5]˧O	"L:25ߏF	%Ll+B=eRw!|4p5?!aޤ^(~W7i}	8T[<Β6/ddM;Y-(5poK|7nvT.Ʈ-(42"{0t/fs2^¼F0h(2,oy?{=/vpB7Jca|}AED;M;C"hsi/vSڡ9__C6drSG|:o!818_Wv.1`ā%퐊]6n5J<xQ
+fO eQ>;qK;xB!2_ 7\EP
_^&#,EIV|"'b0l0ul|'l~yyzasê:::?K?=t7Ml	d^ .E䫰"qkuϮME_qguV1Ds=,>Z{.g?YᏄ@X8o@Zڀo8i#o~󛅢t']aY`)S>*bs^!#t
g)ܴ(TxnGq71kMk's! _ش=WfU8߸L5X	8~)/CBS}2֋-t!E!dn7pi5AFMfT< @-#:
+v0eg]?яhW\q<2CJeB+5m
+v.P.s~6\.A78gGrWi{!pnIэQ"|{v!o}AT 8_p3[58-B;d%:5AC`Y݌bs膈#]+CFOll!5ʬr.!~wa!`PWVRV-E;d
$a	0ẅ ~j!	w]¤2̪\֙0fY		DJ+Elf$!&C87ƊHB>Ťxe>	i43r]ہ ǷoXa )'
+gCGmӠ2E"s]m]5su8 *\x,o`o6<X13kC.8no9@CPqa|vLLfHnP־ C9_ߴC&^
+B;
D;2a|~ɪLC9yL&ڡ  %\Atvηh@{v;kC!ڡ
+P|CK;sF;eS E[ 8tRp)CeEH_ĄdLӟg8_"ֵPU yAU!ȃ>hdt¢,VYۂJ-+2QB
+ۜ/ 8<gr0Z2*2u_:Rr:Ct3Lsu	K%$E+%HaU[[1W?wAnʜbZļ5̛ȁ1O}P)Ǌ+.߸q_dXO{;kJ3	1DK3UbGWH"H&NXٳ^yTJ,If]2XHvj%ex`Md9 n/ź@C^\1KİꁠniSW\[6آɏc*&fӦMe꧞zjD#i|5~ǃ]0L'NFa`s΢ōzn#N9T>],P__RF1RRo]jZ H%oh RpU
$!u@Fcz|mQr)-אJx5=tǮ«tA`?8mt'H{q  YX!ávex
=x/VBdg66Pbb9'B3laJmt;76wUAE1*5wv((pL2J5TO
+Cfċ |LW_}7Ilᵼ{hUa[Mz|T~ֳ|dyy,י>!@b{QՍ&ÀeJDpw(i{6pO=47ʃUN(
+Fs	V7N#!O!5Sax`B"8N-2D;*d)q U)tC"|g1CtNl0+ CoET1L֑8\n"\7?/1Lx&D,dQ]Gaӿ1̗0Z[ĭ8U6<Kb5/+m9`nGNȂ\w%S='l~iJRRWIEIEI|	# {vg`a_^&~X";u&e=O6߮4cƌs=\󞁻GJ0l,C_,a]g+LJ6yf'篴d+
+5<3rƬ\8>ƦɜYõde\%{f3\|ҙd	;ITέSl>"h:ދvъ,7t[H;XډVٜe2n;k6xKs%A9_{	̢yųݨ<Bs["2윯{aFA&˦]]]zWLnm=׌\^k=wmBkoTT$ 8d>f8Q|w }^UP׽9JRHFt{;=R_f!|vaw ^ϵ]|^_ +δY ̜o,8vTy:R$'YIz}Ξ!):pbPݖst{Co6@mt:^wvw;o+m1$oLGҼ|5*J+ 
 s%JRS뫹V-)_Q
+M!QlqJJSΗ=YbJ\J|Ql·嶞o*K[1{|	pR𢁢Qt+)"t+"+%R5%fYK_~_n}7aP}ꫯnȰp"TTdSkT2(hM\yƴ2אϲ
+_|QΗ&:pYqNC-S!L72HwD
+Pȉ-A<Phkt%	\#4'R#P} * e(HdQ fXh|ȉ]SU	!}}mUQ*Z~ 8oYt~Vmڶ	2(09rw̥rNpt#DzE 1W^Yݠ¸&d
+6Z۶AKJco!XܜNA/3K*++W-4`|P]Pj5-Sfbuh md12"A4UvbH
+ޗt8lSCreõEJF16Sa.RZL6]Ne[d2Jf]MgB9Cip1<pq
+$bA/3<?^׶SQ ;HIEa+4;LqԌDC*wlei/ވ`50][#0,eG>ݥd*eWbʏ8.`V]nR^k%cF!*h-;LPaDm_Bez
A!"p.abhd.U*̶څƫ({J[9 $@V0gΗ9>Z#/k	ScjH4Ս&.|22oĿP~ƎnΤOX"r|U0%@_˿ThW⌲eWjr'('.do E,aÌTUt&w-]
+q
+0Zn_[iv*r*<՚$pt+nt3@D-^c
+d
+?>GOɦ+K33
+5í=ݨ*$.~p, =|=F%{K!@N	<an?׫1pyJyAwS˔A8׌r-vʗ0N)ZҌY3ir8_s~}B$'ۚ=)t처WW*saj5y?Ȭ:F[>ƾΨP|͖u9ߘ+[f56c*5fu-	JRMVe=8y&l7xE	ʬmM k@ÂjCwL:1U+0|=k}Rkv\nOl;MA1۔Z9&G#4sśm2dk3Oe9n`AɪPs0ϱ}͓x-c/''(|zrb(|=?A)h7js[j׵pL|3Ps+W-oȕz˚>B4bbr65k-K\EnI.I=_N6#mzpYoTYP}]mˢxq(Sh:6#`/VԐlqVgK]>[b *ILFGl⣭R":IUh9sz Lߊ
+V|	D:"J
a(%5;\M)`2knU)I[;΀ %qmҤIt6*^`h-2_M5L[Pẙ=jFrk#w'^^F&%T0ۀ3q%
+VH2%t;8`I#6;DE,hhսq|t77L!r7x m;օc>|W%tld[-2(Iɹ0484\|N#O
_9ix	7~bVTa{YݪխJ{3pMõ cC38_G}t1h;5(XWFZ]ke5}ey1&ho,(CI7w8l	u}-η:xgcH!V +Pb͖Sq,LҠj(y|OrZ'2Ju=ܳϮj9uj
++$ +9y .g(e*"fF,7-ڭ>SřXhujrLJpfL
@cu@3Z8"}saUrOf'ߌvA
4uKہeXI'IfS
>gZ툇&}f~@lgRVTRSrRi<,Q 0Tg77c]3Ԛ׸GҼM5|sF܆^G欐|
rjr	kv֮4F}HJC,aLi^&x05OLF0#:3^RzCc^#6{j]q:鳻 ˿fy O?حcnFk"7	ΗlZHN#U0cok1iG	RN=V}t	0bJj5z]e,}v0;X2B!1ߕT׵{+	#&єE<`k;(
V"uұ2*=,a3`dmV'veڜIN扙 s+>^<!0i9^@kTEcRqxqYT0W+ڨ*wX7,&_K\ek̵p*ꕀ[8_+qKؾūNV])Ԝk5$YݧGt>&Ԝk۽H(=&ԜEx^Ēt1l	5UxD J=|K	51yᅁ+NL`SPkp(ԜQfQPs#淨Ro?"η8&|{z%ȱ009|1zf1u$,jT W,)Q)3";6{7PbpwSI0PUT)&Q'K^ؤSsi0AD̜ށuh8e ŹfbMB-'0	hME*qH8>Њ[oI7 [~aR(pJj.B;%l)PJ5hjQbZvW"Fa
+ ]e68+ğ#syTF0M-psr3c1F#b.ΗUW]5﮻BD	S֊e9Z@\LQcsN}2"1GZF1$/HaqӆZ=7:&F~dYOSS,2
+s)4IrE(U
+/v
+=#aCgkHfs9f-Be|d2>0za|JBSHljjhhXoӃ3ӨT
ύ$ZcTRI8묳HdvO.Z),6kT<D+@QpX
k!B#pI Hi-rUG/xap@
+#:V@dyCIcXoZ%Bʲb.y0LJ.'01`-f,yI&}衇/\pl=svp[+e&z,Dӧ_3qD?|a06]aJ*sGrdRhWfbZ(Ǣf7S5]st	:.I9?G#|{zu=~DpbG(IPRFo"7|#7$ِŴcΗ)"ʠٺ8_f6a]:c|[/1%B#Lsb@²1
sJ1e$58_j:\΂$B8(a'ƊjW @,qJ
+_|~oXS77 [-5\WQ.u1c+P7,2d"l㈱Ssm	
+v2a
4*q|~hDtAڌ
+rHoA8_,;+W;/6""ApqWpw,3VM@xۚ
+ũBCA3D3a!׼?Nd03ъЅ ity<@:/I_g7|s
+|(Ta.WwV̈?Ǌ+!T&ΗGBvHd^=I'{G}Y6EK	_ʘ1:"	IfP~{SO=1gyf\b(X	]d#TLyMMM$ԿJ>g}vI_jdas\$bASW7ڹTǻ ]J"TŸ9_r`-rVޏ=Yfa]^^ r%ݳb[$ǰ$0{//1c=o8ғ{1ZL=_>#Őo0g; {3E/5
'k<X̳>c&9ŻFU2ȹ&<Nz9J"7qq8_84NL8Doԕ?"7pqM8-q1Pb[9k9.^Ηh$/G
a,D$A0 Hrl|oZ3x4i;J29#W0Z-N܉5VN,JηZ|\W5*0CėZcYV]|NZ4Wg#݊33$X's@Eb*j"FǮa*0\9o1`@W"D1\0XUN=FjRWX1pX7̰ǈcq[y
݌,`"\8>8_ )h,|ɓ'7ɘ}cL'kHp~6pF+[W4bd&fc!1׏0c
+'4r)\Cqv
+$zPn\`T5c%X@뵪Xqt@DכZ$|''蚩x8_|ҬK0? Ƀ\`n8P.dlf;ＳoF;XxF'oqR*DJ2+t42L^刂EFm_jow}B/BXN#;/^'XM;*A_A:bBS0G*)RWWZ(8"7(ٗ5RSBb|L}GPQz뭝0zCf>CXKaFiµR}uMMjeGW_}uk%$sŶW,ɷ69{Y(H_r[uIϰq_q8߈EoF4 LF])#|S8׶C,|r5)]:\?8K kEeqpj;p<k
*9QEa|*{\*|	Q+!!2M_,FcAVqqOW"tLp}XV &!Z8H|FCfA#X 	(0ڦ0_`\
	O@X?r:EE40x-
+ t#G:7"\<!3s(Huナ.R49	9'iE|M0uRH,8\3u@DB^B:`)|y>	Ka/2^a@Wahx3!Ϗ0dHfr	L8ˇXsf|1#|)+1#{>ƍIIVIOpLUiɂj??+>"j*STҍ 5/v0V@)7dl)ݜ9sBOD#5CׂARǐ?@Y[rv'r]jժ^xᅥL֨l[
+D
Ułl6pM29V-2o^I	x<n_۞~%<Zřks
+,]7H%_~y&P$#.{nPfz}gJOamT
<x*FybqF^z#>Z;C"V윯Ij/\sHpG8j8eK^{ Ξ>gݬ8S}-aq*LuC%8߈8XFyDoG'yDoa"7Jb8_GxDob9J(8_!cu2h1=B#[KH#tlfFSBNm*dYN!DҘ(
504bL{*|	RPRt%)0taD@Z</FnkX8G
2F苒-9=a{D hu;ϗ..hq449ҙq)֚|XIGX10X@:mΗn $R
+\,oh"1k(L/ ZX;`&3V()qLt	yr\ AKt.J	LjQͳQY	K>
+S	Gw޾^]	/2Y2!	F.L
+U<% O>Fr٢/}q8aA[
+Ҽ>|ΗqArf|2x,Mi!.	ĉV~͏=ؒsXyYEn"iR</C~Epw7pCI]4Aֱ**2"c@8@Nhb Y<|p1WY(js18߻{!CS-T~loy>J,Ǥ)BXy=\ **x㫯+dٚ&o(qug~s.,&P$mQtTvEYWSL'3{f
+Uź
+DbžQq@Ӱ1k!ݭI8qcG<+5p,
+mr@uflW(>ΗuʩIM|c[oGo,|#7|cqzDoa"7Jb8_GxDv8ߘPUs1),ČpI1iֵ|IĆE,@F@Zt#LYI@S1@Z1 ZXd#StQL)[a1z"k#e &g@<yr+]$xČbXLJHE8cPa䱡y<0>gBBobJ};r@0뢖'J,~!ȑr򖖖u0yz0yS㗬,AĂ3SLs:jjQ	+Tc)MN3g}E: uDbn5&"V1qFk2-)4C'N;I-%㧏Sf.C"lU.8apo
+E
+.i߿ȐRa28m@"4W)SHb8_gBb]p_7Y'*a6AW=_&e|eR#0ҍbl<,Oኧ<C[BŅ^FMsb ʈsW2,|&h[כni$V,|n\Q}uH]?$g@¢ 2"@_]*|=@}MH zyׂ>^
04XIn\9HcgXtPdQ~G
+VMM_Zkۍ
qtVw:Jtu0zѶk;t&WbRp 9g49_p"n&%̨D rSYܥ9չ8;(Fo,|#7|S<"7#|<"7#<"70uM1\G#|S<"7_M&6a׭ueJJY
+9QAAI[h"]9}[T
+\յeZ)~FY -1\|(IND\NA$@iJ . ZX!Xec9q88S-kJ|	W+B'C/v]HQyO=ViEՄlB*02Ē(̵(vyWSɌRn0y=b*r
+khŏF9}hŹjrܡ-|\m$op>+2+UM@בg`=vYXp;PSD=!Mkf4&N<u'hFwbbԂgP
+SOvI["OtF)Y2
+c4QhPGB.K%+qXGrWu-N8a.$g&׌J|&Ē Ϊ2\wNBKͿ8Bҍ 5AM[<nꢋ.jH|r&A=! nH@ug6'ϵSO:kHRdji*DS>>-'/H*VRl^q$a䯙	nV&%Kg%-BYZ*"JkbHF-V
UX֡E)mv@n;n&Ih5%$-#uPqs(Xt2K10f"zi+FΗ59<6jη:q[Eo,|#7|cq'%[PrKN:7T[    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox-x.png 2.3.1.src/ext/jquery/fancybox/fancybox-x.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox-x.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancybox-x.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR      H   7B-   tEXtSoftware Adobe ImageReadyqe<   mIDATxڴ10
+RʧyOQB!Q@&RB @LU6{xODU=ek`͊ZM.:o;RNL  #tu+G    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox-y.png 2.3.1.src/ext/jquery/fancybox/fancybox-y.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancybox-y.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancybox-y.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR   (      ]   tEXtSoftware Adobe ImageReadyqe<   RIDATxL] zOG8	>K-EQˀ٧:CX?q;1do  1H@59    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_close.png 2.3.1.src/ext/jquery/fancybox/fancy_close.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_close.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_close.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,6 @@
+PNG
+
+   
IHDR         ;0  IDATHǝWkLWRr[B\
2&!$&%BLgd&K%&Lp3#	b%Q(-螷yG+<is}yo|>>o|!///##Cw^^lkkw͑ Ϻ[~HI(mIIIN\v-E_WWի̌pB4~?D:+HV$#\~p]ӧOX։7fō;wFGGlkSrBvݼyR'O8/_Ҵj6e4V|QȧcbZ+<1nSGGl6f}Z%v.o,u2tm{ll쪔Pd]=X<9ꔔ]kkkn_"~\._ٌT ^ti] -j1d9\	=}$ʯNB*FOOl ?`.PŹ{Id29k77XѬX\c+65::-l%`<KM.BI,>#	wuuY
Ip_SSӺ0o3(:oxOv"xXvFɅ7b)=fbUs.$$$c: aHCqqq	z)nkbrȹHlÇDkhhNXGA<yW$477g4DnXܚ7R­[9~H.-1܏^[OB333*bZLܼM~xxI逖rʇ[ܟSGBϟ?{#Et
+&f?wEJ	Ƣ܈
+>NWv	JK	ɷ*&%̙3i3Avӗ@1<{rO1'ڬMC}~ȐZr߳M]I	rKcccKrGT\ڼ.*3Q
+ q9ɹrjPV}[VIrlX5#m 29T4y;4Ν0Vmi˔֩\;|vvR^^n]H_#lp|t|ע.79  DԔE(t(\jp,] : #c:;;x/<.
PS"5-@ה]|vU=N;- ^:xϟm<**jv1Me[^>n=aQ6~ -@Ls'X6ucVf\hjn^9;|T 
+;2mlz~E(BH,;I&x.eCYW>_"(؈(A )YO^P*fq-mi    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_loading.png 2.3.1.src/ext/jquery/fancybox/fancy_loading.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_loading.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_loading.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,27 @@
+PNG
+
+   
IHDR   (     2/   'IDATxtee7{{vE^TDQlYV@_EK&IfiL0/|k}w;s	sOs[Y$gnrOw7ouT\u~zQI)"kQ\=g_d!qMĵ$V\j%,܃Ko?+Iq=GǵjWL#q!E_K^4\쏫f:/llnw~Z׺V]'fVf}wy||G>k$۴l7:c5q]FCg}
6\hy7=q&CwB´ZKfMozӡG[FFF.{s;s׹uu{
?AZtfA,i[;}{C{׿	8<<'xnE=Waխn5CO|z^gկ~U<uw[ڋa|`M}Ӟ.uYgm!G?:Alw=phN[GqĚ3<sO~-ԧ&Ї.2|^s'n.(`so|]]yC|ࢊNS]_8㌭?O_u`ikz  nvX!XH̕}!R>VKM{G!l&`+k׾w]=ChpKU\m:
+2?Vmo[:v衇~3N-o>HdqnRan(`y_Ƹ6|_}n7p*uea,K±?a+.k6{R/~$G=QKEaN&!4\v'qg>_ɖƋo/A::l2{"UmKL$&x3=O^ʛc^\\V7MbX}h^ξ~
gLŜ4?IOZ=n	rWM@Ӌq7AHFnڱBĜ=a"vҗt0ȥ̤&	N,m9cO|׼5+3h-bim%yWpiipm[w
oXy!2%	GJHT/ݭ
뀷5Bc4!p1ŧ?K9	loM7rW:IspZ+JPZWzEy^<x;i
oP}o1y̒il*`Va6Ɠ_P5yp7zG p1kW5JϞDבq.=nAzIykq(=s!nx'ixn$v΁.<	`.XNfh3;49Ձ?5s/ieO}93[Fuzp9s!R {0~޳gϕo3<Wbe`[>Ϯ[}{ꉉǋlg]ՠ!LxJ>LߚN:i!&3<>'W7cs:@MpoB=?ӷ>W^yU_7&2͓~/yJN;ꨣւhfC ׿H~S%0 nx9J`FnK/h*}v'P6sĿO<Dkw݇4'uf0U!b*.[ V|+cjYWrE|
+Rq8
GIxxڏ|#kq}9$ j_٣5;͍)oqPV*tĠپV ͓2Ob@VwPv'WjE"VvI15Ȩ&昴Wa D5\a}y2LeG'1/W0$7f/|r]ղA`A-zdo020&m??yd#xO/aR]v[Q,w(l؝It
+*ObySjBBtAb׳
+;_ۖ_*YkpIys(nn*G*Opi%(x>KP_I⳦&'TO*OG$
O$
O$
O$
O$IZ3{Ǔ8<e`s.$WF>Tݴ{ʓ8FXޘм̓8sm]g?)>OI~;a} SO=uӝ{b
X=0nO%LY24_ZSNٔu&o'q6*l @$dI%`?ϷBg!$5NC/j7]PS/ne|]f>?<pMЭO|#AAjAr*P \9Pmr9/޽~{JfPp%ysM<{"tƍW,Zh	F-~ Xt]zQ06
'i瓰4D8-D(֖OBcJ.I)ipA`eVDC2W	 cw]c3rI MbL?D] k'y S\@t$fv҃ZmRlآ~s3k
+#{ECH|ynދ0MO7iR C!zL!!LC$g({esAO2E(J531#Gqj$b6>cZXv&Mص$W9C<a,h:,|Fři5sNB<EUڶ6ȲVҒa]J[>o,=rJ$/I9'1'g]-vIIIId$v؊0%d2Xwٯ$BcB{@}k4JJJpOR8vVNÓ{"~]ك$$Y@c>fV,@)<I,1K&DP\Z$1X.FRLQ
+9j* 2F×blFC\01Ccw]
Z+
X2Gx*R\-!Amna]x* ;swja\=^MP0\<ϻކn?Hx2/ g"|+"]YCY'\BUg=ąƼ,۸ȫ$P0][~lU=P, <ݹ`B9pD#t͛xe˖Z<Ė2B	"?W/.q<zٕ\r~\aW;&te몕'NCs!9JYK1yOZ|ƓXQ2ª6
+VG	v4ꫡ5$Ф]ZaPa_M9P{IZjIJs_n0OUCVE&
iM
+L	n!13$/E2w&^$ #Ƅ=" lo:ҬAtӌkr'wCȿ~/*5<aQ_w-k7=$+)s&
O$
O$
O$
O$
OÓv7l>J*\xɬNuo`ث>u-P}.畞$ uu^?(:E
tt~e-ATͧ0 V;PnEJڧ3$D 64Lz"x@pNXi@ТVy%xd2OI@gbnVX;(rPRyVm~=Xe~WM@v(Xl5G	,hms۵iESe͞
+=!]"I&=
+sRiF<	\kP [ڲ[PfsyV')pe^iXj?䕔xxgfWbh^[-/}i.z.iv<8Ȝf WNFE]ۙKv5
'Ǐ܉+9F!nXʻ^\Ε(ovعLhъln$E<R^5]c^}UW]nݺGۮ-Ztd{p]~iuW%KLԦ	!Ne9`"vϰK+Vv~{Xde;wOwvB(~
+{Ix>
+7'Ovg
+Iy 5Pi[T=VP4Wmڷ^Y59~r
+)`=Ilp8it!Z)ObYr%v7O2ãh<`Ó4<IÓ4<IÓ4<IÓ4<IÓ'i͛<ȶ8` ZOu*$v̘3G+dD@P3.*)!uIr5eұI䌨u "W蘺Sjj>`5J1Ow'<0T .2|gaځ6%L$萎rI1C+'jè7mID#$gƣ6qt+pBܪ3a܋go3=M<*q7я@;\>JI*(,<@Z0),˓<̰vJT!hT.{hߩ.e̮0XNtMTVnQKy5:_#e:x\xIe<~F٤zό'aWVwIx~6ʓ$Ĵm'у~+V\_cdTpnwb$eD5kNF}LXm䶾K#uҀI7%ТְM[VZVDDVݹVmrLǗFrLP]b^(bIZ9Dt;9Ӷlڴ?ZfwI`gbM
y.8ǅ^//KM{	ȉ,yC,mpsL@s٢!/yu?
;*I5IIIIIky\[ۭY$6ߵ	xw'qO,?%~PQ
+GI)P^EEDnz!ְ<X5)Gj7+WZ>I9
VCT+D-P):oiU شXpH@72+J] a3maD,328NQXʩmj2arla<F{ʐIm.C^1tēL) xBh{uI@pŴZ&BYi#\ch47G.`{T%;SJxoSSY$:]2xaS[&SL"1qS1e̎'DD%VH*O	_ 5!˲8k$wKRJ[{zŐ/$'O,"bq~~Ij'ɕPa;xh(?+<a,"פ̛K}2X%4XmL)URz&jњ!U9OA=4FݺUV]£a5wƺ<Lo~=1ԗOB([IL548ȠE4r``ok&4rvD쌹1*v:~K^fW?0JKBxWy6hKyjJI1{;*gr/I|UsSY

R{e58C^S
g
; ˤS㑷q*'$
O$
O$
O$
O$$؜+<Iyg]D:0U\ϓ@e!
N'⾐=4$9\9Br)&*8LPs@8vLOxIʍShe0D99J4XYK'$R=̓h=T惟548c2́ 6l6m=X/aƆP0h.*&Euc")n<	ynC`w~ .yb]I!B'{w2
+Nt')GXfB0J<	\&=播@n.fY:j*1pw_UcID*aNIh<裑kK8yP[*R$ Χas!`SIv.ZlNۻ0]<!^ZHISpnKlZI"g1T ;m@eǶCF#TSiVZ\.7^jvs?ٰH_򗝄arʦZ *9GTtg-ځ(>+
\Y[$}FFFQHK˟kyk3
kL;Q6rd
'x f/trRذ
+/{ؓρvS>mHMō()2v%
ٟVa)
VDNӮ4<IÓ4<IÓ4<IÓ4<IÓ4<O2'd$gx=ORISI^j)NRvŊGExѼe RBr1lqLIyI@pj!90l9'4yu2\$?(?$C,-lB$|haa?;fh*TS١3Tl	({2,
Iʰ<PTA]QK٨C`/w
+65$Em<F:>Cc1Rxmd& l;m$4m9 \_͍e<	ʁGRhroX
UW/yNxp
+M.:R?IY,
+_+4,`;954Q[pd@cHhS'OZ<CW=G8xekf-FPv迠xc8vc!6t5΁K)GLPAݻw&]V:k;ܤ͑6uSˉ/)<֥NH[bX;zlqktR%>@gV,9NW.ˬ9sv$Δ3eS4NΓaTpE03yt.I.NϊY"`)rRooIl<RJdg{\RZ/Ш9Ǔv!IIIII[+O2K>ω|2-S){Γ\=[URK+wLa̫J
ā]DnvFjL[
,]1twC~P?ObXSCɟ	DV!r<LyRBCBAw%*4psDNrk"WR{Nإ\}m#&yfmf)DakEpG3pL3O20Obxip.jGsy2L߉'I~R`NR@)W#+7ȫsivF(`?#W%nǖwD2/C_
s_e(|83\zڵV巿䉝yP _sj>;",=j	<蠃VhwxSgQw}<	[{ı }f̊'	c6FcQh/c%z>dz"҅$Ƴ~T|g3\O%g&.ڧ#![m@r
IFm6z[8HI-tIhPee(F>U3Jj<ַ(eRAbh#m3Iug6j-h%ábN	6O$#wRc0QJxvj>`JDCyUn0PRza8MxEc2_])%]7yIrE,
ܸej665'񽍨UCLau-'bKÓ4<IÓ4<IÓ4<IÓ4<IÓ?$7<T=0nI@`O0p*22	O<I|RI432Br<!#Fu?.4R4f&úpF@)ѠC;4(Saxң86tU(E`ZM[)(_h֪.ƿ+.W%iCMh? ;!]-YF(2v_Hc"tS$E	%z3ORTňU
2V^x):RjIċJTUhNd#܊vIx2-"yO8
^m |:j;_͍ǠҤE`Nx(ާ(s4AW\&$,I GSM+yBi9d>	cW/O5z(($g'1jQd@<}d@
}|:#LW	
+xᇯJ^^O|q,$">q)qcY87}&k5
f@>&Vpd'|JmAl[9]d+"uꊁ
llWl43F{|%A#JkE w2Eq7\L+s
mE9kǐvW/{Z;G,
+ae굥6H7ɓ:*eIP*D*7dzN11u^Nݭ'ix'ix'ix'ix'Ils〹ghPyy'):9M!(#exߙdf$`Q;
+c޺uQ±s~NdAJ: @ÎG)d?DNpJOz'Ls_.O8	!Hkc\I٫FlEW&m\,5Ex	& 77(#
+4NU2Э(<ryw_!Ȧi%'Hy8 \ڋ3a %!.i5HIs&DfÜ6O[{xik+H9n$kdrdrʹ$'a%8<0<	ux9ϩvx
jҍrë+w(P-qAA&VIpi(m;$:ԝﶵq-?'>߉'ņ4:MkK4)2Z죾xs[u}?Ǿ1H0fuqn0ay@V`PuhK.<<5PJ2m%LyNHEFgQIoyEMVIP	G܏ċd'A6P3^%SPuņf'٫Fho\:FahBȔ0Dvf!%>3H[rR: QslEIBquj),t$	HikAْʸBRL&,puګXkuIt~<ou&OҥIIfʓޠע}$uT2<ԋ̣/S"}    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_nav_left.png 2.3.1.src/ext/jquery/fancybox/fancy_nav_left.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_nav_left.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_nav_left.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,7 @@
+PNG
+
+   
IHDR         ;0  mIDATHǭWkHWĘKmk58/sJQ69"jU	N	Nl17M:tsb[֭ CVjŘ=ox?јہ9罝yx<^ɒSNyjikk;wO9yk7Z$$'N+n߾ܬ<~֭ODG644D-4?ZkůKIIVVS322}M<ʮmoo?Y__fxxü興 ހu$,&&& ???Nleeź`*11Q(']S>+W?Z'݁iͰ2fѸòOqK{\.$N.ʎ=υ-R444d޴'G\\X)b\\ǫZZZ.X,EZk:WHiK w^R$̱p~!!!ʊs"Zݻfҁwc\"!O^o7]NMMY缽uۤktt+zAjbG(>7??	wuu#MJJ/..ڂ~ɔh~uu0>__V`0pjj0Ro"VlHǘ
+ ==844Ts666XglV[[[6OzRZZ9	XR8oPN-	hΠ֐>ap'lĸP:OSJBq&--,ŷ{199i$FLK$*tJB
+CN5 2Ba0?_#*uENu/?ѿ$ۛZ߲ܳ6|sYi'4}eK'T*58Oh^[T)**2r\ı7\U^^^iAAA%Hn!zIg8r4`H/ "9D.ɗ(}}Fd# tۗL
+H5kA|zzTPP`tw
+	 ?0\%{%{-եA^}A! D&£GLBp
XnkkKPFXkqC K;9NH+'
=GCdG/HC`gJ$MUF~/nAاWymrcH6Eu+D<wexm$q9rwN. Be2	prh O7M\4Z|Mxlv9)z~zo(Gqڿ&    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_nav_right.png 2.3.1.src/ext/jquery/fancybox/fancy_nav_right.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_nav_right.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_nav_right.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         ;0  uIDATHǥWmHW1Dk̚1WUJjH-'LA\6۟Q7'`nB2P5ƤsyEĤɽs{_}pqTIBBN655;;;Mwd#~h mmm1


CIKK,))zj~@cxu&@4s)dggo޼6,//߰Zc/ǫ


}	Hˣ
e111AgΜ}Ŗvϟi5JRA\)RqQQnpp>OX
+`pj6_,=JP(QفT999$wڢ7o|MX=}~(6mZb'Qd{ڵMAF$n}!!!c_m@WW8>p4XK$~rqVVι`4k޽{߀=8Ă_(>677wttXݑ"rAIBvϞ=
D W+/_`5LO8==0%%(/]o V{>-zphh>//잂[qGVƣ/#	Pަ]|K2yZHKΝ;7r`zQ2y>'N0	CJ;)bʇ[VfffVʊW;M+'8ܿL﫫e2G%,H`%]*uT`H)/p:ӰgggGȰ6|Y j'[㑑#|`Wp9	8,J
pq
*c[Ʀ+ª*p႙KZtsfTKH!Ra< ӹTΒQLF>6-..6[, y\2Et*: oQ)KAAݾS m4DB=p8{!},ѥr ^}ON*Y>)5`@)q1+⮋ @v2` qf}{{333S/<Z4<@vJI\./> ]SxOrU5:4x'O~ʕ8F{z&1۫ϮF(?._u	H$w6F2kh/xDv
+(wmxAxur)$$I.m<V&_vx@$2v	Nʶ;d<s4    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_e.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_e.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_e.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_e.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR         ޒ%   2IDATc```7H?x
+g  #	    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_ne.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_ne.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_ne.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_ne.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         
  "IDAT8˭k0o?U+m$+~a`K3I_yy<T`&׾̾e`3Vg	~k(HaACok=p'!j1 Pt`IrY0lAWE1I纔%PVb	IF]-	8pp!_f"Ï]x=;`JM,@ͱTڄ,~vXV,y6QԺ鹎 Fe MJŸ-U h,Eby9[ɏZwOW9gP&    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_n.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_n.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_n.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_n.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         LW   1IDATU	  gQ7{SRU^1I(3     IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_nw.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_nw.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_nw.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_nw.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         
  IDAT8˭
+0E4S)uXԖD{C?~fSAs'
+`}:hkpp~mt<%t֑@,h)@$u5iKx6Vb9FtZVxd:HDWeE2h`~zhEc5+Xy"YĴV]ųȜr
HRW"M,X7 >#aMI~DEi6 ,ovTO    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_se.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_se.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_se.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_se.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         
  'IDAT8ˍTQnC13^9zMF$رž] ~5 ;|"y֡	7 pEbУz}7[D:$0'YRY	rMpQ:Pm.Q׫<@-&BqR ޙ<KY/*MxH`+=H4:&4IIwA1)~(0].=dũC,TM!+{Z\n2MRi/I}HqЇ~}<(s 1MzǱ_k1D    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_s.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_s.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_s.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_s.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         LW   6IDATE
0a!or.?۲k;f7xn[gpKUvdu    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_sw.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_sw.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_sw.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_sw.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         
  IDAT8˭Qn!Da7Asqh:%i+5c1|< TUk~ |O`Ft"uVպ^40ɆҳM֞+7(
+Dtx(7\΍zVᬪ^fZ 
+vi*SaC=;CKʪX`Ua{?LlXڭlI 6Rml!Ia>/OSٜ/zU3%$Cթ߀mXڤ;,ktWF_@FfO#|[Е?    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_w.png 2.3.1.src/ext/jquery/fancybox/fancy_shadow_w.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_shadow_w.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_shadow_w.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         ޒ%   .IDATc?H1)f Le3C1;s@@
 |yc:    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_left.png 2.3.1.src/ext/jquery/fancybox/fancy_title_left.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_left.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_title_left.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR          g%"  IDAT(ύM(qǿfLfS¼F孼dN^(i5RJqq'$J\vh9X+VĴKeW~{|O_@+G*"/eølcρdEX7H:0_hb._:~ݯ## ףs	X
<#AV!Fē`P5v~.XǱ%ؠZÇDΈ9uD!9ְNh~M.p*ЖkaB%:#%|W.MJUnL*wR*Mc89VU]3	~NQT4ah+a!<u$ā=pyOo1L,(G#0A ي
+tc5k>_"mE9[ 1,<`l20Qae휥JK|Vƣ
+*,'Zȃ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_main.png 2.3.1.src/ext/jquery/fancybox/fancy_title_main.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_main.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_title_main.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR          yڑ   'IDATc``g`en&Le`b`pg` WVYS    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_over.png 2.3.1.src/ext/jquery/fancybox/fancy_title_over.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_over.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_title_over.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         ĉ   
IDATc```X   š     IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_right.png 2.3.1.src/ext/jquery/fancybox/fancy_title_right.png
--- 2.2rc2a.cp.src/ext/jquery/fancybox/fancy_title_right.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/fancy_title_right.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,7 @@
+PNG
+
+   
IHDR          g%"  IDAT(}SK(Q=fcc$ʫ<2Vv+RH);Y)+Q
+e3M,bi)ȨGs?goy{=0 sґ
+@ACy;{N/!
ɤ(B93/S|	~29#z3d%*'T'I8CBPò|kfꈋ	q|HGo!Ta	{"kGK?AvV:iU^:pjqQg\
+D
+)܌~Iw(E{ڹ;&,m:ctx4f%`5$^<P,8я(Sqp`v#W&߰7 NoǜE'jP(a`7P@p*0Atz0-k#CLͻ!PC"SСj,d4k@mt([Y"͞/kD՝    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.easing-1.3.pack.js 2.3.1.src/ext/jquery/fancybox/jquery.easing-1.3.pack.js
--- 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.easing-1.3.pack.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/jquery.easing-1.3.pack.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,72 @@
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('h.i[\'1a\']=h.i[\'z\'];h.O(h.i,{y:\'D\',z:9(x,t,b,c,d){6 h.i[h.i.y](x,t,b,c,d)},17:9(x,t,b,c,d){6 c*(t/=d)*t+b},D:9(x,t,b,c,d){6-c*(t/=d)*(t-2)+b},13:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t+b;6-c/2*((--t)*(t-2)-1)+b},X:9(x,t,b,c,d){6 c*(t/=d)*t*t+b},U:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t+1)+b},R:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t+b;6 c/2*((t-=2)*t*t+2)+b},N:9(x,t,b,c,d){6 c*(t/=d)*t*t*t+b},M:9(x,t,b,c,d){6-c*((t=t/d-1)*t*t*t-1)+b},L:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t+b;6-c/2*((t-=2)*t*t*t-2)+b},K:9(x,t,b,c,d){6 c*(t/=d)*t*t*t*t+b},J:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t*t*t+1)+b},I:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t*t+b;6 c/2*((t-=2)*t*t*t*t+2)+b},G:9(x,t,b,c,d){6-c*8.C(t/d*(8.g/2))+c+b},15:9(x,t,b,c,d){6 c*8.n(t/d*(8.g/2))+b},12:9(x,t,b,c,d){6-c/2*(8.C(8.g*t/d)-1)+b},Z:9(x,t,b,c,d){6(t==0)?b:c*8.j(2,10*(t/d-1))+b},Y:9(x,t,b,c,d){6(t==d)?b+c:c*(-8.j(2,-10*t/d)+1)+b},W:9(x,t,b,c,d){e(t==0)6 b;e(t==d)6 b+c;e((t/=d/2)<1)6 c/2*8.j(2,10*(t-1))+b;6 c/2*(-8.j(2,-10*--t)+2)+b},V:9(x,t,b,c,d){6-c*(8.o(1-(t/=d)*t)-1)+b},S:9(x,t,b,c,d){6 c*8.o(1-(t=t/d-1)*t)+b},Q:9(x,t,b,c,d){e((t/=d/2)<1)6-c/2*(8.o(1-t*t)-1)+b;6 c/2*(8.o(1-(t-=2)*t)+1)+b},P:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6-(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b},H:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6 a*8.j(2,-10*t)*8.n((t*d-s)*(2*8.g)/p)+c+b},T:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d/2)==2)6 b+c;e(!p)p=d*(.3*1.5);e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);e(t<1)6-.5*(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b;6 a*8.j(2,-10*(t-=1))*8.n((t*d-s)*(2*8.g)/p)*.5+c+b},F:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*(t/=d)*t*((s+1)*t-s)+b},E:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},16:9(x,t,b,c,d,s){e(s==u)s=1.l;e((t/=d/2)<1)6 c/2*(t*t*(((s*=(1.B))+1)*t-s))+b;6 c/2*((t-=2)*t*(((s*=(1.B))+1)*t+s)+2)+b},A:9(x,t,b,c,d){6 c-h.i.v(x,d-t,0,c,d)+b},v:9(x,t,b,c,d){e((t/=d)<(1/2.k)){6 c*(7.q*t*t)+b}m e(t<(2/2.k)){6 c*(7.q*(t-=(1.5/2.k))*t+.k)+b}m e(t<(2.5/2.k)){6 c*(7.q*(t-=(2.14/2.k))*t+.11)+b}m{6 c*(7.q*(t-=(2.18/2.k))*t+.19)+b}},1b:9(x,t,b,c,d){e(t<d/2)6 h.i.A(x,t*2,0,c,d)*.5+b;6 h.i.v(x,t*2-d,0,c,d)*.5+c*.5+b}});',62,74,'||||||return||Math|function|||||if|var|PI|jQuery|easing|pow|75|70158|else|sin|sqrt||5625|asin|||undefined|easeOutBounce|abs||def|swing|easeInBounce|525|cos|easeOutQuad|easeOutBack|easeInBack|easeInSine|easeOutElastic|easeInOutQuint|easeOutQuint|easeInQuint|easeInOutQuart|easeOutQuart|easeInQuart|extend|easeInElastic|easeInOutCirc|easeInOutCubic|easeOutCirc|easeInOutElastic|easeOutCubic|easeInCirc|easeInOutExpo|easeInCubic|easeOutExpo|easeInExpo||9375|easeInOutSine|easeInOutQuad|25|easeOutSine|easeInOutBack|easeInQuad|625|984375|jswing|easeInOutBounce'.split('|'),0,{}))
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2001 Robert Penner
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.css 2.3.1.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.css
--- 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,359 @@
+/*
+ * FancyBox - jQuery Plugin
+ * Simple and fancy lightbox alternative
+ *
+ * Examples and documentation at: http://fancybox.net
+ * 
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
+ * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
+ * 
+ * Version: 1.3.4 (11/11/2010)
+ * Requires: jQuery v1.3+
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+#fancybox-loading {
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	width: 40px;
+	height: 40px;
+	margin-top: -20px;
+	margin-left: -20px;
+	cursor: pointer;
+	overflow: hidden;
+	z-index: 1104;
+	display: none;
+}
+
+#fancybox-loading div {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 40px;
+	height: 480px;
+	background-image: url('fancybox.png');
+}
+
+#fancybox-overlay {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	z-index: 1100;
+	display: none;
+}
+
+#fancybox-tmp {
+	padding: 0;
+	margin: 0;
+	border: 0;
+	overflow: auto;
+	display: none;
+}
+
+#fancybox-wrap {
+	position: absolute;
+	top: 0;
+	left: 0;
+	padding: 20px;
+	z-index: 1101;
+	outline: none;
+	display: none;
+}
+
+#fancybox-outer {
+	position: relative;
+	width: 100%;
+	height: 100%;
+	background: #fff;
+}
+
+#fancybox-content {
+	width: 0;
+	height: 0;
+	padding: 0;
+	outline: none;
+	position: relative;
+	overflow: hidden;
+	z-index: 1102;
+	border: 0px solid #fff;
+}
+
+#fancybox-hide-sel-frame {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background: transparent;
+	z-index: 1101;
+}
+
+#fancybox-close {
+	position: absolute;
+	top: -15px;
+	right: -15px;
+	width: 30px;
+	height: 30px;
+	background: transparent url('fancybox.png') -40px 0px;
+	cursor: pointer;
+	z-index: 1103;
+	display: none;
+}
+
+#fancybox-error {
+	color: #444;
+	font: normal 12px/20px Arial;
+	padding: 14px;
+	margin: 0;
+}
+
+#fancybox-img {
+	width: 100%;
+	height: 100%;
+	padding: 0;
+	margin: 0;
+	border: none;
+	outline: none;
+	line-height: 0;
+	vertical-align: top;
+}
+
+#fancybox-frame {
+	width: 100%;
+	height: 100%;
+	border: none;
+	display: block;
+}
+
+#fancybox-left, #fancybox-right {
+	position: absolute;
+	bottom: 0px;
+	height: 100%;
+	width: 35%;
+	cursor: pointer;
+	outline: none;
+	background: transparent url('blank.gif');
+	z-index: 1102;
+	display: none;
+}
+
+#fancybox-left {
+	left: 0px;
+}
+
+#fancybox-right {
+	right: 0px;
+}
+
+#fancybox-left-ico, #fancybox-right-ico {
+	position: absolute;
+	top: 50%;
+	left: -9999px;
+	width: 30px;
+	height: 30px;
+	margin-top: -15px;
+	cursor: pointer;
+	z-index: 1102;
+	display: block;
+}
+
+#fancybox-left-ico {
+	background-image: url('fancybox.png');
+	background-position: -40px -30px;
+}
+
+#fancybox-right-ico {
+	background-image: url('fancybox.png');
+	background-position: -40px -60px;
+}
+
+#fancybox-left:hover, #fancybox-right:hover {
+	visibility: visible; /* IE6 */
+}
+
+#fancybox-left:hover span {
+	left: 20px;
+}
+
+#fancybox-right:hover span {
+	left: auto;
+	right: 20px;
+}
+
+.fancybox-bg {
+	position: absolute;
+	padding: 0;
+	margin: 0;
+	border: 0;
+	width: 20px;
+	height: 20px;
+	z-index: 1001;
+}
+
+#fancybox-bg-n {
+	top: -20px;
+	left: 0;
+	width: 100%;
+	background-image: url('fancybox-x.png');
+}
+
+#fancybox-bg-ne {
+	top: -20px;
+	right: -20px;
+	background-image: url('fancybox.png');
+	background-position: -40px -162px;
+}
+
+#fancybox-bg-e {
+	top: 0;
+	right: -20px;
+	height: 100%;
+	background-image: url('fancybox-y.png');
+	background-position: -20px 0px;
+}
+
+#fancybox-bg-se {
+	bottom: -20px;
+	right: -20px;
+	background-image: url('fancybox.png');
+	background-position: -40px -182px; 
+}
+
+#fancybox-bg-s {
+	bottom: -20px;
+	left: 0;
+	width: 100%;
+	background-image: url('fancybox-x.png');
+	background-position: 0px -20px;
+}
+
+#fancybox-bg-sw {
+	bottom: -20px;
+	left: -20px;
+	background-image: url('fancybox.png');
+	background-position: -40px -142px;
+}
+
+#fancybox-bg-w {
+	top: 0;
+	left: -20px;
+	height: 100%;
+	background-image: url('fancybox-y.png');
+}
+
+#fancybox-bg-nw {
+	top: -20px;
+	left: -20px;
+	background-image: url('fancybox.png');
+	background-position: -40px -122px;
+}
+
+#fancybox-title {
+	font-family: Helvetica;
+	font-size: 12px;
+	z-index: 1102;
+}
+
+.fancybox-title-inside {
+	padding-bottom: 10px;
+	text-align: center;
+	color: #333;
+	background: #fff;
+	position: relative;
+}
+
+.fancybox-title-outside {
+	padding-top: 10px;
+	color: #fff;
+}
+
+.fancybox-title-over {
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	color: #FFF;
+	text-align: left;
+}
+
+#fancybox-title-over {
+	padding: 10px;
+	background-image: url('fancy_title_over.png');
+	display: block;
+}
+
+.fancybox-title-float {
+	position: absolute;
+	left: 0;
+	bottom: -20px;
+	height: 32px;
+}
+
+#fancybox-title-float-wrap {
+	border: none;
+	border-collapse: collapse;
+	width: auto;
+}
+
+#fancybox-title-float-wrap td {
+	border: none;
+	white-space: nowrap;
+}
+
+#fancybox-title-float-left {
+	padding: 0 0 0 15px;
+	background: url('fancybox.png') -40px -90px no-repeat;
+}
+
+#fancybox-title-float-main {
+	color: #FFF;
+	line-height: 29px;
+	font-weight: bold;
+	padding: 0 0 3px 0;
+	background: url('fancybox-x.png') 0px -40px;
+}
+
+#fancybox-title-float-right {
+	padding: 0 0 0 15px;
+	background: url('fancybox.png') -55px -90px no-repeat;
+}
+
+/* IE6 */
+
+.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
+.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame {
+	height: expression(this.parentNode.clientHeight + "px");
+}
+
+#fancybox-loading.fancybox-ie6 {
+	position: absolute; margin-top: 0;
+	top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px');
+}
+
+#fancybox-loading.fancybox-ie6 div	{ background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); }
+
+/* IE6, IE7, IE8 */
+
+.fancybox-ie .fancybox-bg { background: transparent !important; }
+
+.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js 2.3.1.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js
--- 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,46 @@
+/*
+ * FancyBox - jQuery Plugin
+ * Simple and fancy lightbox alternative
+ *
+ * Examples and documentation at: http://fancybox.net
+ * 
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
+ * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
+ * 
+ * Version: 1.3.4 (11/11/2010)
+ * Requires: jQuery v1.3+
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("<div/>")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');
+F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)||
+c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick=
+false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel",
+function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("<img />").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+e.width+'" height="'+e.height+'"><param name="movie" value="'+c+
+'"></param>';P="";b.each(e.swf,function(x,H){C+='<param name="'+x+'" value="'+H+'"></param>';P+=" "+x+'="'+H+'"'});C+='<embed src="'+c+'" type="application/x-shockwave-flash" width="'+e.width+'" height="'+e.height+'"'+P+"></embed></object>";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win==
+"function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('<div style="width:'+a+";height:"+c+
+";overflow: "+(e.scrolling=="auto"?"auto":e.scrolling=="yes"?"scroll":"hidden")+';position:relative;"></div>');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor,
+opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length?
+d.titlePosition=="float"?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+s+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+d.titlePosition+'">'+s+"</div>":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding});
+y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height==
+i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents());
+f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode==
+37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto");
+s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(b.browser.msie?'allowtransparency="true""':"")+' scrolling="'+e.scrolling+'" src="'+d.href+'"></iframe>').appendTo(j);
+f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c);
+j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type==
+"image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"),
+10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)};
+b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k=
+0,C=a.length;k<C;k++)if(typeof a[k]=="object")b(a[k]).data("fancybox",b.extend({},g,a[k]));else a[k]=b({}).data("fancybox",b.extend({content:a[k]},g));o=jQuery.merge(o,a)}else{if(typeof a=="object")b(a).data("fancybox",b.extend({},g,a));else a=b({}).data("fancybox",b.extend({content:a},g));o.push(a)}if(q>o.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+
+1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a<l.length){q=a;I()}else if(d.cyclic&&l.length>1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h=
+true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1;
+b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5-
+d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('<div id="fancybox-tmp"></div>'),t=b('<div id="fancybox-loading"><div></div></div>'),u=b('<div id="fancybox-overlay"></div>'),f=b('<div id="fancybox-wrap"></div>'));D=b('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(f);
+D.append(j=b('<div id="fancybox-content"></div>'),E=b('<a id="fancybox-close"></a>'),n=b('<div id="fancybox-title"></div>'),z=b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),A=b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()});
+b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(D)}}};
+b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
+easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.mousewheel-3.0.4.pack.js 2.3.1.src/ext/jquery/fancybox/jquery.mousewheel-3.0.4.pack.js
--- 2.2rc2a.cp.src/ext/jquery/fancybox/jquery.mousewheel-3.0.4.pack.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/fancybox/jquery.mousewheel-3.0.4.pack.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,14 @@
+/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
+* Licensed under the MIT License (LICENSE.txt).
+*
+* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
+* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
+* Thanks to: Seamus Leahy for adding deltaX and deltaY
+*
+* Version: 3.0.4
+*
+* Requires: 1.2.2+
+*/
+
+(function(d){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0,e=0;a=d.event.fix(b);a.type="mousewheel";if(a.wheelDelta)c=a.wheelDelta/120;if(a.detail)c=-a.detail/3;e=c;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){e=0;h=-1*c}if(b.wheelDeltaY!==undefined)e=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,c,h,e);return d.event.handle.apply(this,i)}var f=["DOMMouseScroll","mousewheel"];d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=
+f.length;a;)this.addEventListener(f[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],g,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/jquery-1.4.2.min.js 2.3.1.src/ext/jquery/jquery-1.4.2.min.js
--- 2.2rc2a.cp.src/ext/jquery/jquery-1.4.2.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/jquery-1.4.2.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-af.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-af.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-af.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-af.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+	$.datepicker.regional['af'] = {
+		closeText: 'Selekteer',
+		prevText: 'Vorige',
+		nextText: 'Volgende',
+		currentText: 'Vandag',
+		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+		'Julie','Augustus','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['af']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ar.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ar.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ar.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ar.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,24 @@
+﻿/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Al Horani -- koko.dw@gmail.com */
+/* خالد الحوراني -- koko.dw@gmail.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+	$.datepicker.regional['ar'] = {
+		closeText: 'إغلاق',
+		prevText: '&#x3c;السابق',
+		nextText: 'التالي&#x3e;',
+		currentText: 'اليوم',
+		monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+		'تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
+		dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+		dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+		weekHeader: 'أسبوع',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-az.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-az.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-az.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-az.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+	$.datepicker.regional['az'] = {
+		closeText: 'Bağla',
+		prevText: '&#x3c;Geri',
+		nextText: 'İrəli&#x3e;',
+		currentText: 'Bugün',
+		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+		'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+		monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+		'İyul','Avq','Sen','Okt','Noy','Dek'],
+		dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+		dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+		dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['az']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bg.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bg.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bg.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bg.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,24 @@
+﻿/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'затвори',
+        prevText: '&#x3c;назад',
+        nextText: 'напред&#x3e;',
+		nextBigText: '&#x3e;&#x3e;',
+        currentText: 'днес',
+        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+        'Юли','Август','Септември','Октомври','Ноември','Декември'],
+        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+        'Юли','Авг','Сеп','Окт','Нов','Дек'],
+        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+		weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+        isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bs.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bs.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bs.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-bs.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+	$.datepicker.regional['bs'] = {
+		closeText: 'Zatvori', 
+		prevText: '&#x3c;', 
+		nextText: '&#x3e;', 
+		currentText: 'Danas', 
+		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['bs']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ca.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ca.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ca.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ca.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ca'] = {
+		closeText: 'Tancar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Avui',
+		monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+		'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Oct','Nov','Des'],
+		dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+		dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+		dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ca']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-cs.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-cs.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-cs.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-cs.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+	$.datepicker.regional['cs'] = {
+		closeText: 'Zavřít',
+		prevText: '&#x3c;Dříve',
+		nextText: 'Později&#x3e;',
+		currentText: 'Nyní',
+		monthNames: ['leden','únor','březen','duben','květen','červen',
+        'červenec','srpen','září','říjen','listopad','prosinec'],
+		monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+		'čvc','srp','zář','říj','lis','pro'],
+		dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+		dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+		dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+		weekHeader: 'Týd',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['cs']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-da.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-da.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-da.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-da.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+		closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+		nextText: 'Næste&#x3e;',
+		currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+		weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-de.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-de.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-de.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-de.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schließen',
+		prevText: '&#x3c;zurück',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','März','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-el.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-el.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-el.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-el.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+	$.datepicker.regional['el'] = {
+		closeText: 'Κλείσιμο',
+		prevText: 'Προηγούμενος',
+		nextText: 'Επόμενος',
+		currentText: 'Τρέχων Μήνας',
+		monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+		'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+		monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+		'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+		dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+		dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+		dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+		weekHeader: 'Εβδ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['el']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-en-GB.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-en-GB.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-en-GB.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-en-GB.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+	$.datepicker.regional['en-GB'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eo.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eo.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eo.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eo.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+	$.datepicker.regional['eo'] = {
+		closeText: 'Fermi',
+		prevText: '&lt;Anta',
+		nextText: 'Sekv&gt;',
+		currentText: 'Nuna',
+		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+		'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+		weekHeader: 'Sb',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eo']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-es.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-es.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-es.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-es.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-et.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-et.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-et.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-et.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+	$.datepicker.regional['et'] = {
+		closeText: 'Sulge',
+		prevText: 'Eelnev',
+		nextText: 'Järgnev',
+		currentText: 'Täna',
+		monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+		'Juuli','August','September','Oktoober','November','Detsember'],
+		monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+		dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+		dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+		dayNamesMin: ['P','E','T','K','N','R','L'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['et']);
+}); 
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eu.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eu.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eu.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-eu.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+	$.datepicker.regional['eu'] = {
+		closeText: 'Egina',
+		prevText: '&#x3c;Aur',
+		nextText: 'Hur&#x3e;',
+		currentText: 'Gaur',
+		monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+		'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+		monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+		'Uzt','Abu','Ira','Urr','Aza','Abe'],
+		dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+		dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+		dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eu']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fa.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fa.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fa.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fa.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+	$.datepicker.regional['fa'] = {
+		closeText: 'بستن',
+		prevText: '&#x3c;قبلي',
+		nextText: 'بعدي&#x3e;',
+		currentText: 'امروز',
+		monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+		'مهر','آبان','آذر','دي','بهمن','اسفند'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+		dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+		dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+		weekHeader: 'هف',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 6,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fa']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fi.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fi.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fi.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fi.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['fi'] = {
+		closeText: 'Sulje',
+		prevText: '&laquo;Edellinen',
+		nextText: 'Seuraava&raquo;',
+		currentText: 'T&auml;n&auml;&auml;n',
+        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
+        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
+        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
+		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+		weekHeader: 'Vk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fo.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fo.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fo.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fo.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+	$.datepicker.regional['fo'] = {
+		closeText: 'Lat aftur',
+		prevText: '&#x3c;Fyrra',
+		nextText: 'Næsta&#x3e;',
+		currentText: 'Í dag',
+		monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+		'Juli','August','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+		dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+		dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+		weekHeader: 'Vk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fo']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr-CH.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr-CH.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr-CH.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr-CH.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+	$.datepicker.regional['fr-CH'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;Préc',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+		'Jul','Aoû','Sep','Oct','Nov','Déc'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-fr.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;Préc',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+		'Jul','Aoû','Sep','Oct','Nov','Déc'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-gl.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-gl.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-gl.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-gl.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+	$.datepicker.regional['gl'] = {
+		closeText: 'Pechar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Hoxe',
+		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+		'Xul','Ago','Set','Out','Nov','Dec'],
+		dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['gl']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-he.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-he.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-he.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-he.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+	$.datepicker.regional['he'] = {
+		closeText: 'סגור',
+		prevText: '&#x3c;הקודם',
+		nextText: 'הבא&#x3e;',
+		currentText: 'היום',
+		monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+		'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+		monthNamesShort: ['1','2','3','4','5','6',
+		'7','8','9','10','11','12'],
+		dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+		dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['he']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hr.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hr.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hr.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hr.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+	$.datepicker.regional['hr'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+		monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+		'Srp','Kol','Ruj','Lis','Stu','Pro'],
+		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Tje',
+		dateFormat: 'dd.mm.yy.',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hr']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hu.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hu.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hu.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hu.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+	$.datepicker.regional['hu'] = {
+		closeText: 'bezárás',
+		prevText: '&laquo;&nbsp;vissza',
+		nextText: 'előre&nbsp;&raquo;',
+		currentText: 'ma',
+		monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+		'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+		monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+		'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+		dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+		dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+		weekHeader: 'Hé',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hu']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hy.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hy.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hy.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-hy.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+	$.datepicker.regional['hy'] = {
+		closeText: 'Փակել',
+		prevText: '&#x3c;Նախ.',
+		nextText: 'Հաջ.&#x3e;',
+		currentText: 'Այսօր',
+		monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+		'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+		monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+		'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+		dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+		dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		weekHeader: 'ՇԲՏ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hy']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-id.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-id.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-id.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-id.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['id'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;mundur',
+		nextText: 'maju&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+		'Juli','Agustus','September','Oktober','Nopember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Agus','Sep','Okt','Nop','Des'],
+		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['id']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-is.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-is.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-is.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-is.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+	$.datepicker.regional['is'] = {
+		closeText: 'Loka',
+		prevText: '&#x3c; Fyrri',
+		nextText: 'N&aelig;sti &#x3e;',
+		currentText: '&Iacute; dag',
+		monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+		'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+		'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+		dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+		dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+		dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+		weekHeader: 'Vika',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['is']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-it.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-it.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-it.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-it.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['it'] = {
+		closeText: 'Chiudi',
+		prevText: '&#x3c;Prec',
+		nextText: 'Succ&#x3e;',
+		currentText: 'Oggi',
+		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+			'Lug','Ago','Set','Ott','Nov','Dic'],
+		dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['it']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ja.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ja.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ja.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ja.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+	$.datepicker.regional['ja'] = {
+		closeText: '閉じる',
+		prevText: '&#x3c;前',
+		nextText: '次&#x3e;',
+		currentText: '今日',
+		monthNames: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+		dayNamesShort: ['日','月','火','水','木','金','土'],
+		dayNamesMin: ['日','月','火','水','木','金','土'],
+		weekHeader: '週',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['ja']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ko.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ko.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ko.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ko.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ko'] = {
+		closeText: '닫기',
+		prevText: '이전달',
+		nextText: '다음달',
+		currentText: '오늘',
+		monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		dayNames: ['일','월','화','수','목','금','토'],
+		dayNamesShort: ['일','월','화','수','목','금','토'],
+		dayNamesMin: ['일','월','화','수','목','금','토'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: '년'};
+	$.datepicker.setDefaults($.datepicker.regional['ko']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-kz.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-kz.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-kz.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-kz.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['kz'] = {
+		closeText: 'Жабу',
+		prevText: '&#x3c;Алдыңғы',
+		nextText: 'Келесі&#x3e;',
+		currentText: 'Бүгін',
+		monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+		'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+		monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+		'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+		dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+		dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+		dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+		weekHeader: 'Не',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['kz']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lt.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lt.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lt.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lt.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+	$.datepicker.regional['lt'] = {
+		closeText: 'Uždaryti',
+		prevText: '&#x3c;Atgal',
+		nextText: 'Pirmyn&#x3e;',
+		currentText: 'Šiandien',
+		monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+		'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+		dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+		dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lt']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lv.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lv.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lv.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-lv.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+	$.datepicker.regional['lv'] = {
+		closeText: 'Aizvērt',
+		prevText: 'Iepr',
+		nextText: 'Nāka',
+		currentText: 'Šodien',
+		monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+		'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+		'Jūl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+		weekHeader: 'Nav',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lv']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ms.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ms.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ms.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ms.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+	$.datepicker.regional['ms'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;Sebelum',
+		nextText: 'Selepas&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+		'Julai','Ogos','September','Oktober','November','Disember'],
+		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+		'Jul','Ogo','Sep','Okt','Nov','Dis'],
+		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ms']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-nl.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-nl.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-nl.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-nl.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+	$.datepicker.regional.nl = {
+		closeText: 'Sluiten',
+		prevText: '←',
+		nextText: '→',
+		currentText: 'Vandaag',
+		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+		monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional.nl);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-no.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-no.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-no.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-no.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['no'] = {
+		closeText: 'Lukk',
+        prevText: '&laquo;Forrige',
+		nextText: 'Neste&raquo;',
+		currentText: 'I dag',
+        monthNames: ['Januar','Februar','Mars','April','Mai','Juni',
+        'Juli','August','September','Oktober','November','Desember'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+		weekHeader: 'Uke',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['no']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pl.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pl.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pl.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pl.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pl'] = {
+		closeText: 'Zamknij',
+		prevText: '&#x3c;Poprzedni',
+		nextText: 'Następny&#x3e;',
+		currentText: 'Dziś',
+		monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+		'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+		'Lip','Sie','Wrz','Pa','Lis','Gru'],
+		dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+		dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+		dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+		weekHeader: 'Tydz',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pl']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt-BR.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt-BR.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt-BR.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt-BR.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pt-BR'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Pr&oacute;ximo&#x3e;',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-pt.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+	$.datepicker.regional['pt'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Seguinte',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sem',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ro.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ro.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ro.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ro.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+﻿/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+	$.datepicker.regional['ro'] = {
+		closeText: 'Închide',
+		prevText: '&laquo; Luna precedentă',
+		nextText: 'Luna următoare &raquo;',
+		currentText: 'Azi',
+		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+		weekHeader: 'Săpt',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ro']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ru.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ru.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ru.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ru.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ru'] = {
+		closeText: 'Закрыть',
+		prevText: '&#x3c;Пред',
+		nextText: 'След&#x3e;',
+		currentText: 'Сегодня',
+		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+		'Июл','Авг','Сен','Окт','Ноя','Дек'],
+		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Нед',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ru']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sk.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sk.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sk.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sk.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+	$.datepicker.regional['sk'] = {
+		closeText: 'Zavrieť',
+		prevText: '&#x3c;Predchádzajúci',
+		nextText: 'Nasledujúci&#x3e;',
+		currentText: 'Dnes',
+		monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+		'Júl','August','September','Október','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+		'Júl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+		dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+		dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+		weekHeader: 'Ty',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sk']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sl.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sl.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sl.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sl.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+	$.datepicker.regional['sl'] = {
+		closeText: 'Zapri',
+		prevText: '&lt;Prej&#x161;nji',
+		nextText: 'Naslednji&gt;',
+		currentText: 'Trenutni',
+		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+		'Julij','Avgust','September','Oktober','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+		dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+		dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+		weekHeader: 'Teden',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sl']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sq.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sq.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sq.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sq.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['sq'] = {
+		closeText: 'mbylle',
+		prevText: '&#x3c;mbrapa',
+		nextText: 'Përpara&#x3e;',
+		currentText: 'sot',
+		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+		'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+		'Kor','Gus','Sht','Tet','Nën','Dhj'],
+		dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+		dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		weekHeader: 'Ja',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sq']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr'] = {
+		closeText: 'Затвори',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Данас',
+		monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+		'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+		monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+		'Јул','Авг','Сеп','Окт','Нов','Дец'],
+		dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+		dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+		dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+		weekHeader: 'Сед',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr-SR.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr-SR.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr-SR.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sr-SR.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr-SR'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Sed',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sv.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sv.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sv.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-sv.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+		closeText: 'Stäng',
+        prevText: '&laquo;Förra',
+		nextText: 'Nästa&raquo;',
+		currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+		dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+		dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+		weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ta.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ta.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ta.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-ta.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+	$.datepicker.regional['ta'] = {
+		closeText: 'மூடு',
+		prevText: 'முன்னையது',
+		nextText: 'அடுத்தது',
+		currentText: 'இன்று',
+		monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+		'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+		monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+		'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+		dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+		dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+		dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ta']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-th.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-th.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-th.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-th.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+	$.datepicker.regional['th'] = {
+		closeText: 'ปิด',
+		prevText: '&laquo;&nbsp;ย้อน',
+		nextText: 'ถัดไป&nbsp;&raquo;',
+		currentText: 'วันนี้',
+		monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+		'กรกฏาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+		monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+		'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+		dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+		dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['th']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-tr.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-tr.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-tr.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-tr.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+	$.datepicker.regional['tr'] = {
+		closeText: 'kapat',
+		prevText: '&#x3c;geri',
+		nextText: 'ileri&#x3e',
+		currentText: 'bugün',
+		monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+		'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+		monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+		'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+		dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+		dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tr']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-uk.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-uk.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-uk.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-uk.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['uk'] = {
+		closeText: 'Закрити',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Сьогодні',
+		monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+		'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+		monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+		'Лип','Сер','Вер','Жов','Лис','Гру'],
+		dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+		dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['uk']);
+});
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-vi.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-vi.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-vi.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-vi.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+	$.datepicker.regional['vi'] = {
+		closeText: 'Đóng',
+		prevText: '&#x3c;Trước',
+		nextText: 'Tiếp&#x3e;',
+		currentText: 'Hôm nay',
+		monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+		'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+		monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+		'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+		dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		weekHeader: 'Tu',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['vi']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-CN.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-CN.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-CN.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-CN.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-CN'] = {
+		closeText: '关闭',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-HK.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-HK.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-HK.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-HK.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-HK'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-TW.js 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-TW.js
--- 2.2rc2a.cp.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-TW.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/i18n/jquery.ui.datepicker-zh-TW.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+﻿/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-TW'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/jquery-ui-1.8.6.min.js 2.3.1.src/ext/jquery/ui/jquery-ui-1.8.6.min.js
--- 2.2rc2a.cp.src/ext/jquery/ui/jquery-ui-1.8.6.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/jquery-ui-1.8.6.min.js	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,778 @@
+/*!
+ * jQuery UI 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.6",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
+this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
+return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
+this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
+a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=m/2;
+i.left=parseInt(i.left);i.top=parseInt(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=d>0?
+b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,
+b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
+"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&
+a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),
+10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+
+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+
+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-
+this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=
+this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.6"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");
+if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;
+c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=
+1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;
+this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=
+this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=
+d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;
+if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!=
+"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-
+b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
+c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
+width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&
+o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=
+p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&
+(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
+10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.6"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
+b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
+a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
+k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
+c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
+this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
+arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
+{version:"1.8.6"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
+function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
+(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
+false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
+a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
+b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
+"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
+f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
+a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
+e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
+height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
+d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.6"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,
+arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=
+c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,
+{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();
+if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",
+a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");
+if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+
+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+
+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+
+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,
+c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==
+document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",
+null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):
+d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||
+"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+
+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?
+2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},
+_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=
+this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=
+this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");
+if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=
+0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=
+this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},
+update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=
+null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));
+this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,
+null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||
+d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a==
+"string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition==
+"absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition==
+"relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},
+_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-
+this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),
+10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?
+this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=
+this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+
+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?
+g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
+e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==
+f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",
+f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",
+g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=
+0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});
+d.extend(d.ui.sortable,{version:"1.8.6"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(g){return a._keydown(g)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+
+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);
+a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j,
+down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})});
+f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.6",animations:{slide:function(a,
+b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1],
+unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
+paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(e){e.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage",
+c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault();break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:case d.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);
+break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo(e(this.options.appendTo||
+"body",b)[0]).mousedown(function(c){var d=a.menu.element[0];e(c.target).closest(".ui-menu-item").length||setTimeout(function(){e(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==d&&!e.ui.contains(d,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");
+var g=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=g;setTimeout(function(){a.previous=g},1)}false!==a._trigger("select",c,{item:d})&&a.element.val(d.value);a.term=a.element.val();a.close(c);a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
+this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a,b){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(e(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,f;if(e.isArray(this.options.source)){b=this.options.source;this.source=function(c,d){d(e.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=
+function(c,d){a.xhr&&a.xhr.abort();a.xhr=e.getJSON(f,c,function(g,i,h){h===a.xhr&&d(g);a.xhr=null})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(a&&a.length){a=
+this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(b){if(typeof b===
+"string")return{label:b,value:b};return e.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){this._renderMenu(this.menu.element.empty().zIndex(this.element.zIndex()+1),a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position(e.extend({of:this.element},this.options.position));this._resizeMenu()},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var f=
+this;e.each(b,function(c,d){f._renderItem(a,d)})},_renderItem:function(a,b){return e("<li></li>").data("item.autocomplete",b).append(e("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var f=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery);
+(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),d=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=d&&this.element.attr("scrollTop",c+f-d+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
+a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var d=e(this).offset().top-b-f+e(this).height();return d<10&&d>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a,
+c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=e(this).offset().top-b+f-e(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
+this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
+this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
+this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":visible").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;
+b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=
+b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&
+a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});
+c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);
+d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();
+a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],
+arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,
+h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";
+d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",
+g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,
+a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a);e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);
+break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");
+g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d;this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,
+height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.6",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});
+c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&
+d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");
+a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,
+document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");b.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(b.range){if(b.range===true){this.range=d("<div></div>");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length<b.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");h=a._start(c,f);if(h===false)return}break}i=a.options.step;h=a.options.values&&a.options.values.length?(g=a.values(f)):(g=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=a._valueMin();break;case d.ui.keyCode.END:g=a._valueMax();break;case d.ui.keyCode.PAGE_UP:g=a._trimAlignValue(h+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=a._trimAlignValue(h-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+a._valueMax())return;g=a._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===a._valueMin())return;g=a._trimAlignValue(h-i);break}a._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,h,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(b.range===true&&this.values(1)===b.min){g+=1;f=d(this.handles[g])}if(this._start(a,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();b=f.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-f.width()/2,top:a.pageY-b.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b=
+this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b=
+this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);
+c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c<e))c=e;if(c!==this.values(b)){e=this.values();e[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c});
+a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=
+this._trimAlignValue(a);this._refreshValue();this._change(null,0)}return this._value()},values:function(a,b){var c,e,f;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):this.value();
+else return this._values()},_setOption:function(a,b){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a];
+return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<this._valueMin())return this._valueMin();if(a>this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=
+this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({width:f-
+g+"%"},{queue:false,duration:b.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:b.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},
+b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.6"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a._sanitizeSelector(i));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=d("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){d(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],d(a._sanitizeSelector(a.anchors[c.selected].hash))))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=-1;c.cookie&&
+a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=d("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,"cache.tabs",
+true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(b,
+e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.6"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&a.rotate(null)}:
+function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,G){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a,
+b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.6"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=
+f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==
+Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);
+d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},
+_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=
+d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;
+for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&
+this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&
+!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();
+return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||
+a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,
+a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));
+var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||
+a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);
+d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&
+d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,
+h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");
+this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");
+this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");
+a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),
+k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];
+a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():
+"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&
+!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;
+b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=
+this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=
+d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,
+"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b==
+"object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?
+3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,H){p=o(p)?H:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length).toLowerCase()==p[w].toLowerCase()){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");
+break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>
+-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*
+60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)==
+"'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+=
+"'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},
+_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,
+this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=
+parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1],10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},
+_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?
+"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=
+this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,
+"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+
+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
+y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var M=
+"",D=0;D<i[1];D++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?
+f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
+A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||j&&q<j||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&
+a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+
+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
+"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+
+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,
+i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
+return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.6";window["DP_jQuery_"+y]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change");this._value()===this.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=
+this.value();this.valueDiv.toggleClass("ui-corner-right",a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.6"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor",
+"borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,
+0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],
+lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=
+b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("className");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("className",v);e.animate(u(h,r),a,b,function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?
+f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,
+[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.6",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=
+0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,
+{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=
+k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=
+k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,
+a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*
+(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,
+a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,
+a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+
+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==
+j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*
+(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a);
+c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]=
+f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1:
+0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100*
+f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a,
+b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!=
+d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from);
+if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child,
+f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&&
+b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+
+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],e=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(e=="show")a.css(f,b=="pos"?-g:g);var i={};i[f]=(e=="show"?b=="pos"?
+"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR   (   d   drz   {IDATh1  17Y$t3;_TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc)    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_flat_55_fbec88_40x100.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_flat_55_fbec88_40x100.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_flat_55_fbec88_40x100.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_flat_55_fbec88_40x100.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR   (   d   drz   }IDATh1   A$=am n/]ϽcIAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUA6N]    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR        oX
+   CIDAT8!@C{+r`XԼӚaYRoَD-B7uNT"R$    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_85_dfeffc_1x400.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_85_dfeffc_1x400.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_85_dfeffc_1x400.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_85_dfeffc_1x400.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR        oX
+   BIDAT81
+0D?s0"Bz!L[L> !m9Κ¶S`Kz?BXqn ]Y    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_95_fef1ec_1x400.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_95_fef1ec_1x400.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_glass_95_fef1ec_1x400.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_glass_95_fef1ec_1x400.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,6 @@
+PNG
+
+   
IHDR        oX
+   >IDAT81
+0 Cџ $CB}1@)e_ƅ`I8-%cM0)"
+
L    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,12 @@
+PNG
+
+   
IHDR     d    IDATx[r6g!"fYB*O9/9yiCԱ*Eo@q?|&?/lpi^~^떝c4p.rKn᧪e^v1Sv!SVvSvRڽn.XU*e))Ňa^y-z%SQBnZ{OD]mrf#8yzq4>2M}͠g8[yQ_Zq,Y-/R&2{WZsoB4_/t^zڗe۲҈nJm]?;O{WyWK^>Wr5
+0A^4zAjALhr`z/ܺ=1B۠m*7&H,R"+8=&^/>10m.n\Fb6;![F%[A>U5KU*E$lN_ey;ZLٳQ+SaB w7g@
pN/B sw(C^< @ t 
+@zEotgb>[hYRz$>̍MǊ/돣s^߉i y{2e@%^Wݞ|&}\g;d<^W[qhHxZ&L$ML֪p{V9"qixWwIWٔlqH_6{Rz~x|ܦo~L
+ֻQu^ćwghY#1d?[zt#^L٬tMF+MlҦ#ڶ2ىrڴo,?Y'C/aFJQ}Ƿ&92>%A=]OL_#"KHQ#8z9zJ;HHy! 
+} 3DzQ1Ҋ䘮ozr HAʭ__7s?)lRxy&a5: 1p~[  %@^Q,#dt{{D˴ų+G+w/'Z^~6glk=3Y;g3;&ݭ;xVfvZrRyt)"Ā5: k  /k 8P ' 
+@0( : @   `P>V#")z0l3CYqyrZ̒n/:CN˧+UlZe:GIy,XC{sTPrgk:^4x$Fh^D7#{eC-  kt 
+d8oԽF%;%{$4MOW'cŤmkhb|K1XhٌԡfK>VMkWt~=gI[hd6#챖&Ŕ)ӳYe})?Ji7O?Wt xm2 -?E[DX+#˯!,tGc{}OwC@[䏔e)޼}x-@M#MS{?^ڽɧCW_>KZkwײ5|Ǜ>/zGǤIG^S*_[Zch>'ap_&<qY:R<D'89cٍEt*G"v2%=qh>1d?jCkt J  w(  `EbkIEAnJt+p)O|Xe]o\/D9 ??;ƭ֕^̗	qm&mB~R_۲Rv|?^<v|LJz_qs4\s],ڈVVE-Wg Ј/ˢi|k$ |;  |+pF   [`(  ` f 
+znBg/F1g,+lY:,0ڿ4)Dhmq_&K\7d.GeqDmF)aO:};`, F: w( 6 P l t t 8P?9      88   ' 't         :   ppB   N N   	   :   pz   `   @   =X   '   :   pf   gSk   G^2\?$+bْxR9x稟H=).z|x"lj1yՍ&'&Hr?=)lt,R޸d?fKy3;^_O_KGctjek>h7QyȤhHA|j&sD['Mߒe3oG׿}|NGL8ۿ,1OrcH]z_#      0oX$4-]²gÊϊA-M+gW-q9g4)=W><}-&nC/luCRZu>!Y>>*oR<#m{Ǭׇ"h9HypgɿTGֹDh;GD
o̽"7~!cJڌzvm]oc`ϰ+|}MDB].
+^#lH}263nl{VgGd#v᥏֙VV28<vLQ?{ϓ<ͳ;K7шhU,$֚~[v _\ܜi"!X^2. 2g  hhatQKŅp1Bvᒹ'o\㚘/z5. &u1u]xDb~W.G\}TNx]ׇ~=t8  p'ʛyas   G_kϰy,Ls&G>3gŧ<"O6Gs}mrd_mH>#4Qu͟:Fy*چ^޳XZVhgq'G ԍӯgX:{q?//JUa}mWvFt#b}x'̹VF擣||;    >SV"    `   9_   W2/o   ۀק   ' ߡ   '   :   ppB   NLQ!uvMy/__}lyZ/oq}+׋"lHʨ!;c5}ǲK5}콎UXqxe"5)SvL/#VzZܼθ5ֽb<9 :_[ꝗê̑݋Ӌ-^k]Vf0+#fmE#Gxrh6qG$<Gy&D}H:GM3qiv91Shd7D#1)3_LDK?iqrDyV'GċؿZVl3m7_ecߑ}mK̭eXo[Ml4Φ2hۑ9\FM+zlR==cLR]r=Vc-_ÒUjZT.[VJ˗OӉɲ}hiΖ-Vvh4ַ#z\ѱm?}-;nna<g3Rx|	m`ԇTwC??xAdqdMF_   ̕nG    g?
+       ߞ*]r    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      d   G,Z`   /IDATc&aM02200100201cK002siK  `s_    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR      d   G,Z`   IDATc&G0ed wڰ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_217bc0_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_217bc0_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_217bc0_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_217bc0_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,25 @@
+PNG
+
+   
IHDR         IJ   PLTE$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$zl   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  IDATx]b۶H儒-{iZK:glkn-tIqq?  E$dK>$>; PZ sVh!Sy0E0}H)-tkoܪKp\RϠ .E7
+)*V;~Pe
Bx*,=$zDؾ  JҸٻ 9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R 
HV!%;"
+i]dddddddd4y5 	Rb@(8CdŪݡ,@T@ibrq0alX!pe,	=4bW {
+5Ƭhu~(Q^@3="b5XC@JCT76q_5@,r	šɩD)T|O@
+ON-ՙ	[n@RXIm݋(F @?=0puL;g$@6η
+K`>п @h գKVn"a"%l@.v$/U^G:#`` uTtK~ŋZ5T%kxk]\*Q
,҇B44OXK|yg+_M(lоEO
+ V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V
+rh(]tI^}oצoS3	";ʙb}"߰	){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.} Q3.Nس} )>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa3	{oB
&<L[Nc.öi=` Q@d
+͆I.Il`\t[< Cit484-r+f쑱BCB MH	iy }>rxp|z;BǏ;burcK4tz1G~`ؚK|	̔>ۡO$~
+Ao)0pzz
+} i `;ADm8n:cfA@s7L  Z/..h8or?

N93B~o_'` opO-
:TG	L;7]`B%˛>*wTpM 0H}&t^1'Oqr'2P͡+z,tIW''|en=ǳgRm[NStK{҉mؓVt6ҲR`ζN&}B	U(r<qȁVyrrA**دzg6D#	YP`vs~(zMle|uQa*}+T
RXc"+*NlNhcFt<N+;-}،Xtٕ$à^|uv*~'E_51qs*R`OΒ9#x449#WHۏZ)]0`p<ߝNoY{476ǹ>ۗ&1%Q''?l׸+&r{jN಻4)`N狌.߭ ǣ)q	2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~<v\	%,ߚ/pR~/^lnp
7t0_0l4_b0MWΦjmбɎl
+|re
ȫ`B-v.iRox}
+)%#`ЂR5CA2sua sYy3=jaeoI7~.plA΃
+`O)	^>Mz	+4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6G FZ)O	!lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5a v]m1+3 y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c-賟Lδ>]5.sYs1f0;'̨Yg銛{@9	`aC(=%bo2=n1	jBoS$n#m =i0ci9}oI	qT] W%.(؅]z\x
+f"]o'u䫵tk{v;A C3ֆwwR_#X(xҋ/q%Whpk_IX'b/fXKi"#####QCLi2t
5L 0
+QiH2;yTOok;עٶ`RNg{zy! Kxm?A(vU~mL(`o/!nmX-{v [ dw=n「sdwzn(}Oy~m
+?XU;, V'+V&JRZ]᧭:zC'-߆@y
4u`Vۓwъ#zP@Q
N>2/{\o) W~a3xLw
:_Q;=pּdt\'8~3SRP6y+XQ*޺r
+̗ѭ*޺r
+gl/\U^u$|mbVnw\V|D͊NVNy7 k<;/E}?E*ǳgO ~g/96f
+cD}%g$QG7o) UJo,O@0߾Q(;bw:5	NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 
+3
+u	Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s<uP    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_2e83ff_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_2e83ff_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_2e83ff_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_2e83ff_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,25 @@
+PNG
+
+   
IHDR         IJ   PLTE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ˬM   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  IDATx]b۶H儒-{iZK:glkn-tIqq?  E$dK>$>; PZ sVh!Sy0E0}H)-tkoܪKp\RϠ .E7
+)*V;~Pe
Bx*,=$zDؾ  JҸٻ 9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R 
HV!%;"
+i]dddddddd4y5 	Rb@(8CdŪݡ,@T@ibrq0alX!pe,	=4bW {
+5Ƭhu~(Q^@3="b5XC@JCT76q_5@,r	šɩD)T|O@
+ON-ՙ	[n@RXIm݋(F @?=0puL;g$@6η
+K`>п @h գKVn"a"%l@.v$/U^G:#`` uTtK~ŋZ5T%kxk]\*Q
,҇B44OXK|yg+_M(lоEO
+ V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V
+rh(]tI^}oצoS3	";ʙb}"߰	){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.} Q3.Nس} )>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa3	{oB
&<L[Nc.öi=` Q@d
+͆I.Il`\t[< Cit484-r+f쑱BCB MH	iy }>rxp|z;BǏ;burcK4tz1G~`ؚK|	̔>ۡO$~
+Ao)0pzz
+} i `;ADm8n:cfA@s7L  Z/..h8or?

N93B~o_'` opO-
:TG	L;7]`B%˛>*wTpM 0H}&t^1'Oqr'2P͡+z,tIW''|en=ǳgRm[NStK{҉mؓVt6ҲR`ζN&}B	U(r<qȁVyrrA**دzg6D#	YP`vs~(zMle|uQa*}+T
RXc"+*NlNhcFt<N+;-}،Xtٕ$à^|uv*~'E_51qs*R`OΒ9#x449#WHۏZ)]0`p<ߝNoY{476ǹ>ۗ&1%Q''?l׸+&r{jN಻4)`N狌.߭ ǣ)q	2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~<v\	%,ߚ/pR~/^lnp
7t0_0l4_b0MWΦjmбɎl
+|re
ȫ`B-v.iRox}
+)%#`ЂR5CA2sua sYy3=jaeoI7~.plA΃
+`O)	^>Mz	+4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6G FZ)O	!lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5a v]m1+3 y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c-賟Lδ>]5.sYs1f0;'̨Yg銛{@9	`aC(=%bo2=n1	jBoS$n#m =i0ci9}oI	qT] W%.(؅]z\x
+f"]o'u䫵tk{v;A C3ֆwwR_#X(xҋ/q%Whpk_IX'b/fXKi"#####QCLi2t
5L 0
+QiH2;yTOok;עٶ`RNg{zy! Kxm?A(vU~mL(`o/!nmX-{v [ dw=n「sdwzn(}Oy~m
+?XU;, V'+V&JRZ]᧭:zC'-߆@y
4u`Vۓwъ#zP@Q
N>2/{\o) W~a3xLw
:_Q;=pּdt\'8~3SRP6y+XQ*޺r
+̗ѭ*޺r
+gl/\U^u$|mbVnw\V|D͊NVNy7 k<;/E}?E*ǳgO ~g/96f
+cD}%g$QG7o) UJo,O@0߾Q(;bw:5	NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 
+3
+u	Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s<uP    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_469bdd_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_469bdd_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_469bdd_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_469bdd_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,25 @@
+PNG
+
+   
IHDR         IJ   PLTEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDʡ#   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  IDATx]b۶H儒-{iZK:glkn-tIqq?  E$dK>$>; PZ sVh!Sy0E0}H)-tkoܪKp\RϠ .E7
+)*V;~Pe
Bx*,=$zDؾ  JҸٻ 9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R 
HV!%;"
+i]dddddddd4y5 	Rb@(8CdŪݡ,@T@ibrq0alX!pe,	=4bW {
+5Ƭhu~(Q^@3="b5XC@JCT76q_5@,r	šɩD)T|O@
+ON-ՙ	[n@RXIm݋(F @?=0puL;g$@6η
+K`>п @h գKVn"a"%l@.v$/U^G:#`` uTtK~ŋZ5T%kxk]\*Q
,҇B44OXK|yg+_M(lоEO
+ V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V
+rh(]tI^}oצoS3	";ʙb}"߰	){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.} Q3.Nس} )>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa3	{oB
&<L[Nc.öi=` Q@d
+͆I.Il`\t[< Cit484-r+f쑱BCB MH	iy }>rxp|z;BǏ;burcK4tz1G~`ؚK|	̔>ۡO$~
+Ao)0pzz
+} i `;ADm8n:cfA@s7L  Z/..h8or?

N93B~o_'` opO-
:TG	L;7]`B%˛>*wTpM 0H}&t^1'Oqr'2P͡+z,tIW''|en=ǳgRm[NStK{҉mؓVt6ҲR`ζN&}B	U(r<qȁVyrrA**دzg6D#	YP`vs~(zMle|uQa*}+T
RXc"+*NlNhcFt<N+;-}،Xtٕ$à^|uv*~'E_51qs*R`OΒ9#x449#WHۏZ)]0`p<ߝNoY{476ǹ>ۗ&1%Q''?l׸+&r{jN಻4)`N狌.߭ ǣ)q	2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~<v\	%,ߚ/pR~/^lnp
7t0_0l4_b0MWΦjmбɎl
+|re
ȫ`B-v.iRox}
+)%#`ЂR5CA2sua sYy3=jaeoI7~.plA΃
+`O)	^>Mz	+4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6G FZ)O	!lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5a v]m1+3 y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c-賟Lδ>]5.sYs1f0;'̨Yg銛{@9	`aC(=%bo2=n1	jBoS$n#m =i0ci9}oI	qT] W%.(؅]z\x
+f"]o'u䫵tk{v;A C3ֆwwR_#X(xҋ/q%Whpk_IX'b/fXKi"#####QCLi2t
5L 0
+QiH2;yTOok;עٶ`RNg{zy! Kxm?A(vU~mL(`o/!nmX-{v [ dw=n「sdwzn(}Oy~m
+?XU;, V'+V&JRZ]᧭:zC'-߆@y
4u`Vۓwъ#zP@Q
N>2/{\o) W~a3xLw
:_Q;=pּdt\'8~3SRP6y+XQ*޺r
+̗ѭ*޺r
+gl/\U^u$|mbVnw\V|D͊NVNy7 k<;/E}?E*ǳgO ~g/96f
+cD}%g$QG7o) UJo,O@0߾Q(;bw:5	NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 
+3
+u	Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s<uP    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_6da8d5_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_6da8d5_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_6da8d5_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_6da8d5_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,25 @@
+PNG
+
+   
IHDR         IJ   PLTElllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll#n   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  IDATx]b۶H儒-{iZK:glkn-tIqq?  E$dK>$>; PZ sVh!Sy0E0}H)-tkoܪKp\RϠ .E7
+)*V;~Pe
Bx*,=$zDؾ  JҸٻ 9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R 
HV!%;"
+i]dddddddd4y5 	Rb@(8CdŪݡ,@T@ibrq0alX!pe,	=4bW {
+5Ƭhu~(Q^@3="b5XC@JCT76q_5@,r	šɩD)T|O@
+ON-ՙ	[n@RXIm݋(F @?=0puL;g$@6η
+K`>п @h գKVn"a"%l@.v$/U^G:#`` uTtK~ŋZ5T%kxk]\*Q
,҇B44OXK|yg+_M(lоEO
+ V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V
+rh(]tI^}oצoS3	";ʙb}"߰	){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.} Q3.Nس} )>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa3	{oB
&<L[Nc.öi=` Q@d
+͆I.Il`\t[< Cit484-r+f쑱BCB MH	iy }>rxp|z;BǏ;burcK4tz1G~`ؚK|	̔>ۡO$~
+Ao)0pzz
+} i `;ADm8n:cfA@s7L  Z/..h8or?

N93B~o_'` opO-
:TG	L;7]`B%˛>*wTpM 0H}&t^1'Oqr'2P͡+z,tIW''|en=ǳgRm[NStK{҉mؓVt6ҲR`ζN&}B	U(r<qȁVyrrA**دzg6D#	YP`vs~(zMle|uQa*}+T
RXc"+*NlNhcFt<N+;-}،Xtٕ$à^|uv*~'E_51qs*R`OΒ9#x449#WHۏZ)]0`p<ߝNoY{476ǹ>ۗ&1%Q''?l׸+&r{jN಻4)`N狌.߭ ǣ)q	2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~<v\	%,ߚ/pR~/^lnp
7t0_0l4_b0MWΦjmбɎl
+|re
ȫ`B-v.iRox}
+)%#`ЂR5CA2sua sYy3=jaeoI7~.plA΃
+`O)	^>Mz	+4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6G FZ)O	!lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5a v]m1+3 y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c-賟Lδ>]5.sYs1f0;'̨Yg銛{@9	`aC(=%bo2=n1	jBoS$n#m =i0ci9}oI	qT] W%.(؅]z\x
+f"]o'u䫵tk{v;A C3ֆwwR_#X(xҋ/q%Whpk_IX'b/fXKi"#####QCLi2t
5L 0
+QiH2;yTOok;עٶ`RNg{zy! Kxm?A(vU~mL(`o/!nmX-{v [ dw=n「sdwzn(}Oy~m
+?XU;, V'+V&JRZ]᧭:zC'-߆@y
4u`Vۓwъ#zP@Q
N>2/{\o) W~a3xLw
:_Q;=pּdt\'8~3SRP6y+XQ*޺r
+̗ѭ*޺r
+gl/\U^u$|mbVnw\V|D͊NVNy7 k<;/E}?E*ǳgO ~g/96f
+cD}%g$QG7o) UJo,O@0߾Q(;bw:5	NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 
+3
+u	Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s<uP    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_cd0a0a_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_cd0a0a_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_cd0a0a_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_cd0a0a_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,105 @@
+PNG
+
+   
IHDR        Nzo   PLTE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fc   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  _IDATx]c۶JZgv,ٲ&{?:-[3Ү3q JOp tB	}6x9sSmCXȸR<QήF ?SHf+&ytSE-G8>Am٪d ~Z#sկ6'аfN(
0%#r(DXXKQL^J*KʱzTA~yd-TLieSS(Kň< bۜE%NS~._c$QUb=+C5>W-Z8BHؗ+$~ǫ+e9*9J*VDoq@.i
+ovR~SH6w_v
cU˂5y@~Rת#J9"!ꎾJ:d$.
3@nVew%w>#vSvᤵ#,e]Tq/|cթbfppߋbH1F S sL(?"#YP)C6C\$V-A$bߏ3R4m`G\~
+c:C.UasuC]7<e7,4	ʯUW-Cv7uT{%*9"VzOFU8ь) Y~+%X4STaWDSWeju^ѓIMg/_Moe"&~m '
+sOW7-;3xf7yr#C+9ckM].8qYd#R` kaU^k#/P?*u$~HY52֟^|b{|a,?kE/vkL? o=;dxlE{A:?aM2$GqB+hC>te_O8d0wPlE`
AAɂ[.zda VĀ#O4&k?V
+`]ْP#NJ7Ybe7,H[F24eYS ۉ|B&]KR˥ŶATS6?h{9"\vr9U{qvk/0W+?q"GW˨`wͤWAF-`a e]n"bMB]p+5޿
3G]SÎ.1Yax)Ã[<+>smT؆*sɴ,K۶\ij`erY 9yaЩ
+L|Ϟ)L[T7GRPP$/0*vStWFCE /2:htL?8;>l<Q7FvA@lˠUlF(t6? sS\ VOøvW"OУ
3u&Xzxv3\w?w?=2V\@%q@F[;U(
+R^8k?tKwJ(料͋t3T
K`k"B=(Y{"N|XH=P 22  }pw=l<]T-cH̍s&I	d<x1nͷp?5Q/^O<k-Ed:z/'<I=jZPs'AV-fT}G2v{,|XA6ANYɸBzٺr"VS@(|?@0:㊏;q;ճv
+.8of%zSROFFx&\8 wO(_G
+ؽ-?qwǏYG4T+N[>fYd 6ɩ}{ZiukDJӟS\^zL,uFtKyh}jdrf$3<A10ǟ{q>:Cd.Uٽ{AojRN	簐џQ	S /]VTq _G9sE$Zw a͏FUH#	e G1ZwV7>naO[+ʀ4HF^
׆ONfTpzaƀV@O//S]SύwxTnځZG#N"a]s՜X7
+`G{v´?VW_FYͩi+U'4V7%yT`뇪rXfOo@Ao>Wn2K*fǦMh:7 5M+ЏyN<ÊP	Lon>h:ǙvI~9畺K 5f
dķ c=8983K4jvyi|@v0cNv+̩1WrJ<=Qm[=(A3LJLX	H˦6:խziJc'f&Lt v}15|%۶%2oCm _x\c)VaF3<nF|wa
,~s Kp=Bb֊v91n%cNX8;T!C	7Ǎ0=vwOӡO?a1sx22az2p#O|@UTǝ`SM\7f~7
!`YQP2 Ac% TY {mWnA%D(q Qݤ]^JD`A0( xzA{,+z+
+`x<xޕ<>p[<o'
+av}fPK	@tâxfj8~?|hpP'222:^v2`v{'`	
^}9@#p=,'@HC~XHU0|bO∀|cp	=kcw*##㡣7K>oǽ$\FFO"vp30Fz8L&2pG>0V~XQO~!E
+0t${
+
+F0{F「{bZ),\(<`0o%JVA=#J֟߆L4  lO/ܫbĪ(X &ܮ`XZw222>*Dg)	0ݱ*ouJ(=M^ 8IV },f >+! >? @ejBD8pOagd|PTqg$Ǐ8i)s0,C~\:UV6U
+\`77`V1c@fN/ɪǿfPʃV]*hw. 藢{7iHu}Jn3@ veb d?wPyW˂ ErٵyI*RV 2~ET~=N8e!	*{,F-:.Yg (^!.j4^6Ե5o	B}|~[ 
];CU
+[R)aT>7/{Ky&Ϥ{QOy)#ârύ~a!&Wz
Z졽Tץ<vhA'^ٕg"ӖzT@zS2Z9}T Ua-HMN7*g1;nI
+fpBk%y!է#]@	X5BW@_aEW&u@ѨeCN絷6! dYGF'sÀrA/X&fӂXtV_B_Wo^-9
m)K-}Xl:}oBU;M8N)S_N]rdɕ/Nt3
_B
+gZz>Rҥ_s]4"oEDAwUT 8Hvo%sn\Hy$ȴ hz4qR;yu5:??@V'.vlcl77^WQgZ-&5_D ?1EBTNN	ٞqJ/{^b!#{ ~M{x/-Jn)Qljk=%46}t
+yX3KȊ7D:m{μ0-2TULPĆX@ ׎|M#D/vzXp< %#_%=/9(@C@	YMkf#-r@Cʭd8aG@ƌ< @޻@Fƃǃ~?llǆ/wlTLǆRnFWbA%Igש½'39R^MRV֡ UuC
+0i=YS}!uۖ,V/B5,
.C|r	Z^;0p&h"?ȏo7~olap,lr_UaFH\zh+G_mB[޶ CշjSz322`t裇:{GC@{E
+:\^	 
+?* ;ۢ9/BAo_
+@[@] Qlu f;s    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_d8e7f3_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_d8e7f3_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_d8e7f3_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_d8e7f3_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,25 @@
+PNG
+
+   
IHDR         IJ   PLTE&3   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  IDATx]b۶H儒-{iZK:glkn-tIqq?  E$dK>$>; PZ sVh!Sy0E0}H)-tkoܪKp\RϠ .E7
+)*V;~Pe
Bx*,=$zDؾ  JҸٻ 9{ ǸHpqW@"2'B[$ @TiH/b٥96!XHq`DE*R 
HV!%;"
+i]dddddddd4y5 	Rb@(8CdŪݡ,@T@ibrq0alX!pe,	=4bW {
+5Ƭhu~(Q^@3="b5XC@JCT76q_5@,r	šɩD)T|O@
+ON-ՙ	[n@RXIm݋(F @?=0puL;g$@6η
+K`>п @h գKVn"a"%l@.v$/U^G:#`` uTtK~ŋZ5T%kxk]\*Q
,҇B44OXK|yg+_M(lоEO
+ V$T1BXb-|?@ fBXr%'@ҹA\IJ,}BBc\V
+rh(]tI^}oצoS3	";ʙb}"߰	){b$Gwwݾab")T@pF_er6JvШ"mޭM-d76x˰6ӥ;/`>KrP\_^u1%OTM.} Q3.Nس} )>-w`a+sy$t)NbFFFFBejnNVn4,A*X*5>PGa3	{oB
&<L[Nc.öi=` Q@d
+͆I.Il`\t[< Cit484-r+f쑱BCB MH	iy }>rxp|z;BǏ;burcK4tz1G~`ؚK|	̔>ۡO$~
+Ao)0pzz
+} i `;ADm8n:cfA@s7L  Z/..h8or?

N93B~o_'` opO-
:TG	L;7]`B%˛>*wTpM 0H}&t^1'Oqr'2P͡+z,tIW''|en=ǳgRm[NStK{҉mؓVt6ҲR`ζN&}B	U(r<qȁVyrrA**دzg6D#	YP`vs~(zMle|uQa*}+T
RXc"+*NlNhcFt<N+;-}،Xtٕ$à^|uv*~'E_51qs*R`OΒ9#x449#WHۏZ)]0`p<ߝNoY{476ǹ>ۗ&1%Q''?l׸+&r{jN಻4)`N狌.߭ ǣ)q	2?n3Hb`} .`pqY1e_bu7e+N_F(DT,L}LLrmP5|x芥1cx DAb`M(7NED~<v\	%,ߚ/pR~/^lnp
7t0_0l4_b0MWΦjmбɎl
+|re
ȫ`B-v.iRox}
+)%#`ЂR5CA2sua sYy3=jaeoI7~.plA΃
+`O)	^>Mz	+4BXd.Mzv͈Pd8p<6?8N*x.6ڍ6G FZ)O	!lSshssNp8`'0/<s}.@Ǩs7ξO۟VDa5a v]m1+3 y6۠>@u50Ps51==p *KVҫ܂ݻc$N4(Xr2###c-賟Lδ>]5.sYs1f0;'̨Yg銛{@9	`aC(=%bo2=n1	jBoS$n#m =i0ci9}oI	qT] W%.(؅]z\x
+f"]o'u䫵tk{v;A C3ֆwwR_#X(xҋ/q%Whpk_IX'b/fXKi"#####QCLi2t
5L 0
+QiH2;yTOok;עٶ`RNg{zy! Kxm?A(vU~mL(`o/!nmX-{v [ dw=n「sdwzn(}Oy~m
+?XU;, V'+V&JRZ]᧭:zC'-߆@y
4u`Vۓwъ#zP@Q
N>2/{\o) W~a3xLw
:_Q;=pּdt\'8~3SRP6y+XQ*޺r
+̗ѭ*޺r
+gl/\U^u$|mbVnw\V|D͊NVNy7 k<;/E}?E*ǳgO ~g/96f
+cD}%g$QG7o) UJo,O@0߾Q(;bw:5	NwRN5Iy'K?}:9mֽ*@f@jU9mҫÍ{$ ؗ}dFp|%!DdF>}G{@FFFFFFƦQܞH 
+3
+u	Mo~vy}mwz<7nP9rWku=|_nz쿳}@IXn?s<uP    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_f9bd01_256x240.png 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_f9bd01_256x240.png
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/images/ui-icons_f9bd01_256x240.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/images/ui-icons_f9bd01_256x240.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+PNG
+
+   
IHDR        Nzo   PLTEmGR   NtRNS 2P."Tp@f` <BHJZ&0R,4j8D|($
+blߝF>n~hhH  _IDATx]c۶JZgv,ٲ&{?:-[3Ү3q JOp tB	}6x9sSmCXȸR<QήF ?SHf+&ytSE-G8>Am٪d ~Z#sկ6'аfN(
0%#r(DXXKQL^J*KʱzTA~yd-TLieSS(Kň< bۜE%NS~._c$QUb=+C5>W-Z8BHؗ+$~ǫ+e9*9J*VDoq@.i
+ovR~SH6w_v
cU˂5y@~Rת#J9"!ꎾJ:d$.
3@nVew%w>#vSvᤵ#,e]Tq/|cթbfppߋbH1F S sL(?"#YP)C6C\$V-A$bߏ3R4m`G\~
+c:C.UasuC]7<e7,4	ʯUW-Cv7uT{%*9"VzOFU8ь) Y~+%X4STaWDSWeju^ѓIMg/_Moe"&~m '
+sOW7-;3xf7yr#C+9ckM].8qYd#R` kaU^k#/P?*u$~HY52֟^|b{|a,?kE/vkL? o=;dxlE{A:?aM2$GqB+hC>te_O8d0wPlE`
AAɂ[.zda VĀ#O4&k?V
+`]ْP#NJ7Ybe7,H[F24eYS ۉ|B&]KR˥ŶATS6?h{9"\vr9U{qvk/0W+?q"GW˨`wͤWAF-`a e]n"bMB]p+5޿
3G]SÎ.1Yax)Ã[<+>smT؆*sɴ,K۶\ij`erY 9yaЩ
+L|Ϟ)L[T7GRPP$/0*vStWFCE /2:htL?8;>l<Q7FvA@lˠUlF(t6? sS\ VOøvW"OУ
3u&Xzxv3\w?w?=2V\@%q@F[;U(
+R^8k?tKwJ(料͋t3T
K`k"B=(Y{"N|XH=P 22  }pw=l<]T-cH̍s&I	d<x1nͷp?5Q/^O<k-Ed:z/'<I=jZPs'AV-fT}G2v{,|XA6ANYɸBzٺr"VS@(|?@0:㊏;q;ճv
+.8of%zSROFFx&\8 wO(_G
+ؽ-?qwǏYG4T+N[>fYd 6ɩ}{ZiukDJӟS\^zL,uFtKyh}jdrf$3<A10ǟ{q>:Cd.Uٽ{AojRN	簐џQ	S /]VTq _G9sE$Zw a͏FUH#	e G1ZwV7>naO[+ʀ4HF^
׆ONfTpzaƀV@O//S]SύwxTnځZG#N"a]s՜X7
+`G{v´?VW_FYͩi+U'4V7%yT`뇪rXfOo@Ao>Wn2K*fǦMh:7 5M+ЏyN<ÊP	Lon>h:ǙvI~9畺K 5f
dķ c=8983K4jvyi|@v0cNv+̩1WrJ<=Qm[=(A3LJLX	H˦6:խziJc'f&Lt v}15|%۶%2oCm _x\c)VaF3<nF|wa
,~s Kp=Bb֊v91n%cNX8;T!C	7Ǎ0=vwOӡO?a1sx22az2p#O|@UTǝ`SM\7f~7
!`YQP2 Ac% TY {mWnA%D(q Qݤ]^JD`A0( xzA{,+z+
+`x<xޕ<>p[<o'
+av}fPK	@tâxfj8~?|hpP'222:^v2`v{'`	
^}9@#p=,'@HC~XHU0|bO∀|cp	=kcw*##㡣7K>oǽ$\FFO"vp30Fz8L&2pG>0V~XQO~!E
+0t${
+
+F0{F「{bZ),\(<`0o%JVA=#J֟߆L4  lO/ܫbĪ(X &ܮ`XZw222>*Dg)	0ݱ*ouJ(=M^ 8IV },f >+! >? @ejBD8pOagd|PTqg$Ǐ8i)s0,C~\:UV6U
+\`77`V1c@fN/ɪǿfPʃV]*hw. 藢{7iHu}Jn3@ veb d?wPyW˂ ErٵyI*RV 2~ET~=N8e!	*{,F-:.Yg (^!.j4^6Ե5o	B}|~[ 
];CU
+[R)aT>7/{Ky&Ϥ{QOy)#ârύ~a!&Wz
Z졽Tץ<vhA'^ٕg"ӖzT@zS2Z9}T Ua-HMN7*g1;nI
+fpBk%y!է#]@	X5BW@_aEW&u@ѨeCN絷6! dYGF'sÀrA/X&fӂXtV_B_Wo^-9
m)K-}Xl:}oBU;M8N)S_N]rdɕ/Nt3
_B
+gZz>Rҥ_s]4"oEDAwUT 8Hvo%sn\Hy$ȴ hz4qR;yu5:??@V'.vlcl77^WQgZ-&5_D ?1EBTNN	ٞqJ/{^b!#{ ~M{x/-Jn)Qljk=%46}t
+yX3KȊ7D:m{μ0-2TULPĆX@ ׎|M#D/vzXp< %#_%=/9(@C@	YMkf#-r@Cʭd8aG@ƌ< @޻@Fƃǃ~?llǆ/wlTLǆRnFWbA%Igש½'39R^MRV֡ UuC
+0i=YS}!uۖ,V/B5,
.C|r	Z^;0p&h"?ȏo7~olap,lr_UaFH\zh+G_mB[޶ CշjSz322`t裇:{GC@{E
+:\^	 
+?* ;ۢ9/BAo_
+@[@] Qlu f;s    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/jquery/ui/redmond/jquery-ui-1.8.6.css 2.3.1.src/ext/jquery/ui/redmond/jquery-ui-1.8.6.css
--- 2.2rc2a.cp.src/ext/jquery/ui/redmond/jquery-ui-1.8.6.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/jquery/ui/redmond/jquery-ui-1.8.6.css	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,572 @@
+/*
+ * jQuery UI CSS Framework 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; }
+.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-right {  -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }/*
+ * jQuery UI Autocomplete 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/chronopay/callback.php 2.3.1.src/ext/modules/payment/chronopay/callback.php
--- 2.2rc2a.cp.src/ext/modules/payment/chronopay/callback.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/chronopay/callback.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: callback.php 1808 2008-01-13 03:56:36Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/inpay/inpay_functions.php 2.3.1.src/ext/modules/payment/inpay/inpay_functions.php
--- 2.2rc2a.cp.src/ext/modules/payment/inpay/inpay_functions.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/inpay/inpay_functions.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,93 @@
+<?php 
+	
+/*
+ $Id: inpay_functions.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+	
+    	
+/* Ensure the http_build_query is defined */
+
+if (!function_exists('http_build_query')) { 
+    function http_build_query($data, $prefix='', $sep='', $key='') { 
+        $ret = array(); 
+        foreach ((array)$data as $k => $v) { 
+            if (is_int($k) && $prefix != null) { 
+                $k = urlencode($prefix . $k); 
+            } 
+            if ((!empty($key)) || ($key === 0))  $k = $key.'['.urlencode($k).']'; 
+            if (is_array($v) || is_object($v)) { 
+                array_push($ret, http_build_query($v, '', $sep, $k)); 
+            } else { 
+                array_push($ret, $k.'='.urlencode($v)); 
+            } 
+        } 
+        if (empty($sep)) $sep = ini_get('arg_separator.output'); 
+        return implode($sep, $ret); 
+    }// http_build_query 
+}//if 
+
+function get_invoice_status($pars) {
+    //
+    // prepare parameters
+    //
+    $calc_md5 = calc_inpay_invoice_status_md5key($pars);
+    $q = http_build_query(array("merchant_id"=>MODULE_PAYMENT_INPAY_MERCHANT_ID, "invoice_ref"=>$pars['invoice_reference'], "checksum"=>$calc_md5), "", "&");
+    //
+    // communicate to inpay server
+    //
+    $fsocket = false;
+    $curl = false;
+    $result = false;
+	$fp = false;
+    $server = 'secure.inpay.com';
+    if (MODULE_PAYMENT_INPAY_GATEWAY_SERVER != 'Production') {
+        $server = 'test-secure.inpay.com';
+    }
+    
+    if ((PHP_VERSION >= 4.3) && ($fp = @fsockopen('ssl://'.$server, 443, $errno, $errstr, 30))) {
+        $fsocket = true;
+    } elseif (function_exists('curl_exec')) {
+        $curl = true;
+    }
+    if ($fsocket == true) {
+        $header = 'POST /api/get_invoice_status HTTP/1.1'."\r\n".
+		'Host: '.$server."\r\n".
+		'Content-Type: application/x-www-form-urlencoded'."\r\n".
+		'Content-Length: '.strlen($q)."\r\n".
+		'Connection: close'."\r\n\r\n";
+		@fputs($fp, $header.$q);
+        $str = '';
+        while (!@feof($fp)) {
+            $res = @fgets($fp, 1024);
+            $str .= (string)$res;
+        }
+		@fclose($fp);
+		$result=$str;
+		$result = preg_split('/^\r?$/m', $result, 2);
+        $result = trim($result[1]);
+    } elseif ($curl == true) {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, 'https://'.$server.'/api/get_invoice_status');
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $q);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        $result = curl_exec($ch);
+        curl_close($ch);
+    }
+    return (string)$result;
+}
+
+function calc_inpay_invoice_status_md5key($pars) {
+    $q = http_build_query(array("invoice_ref"=>$pars['invoice_reference'], "merchant_id"=>MODULE_PAYMENT_INPAY_MERCHANT_ID,
+	 "secret_key"=>MODULE_PAYMENT_INPAY_SECRET_KEY), "", "&");
+    $md5v = md5($q);
+    return $md5v;
+}
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/inpay/pb_handler.php 2.3.1.src/ext/modules/payment/inpay/pb_handler.php
--- 2.2rc2a.cp.src/ext/modules/payment/inpay/pb_handler.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/inpay/pb_handler.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,387 @@
+<?php
+/*
+ $Id: pb_handler.php VER: 1.0.3414 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+chdir('../../../../');
+require ('includes/application_top.php');
+reset($HTTP_POST_VARS);
+$result = "VERIFIED";
+$ok = true;
+$my_order = null;
+$my_order_query = null;
+//*************************************
+// Validate request
+//
+if (! isset ($HTTP_POST_VARS['order_id']) || !is_numeric($HTTP_POST_VARS['order_id']) || ($HTTP_POST_VARS['order_id'] <= 0))
+{
+    $ok = false;
+    $result = "bad order id";
+}
+if ($ok)
+{
+    if (! isset ($HTTP_POST_VARS["invoice_amount"]))
+    {
+        $ok = false;
+        $result = "bad amount";
+    }
+}
+if ($ok)
+{
+    if (! isset ($HTTP_POST_VARS["invoice_currency"]))
+    {
+        $ok = false;
+        $result = "bad currency";
+    }
+}
+if ($ok)
+{
+    if (! isset ($HTTP_POST_VARS["checksum"]) || ! isset ($HTTP_POST_VARS["invoice_reference"]) || ! isset ($HTTP_POST_VARS["invoice_created_at"]) || ! isset ($HTTP_POST_VARS["invoice_status"]))
+    {
+        $ok = false;
+        $result = "missing vatiables";
+    }
+}
+if ($ok)
+{
+    //
+    // calc checksum
+    //
+    $sk = MODULE_PAYMENT_INPAY_SECRET_KEY;
+    $q = http_build_query( array (
+    "order_id"=>$HTTP_POST_VARS['order_id'],
+    "invoice_reference"=>$HTTP_POST_VARS['invoice_reference'],
+    "invoice_amount"=>$HTTP_POST_VARS['invoice_amount'],
+    "invoice_currency"=>$HTTP_POST_VARS['invoice_currency'],
+    "invoice_created_at"=>$HTTP_POST_VARS['invoice_created_at'],
+    "invoice_status"=>$HTTP_POST_VARS['invoice_status'],
+    "secret_key"=>$sk), "", "&");
+    $md5v = md5($q);
+    if ($md5v != $HTTP_POST_VARS["checksum"])
+    {
+        $ok = false;
+        $result = "bad checksum";
+    }
+}
+if ($ok)
+{
+    $my_order_query = tep_db_query("select orders_status, currency, currency_value from ".TABLE_ORDERS." where orders_id = '".$HTTP_POST_VARS['order_id']."'"); // TODO: fix PB to add all params"' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+    if (tep_db_num_rows($my_order_query) <= 0)
+    {
+        $ok = false;
+        $result = "order not found";
+    }
+}
+if ($ok)
+{
+    $my_order = tep_db_fetch_array($my_order_query);
+    $order = $my_order;
+    $total_query = tep_db_query("select value from ".TABLE_ORDERS_TOTAL." where orders_id = '".$HTTP_POST_VARS['order_id']."' and class = 'ot_total' limit 1");
+    $total = tep_db_fetch_array($total_query);
+    if (number_format($HTTP_POST_VARS['invoice_amount'], $currencies->get_decimal_places($order['currency'])) != number_format($total['value']*$order['currency_value'], $currencies->get_decimal_places($order['currency'])))
+    {
+        $ok = false;
+        $result = 'Inpay transaction value ('.tep_output_string_protected($HTTP_POST_VARS['invoice_amount']).') does not match order value ('.number_format($total['value']*$order['currency_value'], $currencies->get_decimal_places($order['currency'])).')';
+    }
+}
+if ($ok)
+{
+    //
+    // check status
+    //
+    $order = $my_order;
+    $delivered_status = 3;
+    if (($order['orders_status'] == MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID) || ($order['orders_status'] == $delivered_status))
+    {
+        $ok = false;
+        $result = 'Status already in level'.$order['orders_status'];
+    }
+}
+if ($ok) {
+    require_once ('inpay_functions.php');
+    $invoice_status = get_invoice_status($HTTP_POST_VARS);
+    $ok = false;
+    if ((($invoice_status == "pending")||($invoice_status == "created"))&&(($HTTP_POST_VARS["invoice_status"] == "pending")||($HTTP_POST_VARS["invoice_status"] == "created"))) {
+        $ok = true;
+    } else if (($invoice_status == "approved") && ($HTTP_POST_VARS["invoice_status"] == "approved")) {
+        $ok = true;
+    } else if (($invoice_status == "sum_too_low") && ($HTTP_POST_VARS["invoice_status"] == "sum_too_low")) {
+        $ok = true;
+    }
+	if (!$ok)
+	{
+		$result = "Bad invoice status:".$invoice_status;
+	}
+}
+
+//
+// Validate request end
+//************************************
+if ($result == 'VERIFIED')
+{
+    $order = $my_order;
+    $order_status_id = DEFAULT_ORDERS_STATUS_ID;
+    $invoice_approved = false;
+    switch($HTTP_POST_VARS["invoice_status"])
+    {
+        case "created":
+        case "pending":
+            $msg = "customer has been asked to pay ".$HTTP_POST_VARS['invoice_amount']." ".$HTTP_POST_VARS['invoice_currency']." with reference: ".$HTTP_POST_VARS["invoice_reference"]. " via his online bank";
+            $order_status_id = MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID;
+            break;
+        case "approved":
+            $msg = "Inpay has confimed that the payment of ".$HTTP_POST_VARS['invoice_amount']." ".$HTTP_POST_VARS['invoice_currency']." has been received";
+            $order_status_id = MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID;
+            $invoice_approved = true;
+            break;
+        case "sum_too_low":
+            $msg = "Partial payment received by inpay. Reference: ".$HTTP_POST_VARS["invoice_reference"];
+            $order_status_id = MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID;
+            break;
+    }
+    $comment_status .= $msg." ;";
+    $customer_notified = '0';
+    //
+    // update order status
+    //
+    $sql_data_array = array ('orders_id'=>$HTTP_POST_VARS['order_id'],
+    'orders_status_id'=>$order_status_id,
+    'date_added'=>'now()',
+    'customer_notified'=>$customer_notified,
+    'comments'=>'Inpay '.ucfirst($HTTP_POST_VARS['invoice_status']).'['.$comment_status.']');
+    tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+    tep_db_query("update ".TABLE_ORDERS." set orders_status = '".$order_status_id."', last_modified = now() where orders_id = '".(int)$HTTP_POST_VARS['order_id']."'");
+    if ($invoice_approved)
+    {
+    	// for email
+		include(DIR_WS_LANGUAGES . $language . '/modules/payment/inpay.php');
+        // let's re-create the required arrays
+        require (DIR_WS_CLASSES.'order.php');
+        $order = new order($HTTP_POST_VARS['order_id']);
+        // START STATUS == COMPLETED LOOP
+        // initialized for the email confirmation
+        $products_ordered = '';
+        $total_tax = 0;
+
+        // let's update the stock
+        // #######################################################
+        for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+        { // PRODUCT LOOP STARTS HERE
+            // Stock Update - Joao Correia
+            if ((MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION=='False') && (STOCK_LIMITED == 'true'))
+            {
+                if (DOWNLOAD_ENABLED == 'true')
+                {
+                    $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename 
+                                    FROM ".TABLE_PRODUCTS." p
+                                    LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES." pa
+                                    ON p.products_id=pa.products_id
+                                    LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+                                    ON pa.products_attributes_id=pad.products_attributes_id
+                                    WHERE p.products_id = '".tep_get_prid($order->products[$i]['id'])."'";
+                    // Will work with only one option for downloadable products
+                    // otherwise, we have to build the query dynamically with a loop
+                    $products_attributes = $order->products[$i]['attributes'];
+                    if (is_array($products_attributes))
+                    {
+                        $stock_query_raw .= " AND pa.options_id = '".$products_attributes[0]['option_id']."' AND pa.options_values_id = '".$products_attributes[0]['value_id']."'";
+                    }
+                    $stock_query = tep_db_query($stock_query_raw);
+                } else
+                {
+                    $stock_query = tep_db_query("select products_quantity from ".TABLE_PRODUCTS." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                }
+                if (tep_db_num_rows($stock_query) > 0)
+                {
+                    $stock_values = tep_db_fetch_array($stock_query);
+                    // do not decrement quantities if products_attributes_filename exists
+                    if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename']))
+                    {
+                        $stock_left = $stock_values['products_quantity']-$order->products[$i]['qty'];
+                    } else
+                    {
+                        $stock_left = $stock_values['products_quantity'];
+                    }
+                    tep_db_query("update ".TABLE_PRODUCTS." set products_quantity = '".$stock_left."' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                    if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false'))
+                    {
+                        tep_db_query("update ".TABLE_PRODUCTS." set products_status = '0' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                    }
+                }
+            } // decrease stock end
+
+            // Update products_ordered (for bestsellers list)
+            tep_db_query("update ".TABLE_PRODUCTS." set products_ordered = products_ordered + ".sprintf('%d', $order->products[$i]['qty'])." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+
+            // Let's get all the info together for the email
+            $total_weight += ($order->products[$i]['qty']*$order->products[$i]['weight']);
+            $total_tax += tep_calculate_tax($total_products_price, $products_tax)*$order->products[$i]['qty'];
+            $total_cost += $total_products_price;
+
+            // Let's get the attributes
+            $products_ordered_attributes = '';
+            if (( isset ($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0))
+            {
+                for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+                {
+                    $products_ordered_attributes .= "\n\t".$order->products[$i]['attributes'][$j]['option'].' '.$order->products[$i]['attributes'][$j]['value'];
+                }
+            }
+
+            // Let's format the products model
+            $products_model = '';
+            if (! empty($order->products[$i]['model']))
+            {
+                $products_model = ' ('.$order->products[$i]['model'].')';
+            }
+
+            // Let's put all the product info together into a string
+            $products_ordered .= $order->products[$i]['qty'].' x '.$order->products[$i]['name'].$products_model.' = '.$currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']).$products_ordered_attributes."\n";
+        } // PRODUCT LOOP ENDS HERE
+        #######################################################
+
+        // lets start with the email confirmation
+        // BOF content type fix by AlexStudio
+        $content_type = '';
+        $content_count = 0;
+        // BOF order comment fix
+        $comment_query = tep_db_query("select comments from ".TABLE_ORDERS_STATUS_HISTORY." where orders_id = '".$HTTP_POST_VARS['order_id']."'");
+        $comment_array = tep_db_fetch_array($comment_query);
+        $comments = $comment_array['comments'];
+        // EOF order comment fix
+
+        if (DOWNLOAD_ENABLED == 'true')
+        {
+            $content_query = tep_db_query("select * from ".TABLE_ORDERS_PRODUCTS_DOWNLOAD." where orders_id = '".(int)$HTTP_POST_VARS['order_id']."'");
+            $content_count = tep_db_num_rows($content_query);
+            if ($content_count > 0)
+            {
+                $content_type = 'virtual';
+            }
+        }
+        switch($content_type)
+        {
+            case 'virtual':
+                if ($content_count != sizeof($order->products))$content_type = 'mixed';
+                break;
+            default:
+                $content_type = 'physical';
+                break;
+        }
+        // EOF content type fix by AlexStudio
+        // $order variables have been changed from checkout_process to work with the variables from the function query () instead of cart () in the order class
+        $email_order = STORE_NAME."\n".
+        EMAIL_SEPARATOR."\n".
+        EMAIL_TEXT_ORDER_NUMBER.' '.$HTTP_POST_VARS['order_id']."\n".
+        EMAIL_TEXT_INVOICE_URL.' '.tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id='.$HTTP_POST_VARS['order_id'], 'SSL', false)."\n".
+        EMAIL_TEXT_DATE_ORDERED.' '.strftime(DATE_FORMAT_LONG)."\n\n";
+        // BOF order comment fix by AlexStudio
+        if ($comments)
+        {
+            // do not add comments
+			// $email_order .= $comments."\n\n";
+        }
+        // EOF order comment fix by AlexStudio
+        
+        $email_order .= EMAIL_TEXT_PRODUCTS."\n".
+        EMAIL_SEPARATOR."\n".
+        $products_ordered.
+        EMAIL_SEPARATOR."\n";
+
+        for ($i = 0, $n = sizeof($order->totals); $i < $n; $i++)
+        {
+            $email_order .= strip_tags($order->totals[$i]['title']).' '.strip_tags($order->totals[$i]['text'])."\n";
+        }
+        // BOF content type fix by AlexStudio
+        if ($content_type != 'virtual')
+        {
+            // EOF content type fix by AlexStudio
+            $email_order .= "\n".EMAIL_TEXT_DELIVERY_ADDRESS."\n".
+            EMAIL_SEPARATOR."\n".
+            tep_address_format($order->delivery['format_id'], $order->delivery, 0, '', "\n")."\n";
+        }
+
+        $email_order .= "\n".EMAIL_TEXT_BILLING_ADDRESS."\n".
+        EMAIL_SEPARATOR."\n".
+        tep_address_format($order->billing['format_id'], $order->billing, 0, '', "\n")."\n\n";
+        if (is_object($$payment))
+        {
+            $email_order .= EMAIL_TEXT_PAYMENT_METHOD."\n".
+            EMAIL_SEPARATOR."\n";
+            $payment_class = $$payment;
+            $email_order .= $payment_class->title."\n\n";
+            if ($payment_class->email_footer)
+            {
+                $email_order .= $payment_class->email_footer."\n\n";
+            }
+        }
+        tep_mail($order->customer['name'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, nl2br($email_order), STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+
+        // send emails to other people
+        if (SEND_EXTRA_ORDER_EMAILS_TO != '')
+        {
+            tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, nl2br($email_order), STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+        }
+    } // END oreder approved LOOP
+
+
+
+} else
+{
+    //
+    // Invalid result
+    //
+    //
+    // send warning email
+    //
+    if (tep_not_null(MODULE_PAYMENT_INPAY_DEBUG_EMAIL))
+    {
+        $email_body = '$HTTP_POST_VARS:'."\n\n";
+
+        reset($HTTP_POST_VARS);
+        while ( list ($key, $value) = each($HTTP_POST_VARS))
+        {
+            $email_body .= $key.'='.$value."\n";
+        }
+
+        $email_body .= "\n".'$HTTP_GET_VARS:'."\n\n";
+
+        reset($HTTP_GET_VARS);
+        while ( list ($key, $value) = each($HTTP_GET_VARS))
+        {
+            $email_body .= $key.'='.$value."\n";
+        }
+
+        tep_mail('', MODULE_PAYMENT_INPAY_DEBUG_EMAIL, 'Inpay Invalid Process', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+    }
+    //
+    // add error message to history if order can be found
+    //
+    if ( isset ($HTTP_POST_VARS['order_id']) && is_numeric($HTTP_POST_VARS['order_id']) && ($HTTP_POST_VARS['order_id'] > 0))
+    {
+        $check_query = tep_db_query("select orders_id from ".TABLE_ORDERS." where orders_id = '".$HTTP_POST_VARS['order_id']."'"); //TODO: fix custom "' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+        $order_status_id = $order['orders_status'];
+		if (($order_status_id==null)||($order['orders_status']=='')){
+		  $order_status_id = DEFAULT_ORDERS_STATUS_ID;
+		}
+        if (tep_db_num_rows($check_query) > 0)
+        {
+            $comment_status = $result;
+            //tep_db_query("update ".TABLE_ORDERS." set orders_status = '".((MODULE_PAYMENT_INPAY_ORDER_STATUS_ID > 0)?MODULE_PAYMENT_INPAY_ORDER_STATUS_ID:DEFAULT_ORDERS_STATUS_ID)."', last_modified = now() where orders_id = '".$HTTP_POST_VARS['order_id']."'");
+            $sql_data_array = array ('orders_id'=>$HTTP_POST_VARS['order_id'],
+            'orders_status_id'=>$order_status_id,
+            'date_added'=>'now()',
+            'customer_notified'=>'0',
+            'comments'=>'Inpay Invalid ['.$comment_status.']');
+            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+        }
+    }
+}
+
+require ('includes/application_bottom.php');
+
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_cc.php 2.3.1.src/ext/modules/payment/ipayment/callback_cc.php
--- 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_cc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/ipayment/callback_cc.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,38 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/ipayment_cc.php');
+  require('includes/modules/payment/ipayment_cc.php');
+  $ipayment_cc = new ipayment_cc();
+
+  if (!$ipayment_cc->check() || !$ipayment_cc->enabled) {
+    exit;
+  }
+
+  if (in_array(tep_get_ip_address(), $ipayment_cc->gateway_addresses)) {
+    $checksum_pass = 0; // unknown
+
+    if (tep_not_null(MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
+// verify ret_param_checksum
+      if ($HTTP_POST_VARS['ret_param_checksum'] == md5(MODULE_PAYMENT_IPAYMENT_CC_USER_ID . $HTTP_POST_VARS['trx_amount'] . $HTTP_POST_VARS['trx_currency'] . $HTTP_POST_VARS['ret_authcode'] . $HTTP_POST_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
+        $checksum_pass = 1; // true
+      } else {
+        $checksum_pass = -1; // false
+      }
+    }
+
+    $ipayment_cc->sendDebugEmail($checksum_pass);
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_elv.php 2.3.1.src/ext/modules/payment/ipayment/callback_elv.php
--- 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_elv.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/ipayment/callback_elv.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,38 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/ipayment_elv.php');
+  require('includes/modules/payment/ipayment_elv.php');
+  $ipayment_elv = new ipayment_elv();
+
+  if (!$ipayment_elv->check() || !$ipayment_elv->enabled) {
+    exit;
+  }
+
+  if (in_array(tep_get_ip_address(), $ipayment_elv->gateway_addresses)) {
+    $checksum_pass = 0; // unknown
+
+    if (tep_not_null(MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+// verify ret_param_checksum
+      if ($HTTP_POST_VARS['ret_param_checksum'] == md5(MODULE_PAYMENT_IPAYMENT_ELV_USER_ID . $HTTP_POST_VARS['trx_amount'] . $HTTP_POST_VARS['trx_currency'] . $HTTP_POST_VARS['ret_authcode'] . $HTTP_POST_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+        $checksum_pass = 1; // true
+      } else {
+        $checksum_pass = -1; // false
+      }
+    }
+
+    $ipayment_elv->sendDebugEmail($checksum_pass);
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_pp.php 2.3.1.src/ext/modules/payment/ipayment/callback_pp.php
--- 2.2rc2a.cp.src/ext/modules/payment/ipayment/callback_pp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/ipayment/callback_pp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,38 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/ipayment_pp.php');
+  require('includes/modules/payment/ipayment_pp.php');
+  $ipayment_pp = new ipayment_pp();
+
+  if (!$ipayment_pp->check() || !$ipayment_pp->enabled) {
+    exit;
+  }
+
+  if (in_array(tep_get_ip_address(), $ipayment_pp->gateway_addresses)) {
+    $checksum_pass = 0; // unknown
+
+    if (tep_not_null(MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+// verify ret_param_checksum
+      if ($HTTP_POST_VARS['ret_param_checksum'] == md5(MODULE_PAYMENT_IPAYMENT_PP_USER_ID . $HTTP_POST_VARS['trx_amount'] . $HTTP_POST_VARS['trx_currency'] . $HTTP_POST_VARS['ret_authcode'] . $HTTP_POST_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+        $checksum_pass = 1; // true
+      } else {
+        $checksum_pass = -1; // false
+      }
+    }
+
+    $ipayment_pp->sendDebugEmail($checksum_pass);
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/callback.php 2.3.1.src/ext/modules/payment/moneybookers/callback.php
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/callback.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/callback.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,83 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+  if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS') || (MODULE_PAYMENT_MONEYBOOKERS_STATUS  != 'True')) {
+    exit;
+  }
+
+  $pass = false;
+
+  if (isset($HTTP_POST_VARS['transaction_id']) && is_numeric($HTTP_POST_VARS['transaction_id']) && ($HTTP_POST_VARS['transaction_id'] > 0)) {
+    if ($HTTP_POST_VARS['md5sig'] == strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_MERCHANT_ID . $HTTP_POST_VARS['transaction_id'] . strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD)) . $HTTP_POST_VARS['mb_amount'] . $HTTP_POST_VARS['mb_currency'] . $HTTP_POST_VARS['status']))) {
+      $order_query = tep_db_query("select orders_status, currency, currency_value from " . TABLE_ORDERS . " where orders_id = '" . $HTTP_POST_VARS['transaction_id'] . "' and customers_id = '" . (int)$HTTP_POST_VARS['osc_custid'] . "'");
+      if (tep_db_num_rows($order_query) > 0) {
+        $pass = true;
+
+        $order = tep_db_fetch_array($order_query);
+
+        $status = $HTTP_POST_VARS['status'];
+        switch ($HTTP_POST_VARS['status']) {
+          case '2':
+            $status = 'Processed';
+            break;
+          case '0':
+            $status = 'Pending';
+            break;
+          case '-1':
+            $status = 'Cancelled';
+            break;
+          case '-2':
+            $status = 'Failed';
+            break;
+          case '-3':
+            $status = 'Chargeback';
+            break;
+        }
+
+        $comment_status = $status . ' (' . $currencies->format($HTTP_POST_VARS['amount'], false, $HTTP_POST_VARS['currency']) . ')';
+
+        $sql_data_array = array('orders_id' => $HTTP_POST_VARS['transaction_id'],
+                                'orders_status_id' => (MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID),
+                                'date_added' => 'now()',
+                                'customer_notified' => '0',
+                                'comments' => 'Moneybookers Verified [' . $comment_status . ']');
+
+        tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+      }
+    }
+  }
+
+  if (($pass == false) && tep_not_null(MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL)) {
+    $email_body = 'IP Address: ' . tep_get_ip_address() . "\n\n" .
+                  'MD5: ' . strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_MERCHANT_ID . (isset($HTTP_POST_VARS['transaction_id']) ? $HTTP_POST_VARS['transaction_id'] : '') . strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD)) . (isset($HTTP_POST_VARS['mb_amount']) ? $HTTP_POST_VARS['mb_amount'] : '') . (isset($HTTP_POST_VARS['mb_currency']) ? $HTTP_POST_VARS['mb_currency'] : '') . (isset($HTTP_POST_VARS['status']) ? $HTTP_POST_VARS['status'] : ''))) . "\n\n" .
+                  '$HTTP_POST_VARS:' . "\n\n";
+
+    reset($HTTP_POST_VARS);
+    while (list($key, $value) = each($HTTP_POST_VARS)) {
+      $email_body .= $key . '=' . $value . "\n";
+    }
+
+    $email_body .= "\n" . '$HTTP_GET_VARS:' . "\n\n";
+
+    reset($HTTP_GET_VARS);
+    while (list($key, $value) = each($HTTP_GET_VARS)) {
+      $email_body .= $key . '=' . $value . "\n";
+    }
+
+    tep_mail('', MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL, 'Moneybookers Invalid Process', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+  }
+
+  require('includes/application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/checkout.php 2.3.1.src/ext/modules/payment/moneybookers/checkout.php
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/checkout.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/checkout.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,104 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+// if the customer is not logged on, redirect them to the login page
+  if (!tep_session_is_registered('customer_id')) {
+    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
+    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+  }
+
+// if there is nothing in the customers cart, redirect them to the shopping cart page
+  if ($cart->count_contents() < 1) {
+    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+  }
+
+// avoid hack attempts during the checkout procedure by checking the internal cartID
+  if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
+    if ($cart->cartID != $cartID) {
+      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+    }
+  }
+
+// if no shipping method has been selected, redirect the customer to the shipping method selection page
+  if (!tep_session_is_registered('shipping')) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+  }
+
+  if (!tep_session_is_registered('payment') || (substr($payment, 0, 12) != 'moneybookers')) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
+  }
+
+// load the selected payment module
+  require(DIR_WS_CLASSES . 'payment.php');
+  $payment_modules = new payment($payment);
+
+  require(DIR_WS_CLASSES . 'order.php');
+  $order = new order;
+
+  $payment_modules->update_status();
+
+  if ( ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(ERROR_NO_PAYMENT_MODULE_SELECTED), 'SSL'));
+  }
+
+  if (is_array($payment_modules->modules)) {
+    $payment_modules->pre_confirmation_check();
+  }
+
+// load the selected shipping module
+  require(DIR_WS_CLASSES . 'shipping.php');
+  $shipping_modules = new shipping($shipping);
+
+  require(DIR_WS_CLASSES . 'order_total.php');
+  $order_total_modules = new order_total;
+  $order_total_modules->process();
+
+// Stock Check
+  $any_out_of_stock = false;
+  if (STOCK_CHECK == 'true') {
+    for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+      if (tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) {
+        $any_out_of_stock = true;
+      }
+    }
+    // Out of Stock
+    if ( (STOCK_ALLOW_CHECKOUT != 'true') && ($any_out_of_stock == true) ) {
+      tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+    }
+  }
+
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_CONFIRMATION);
+
+  $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+  $breadcrumb->add(NAVBAR_TITLE_2);
+
+  $iframe_url = 'https://www.moneybookers.com/app/payment.pl?sid=' . $HTTP_POST_VARS['sid'];
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+    <table border="0" width="100%" cellspacing="0" cellpadding="0">
+      <tr>
+        <td>
+          <iframe src="<?php echo $iframe_url; ?>" width="100%" height="600" frameborder="0">
+            <p>Your browser does not support iframes.</p>
+          </iframe>
+        </td>
+      </tr>
+    </table>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/4b.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/4b.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/4b.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/4b.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+GIF89aZ -  )/5;``#
A
+
+RMdIH[XT$ö 31<kg1MMhSOkKKcDDO?;2JG(PM:GGWRO@FFSSOhJJ_TQp=:-요5HF$:6#PJX:8%oj3ŷwo,(}tLH2#QL`̾ 	QK\줘
@DA8%$5CCN)&A=7
! 6+(NI".ONl;OIW*CCMLLg5KKd
+210RNdPLf53?=>B>7VP*7GD538HH]=;8"$86 A=/PJY97.
+
+"DDNRM`=;/II\2NIW%$+HH[OKb?;SPnLG$-RNg<8QK]FFYJF&ID";8(URt^Z2#KI-OIX%; 
TQo JJ`>:
+A="

#<8.SPl75>                                                                                                      !   ,    Z -   	x*\ȰÇ/8"2jȱǏ CYO(9˗0cʜIMJNP<#ϟ@
+JѣH9ЅPJJիXNu1D`ÊKv,-hӪ]˶-9eۃx˗/3L0T}++D #KL2Ø3Q@Mӧ/k^M8װI/i^rޭ*ZxĶѳ8nEУC_
+؟bn;y	 ËO
+ӫOO(O~?yvY
+
%~~7]u*TQY :!}JX@^av~X_*W0(cT%z2cFH>Ja$`Qo\a9IRzLbdQhSA2-s*UHⱐ_ lptZP [FA	(q ujA
q&h
+oa¤&ef馜 BI@j*6xL2*k1j>j	> 2밳.k2AA#D+N[q&lp:atr1ú1̖^Љ(o {	 ,p`T$[A{+> нgLu谥tbj2w3"Y5υad ϱ-JǛ4uR̖PFv4CYB~h$l$1%6ϥ5,ll畩%C[V3˖"ۀ|-7|xZx!&dw-.򥟜JxO!.^	5a΃@O`7.=<oK P"t~#Fonއ/_,3]0nB@QL>7@x
+Z̠7z̅@Ѐ(L
+W+\BJn8̡w9SqAHL&:PT"&r#@X̢.z`c0Ĕ@hL6pѸ2V
+A0> ) @$(!F:||D( ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/All_CCs_225x45.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/All_CCs_225x45.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/All_CCs_225x45.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/All_CCs_225x45.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+GIF89a -    6-v C?Ќha퀌 e.:Ԕ?P<|&9AQ!B ijq|׽;JyoI Tj?Ǐ-i  Ť !ӮٺROOˇQX_ 1P?Mv$Jˋ2kugzfZ#;L򾾿̨OܥIў?JZ/ղvDĿlg1Xg螿 o} דΌw ?ʄ o̾_3/ T$OOO___???///oooVM'@*=&AWF05xID\j qLGx173D^i瀻ܽuѣ cΤ蝤/|y~nj_ϴٞ|`FgfYۯOAN_̞d.ͦd6doo`oaR!     ,     -   	H*\ȰÇ#JHA2jȱǏ CIɓ(S\ID͛8sɳϟ@
+Jњ69*(PJJիXjʵׯ`Rr<GhӪ]˶۷pʝKݻx}h`aLÈ+^̸ǐ#KxX$w$i̹ϠCMӨS^zr ɞM۸sͻN|)_μУKNسk}kFɻO}FgȟO>$HȽ׭QFEQC
x
. 
+! 
+r(` Fg (F8af⋍T$P#}"t'< *A|\7"&`aNmBĖ\nC^(]# J*LP	Dc+x0*Р'+42^#*蠄j衃 2
+8q)34h,`)BY!\F.j=$q髰P@rBC'ʁ&6cF[$jZ
v%<ƠkA#+)fbF:J2KhI-:g
+'Ƃ2B NjG
>b-ZhQjF)rJ fZ
+k yp6BEL3MŷԄ$05.0@l󁱂pc$9lۢ *.#1##1P'*ČrJ)"J(bFށJ,)P/Ы
+0*h -/!n< sD6D/1ےR<=?Gq
+/{(L!@W j!Q8.bc@(FQ
+1 a p@f*a_k
+ZWa!,ip7@Mh \x ^HC FQh#
j?PM
+ 
 uTO ʅ w?NlD)N?h,PX0< E0Th 
 LP<
X!GƁ2X
+E;B̰w`k (;!F8c*oA ;*,
5*CPxr :FX(1d"#TEFm8)L1UG|0LGSfW4oY dfG(1XB:ЈSҤvHqlB:Ј04 /#X`^)#f@DϘC4U m⁪d( c(] ¥S~"ٮ][؂a`[ E o-^cbw9ALi`DC<0
D0
+O#
qC@vhB@(F0HM{F`.6,0_h.8hv{P@vGA>	gcZz6 
+[_5FQR0<择.7윒Q`4
+*r@wj0i1!ZB 	pRy16t 0
h0*pd B U
!1|"Z9!.TǨvVS1(;wP>1( q%CF	Aj0"Vh& AA f	0x:S ^QV`CsTAu:/qP C.7D$B>8J3%(c.
+<5(8
+	!r>g RXm5a	Np=hTΈDqo-(#
+{Z4rBi@ N@APʂ!#xڪ@qQ
X6s (v!]\H>p1"	Pg:i7QԭncaL3/΍@(P
+S,[@SAֹ`8#M׎T 0h 
h/}nPHfcaBu  n4!{3Ռb0Ffo[킺l6A
 @e @9@POhauʤhIWbo(HX=Bj.])nuK ?p(sP(˕	P#`%{$CAU )$P/`΃Hc@_p 
+^w<}ag26i7~0  R"%-! }7I0FR8+X6x6AgPur"'q`v0}c } 	^`vpP,@B$-,0с!(#H&8}ɠWpIxۧ*n 	AHV68Xx8 ## 2 	; ,q
㐉%p %@m8R'}(Ћ
+05Fn0~V#Wx( * !!Xxp̠t}7yx
B樎h'؎̰ ِoaPyّY $Y&y(*i	O 0	0294Y6y8:<ٓ>@BpHJLٔNE0TYVyXZ\ٕ^`b9dY\)lٖnpr9tYvyxz|ٗti	9Yy٘9upٙ9Yyhp	9Yyٛ9ę}1"0 Oٜ9Yyؙڹٝ9 e1^0  y虞깞ٞ9Yyy0 KqM:Zz
+ڠ*p
)#ڡ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/by_ewallet_90x45.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/by_ewallet_90x45.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/by_ewallet_90x45.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/by_ewallet_90x45.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,11 @@
+GIF89aZ -  ѩϧ־фfdr{?KkǌSbivLWu!# 3?b&90,->:;YVWLHIfours1.gde[i\jJw䙟ǹAQ萎XIN^3E.tΌŐڸܤ<˝Ycߥҫs7H~}ɑ);ܦanď<Xc.7.WGYؐy|j<ӏlWN^ș0r~0λqʟ-.玚ML}~粶䭴׶ȤˏҪӫv<[endsH!   ,    Z -   	XA*\ȰÇ+8Ќ(=2jȱǏ CGk0˗0cʜIMjPɂϟ@
+JѣHr9ЅPJJիXN54$`ÊKٳhӪ%+
+pʝKݻx+G`LÈ+6#KL˘3kD͠CcҨSy5<Bv-gڠ7dۗ02<0d//>\!$BoN3x}{(P@
+=p
(C3|GHp
+8
.
Ͱ1{(J@z)߇"J
]
+GGG`!
+ 
+	H  b{+:Mx"
4p
"ן 2_Í4\!!NB(`')_b{spF(a'j(WH 
߇N9C~ЃD}f.Ab2F(`GJ0_ x7ـl{~yeʂr!gDAl袨f	pbQ ۀ<hAl4
m+ʿE7F;,";$"A-C-%8 I4tC1칡3.HRH0Jӳ*"A: `E	-!Tl
"tT"`%E-
1B݌@J7"lB{?U(iЄ*(`"(
+ee7!jY` 8-#aP8-4+4RD#rJΤH5T|xq"C1*Xi砋ޱ'"|z"L:2"pv/o+T73@8[[Ҧ5AM\* N
|\h t" Dum;Bg<x#hb( E0mdXA*Ѐd @<q?-
"v 6 'k؃2zlk[|7!С=R)$](a~#%H⡀>+
+)o ip`hEw xBּa6Hp&AQYCd$ XPvD@@r^_^LfԁtD4@ 0
.@
+ @ `M(pD ! .d	$ `x̧>~ӟ$G<k bqІ:D'JъNTFC @b(MJWҖxxAH@
PJԢ:2PTk
a$XͪVUYdXJֲhMZzV$\J׺xͫ^zWp`KMb{X/d'KZͬf7[Y/0whGKҚMjWZa"5CfKZͭnwMI'F@Mr:nE&	Xͮvz$NhMz{5  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/cartasi.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/cartasi.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/cartasi.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/cartasi.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,10 @@
+GIF89aZ -  l:q%tڝ%$&cc\X셄%˅I875|f!4X#Ԃ9~|z:t&ÖqdcbtשD圭VUTjmlj[Z\KKJ=EDCɼ)ـ}srr𺃌⌋Ĵsqm첲kjeffbYXW,++ϷONM򹷸۸IGBܘ˥Ԫݚ+׀QQP0Ř_^\͢@?=ͺڻȶhgeӛvBA@zyx?>@򩩨IÆZp200Z<{GkonnؘVpooiN{`aZ¾!   ,    Z -   	X*\ȰÇ
80.2jȱǏ CK&+}Ĳ˗0cʜIM_*QDʑϟ@
+JѣH9PJJիXN2҂E`ÊKٳhӪ%)	BpʝKݻxKBBLÈ+6oǐ#KL˘3W6XϠC_d@q9!@װ-۷-zN/Nq^>\P؋'8LonSca"*_/e)Kg	~pX@0Ã3@ xpHwpa+$Ӂ/xd\(	b1X @"p88OÍP:@0m4Xf	HPU"5 4rA" 16P4Dp2h<	e`u 7!gưK=LPg9Iќ'@ @ Oh1rT0 OƀAҏ iX̨hA
+"C +b# 	ˢ6L	 =$L*DT@P ת	%&j p2AJQA/hpr'uAp3c	{CqaJ8
@5MP'PPXr  2o1Ȃ ;@)C0@o]R<&C(ꐳ10R "@M԰ D]q#D.9&Fx̃ Pף"yH>H
#y|p94y$C%`S2@Ӹ&ވ@7Z1 ITxtAw@λD3&R #Pb5:7P9p5OrGVw N <B&$auX2 
+@B| G"
+&̎Ԑ
+pyhB=bf ',4\	M2,)d#U 4eJ;Q$`pڱW6P 
+m(A`[u G0`@Mi% q	*PA `JdL&9Gl:$
!#@"
h.v,a 0Jpv`PB;L0@Ќf4 2Ȧ H`8 rL:ՙ
+x.<!     X
+Pk4#{	@MHhB/P^~#( hF7юz Uz(MJWҖ+@R8ͩNwӞ;?ޠHMRԦ:KmP+AժZXͪVծzUnBֲ5!XGֶoU?Ȁxͫ^׾{k%pMb:%S	CXͬf7zl'&R-PനMjWֺmj0ٔClͭnw
pqK[#\0:ЍtK隂'1@
+Rzmn#$B  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/cartebleue.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/cartebleue.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/cartebleue.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/cartebleue.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,10 @@
+GIF89aZ -  GTNuD@iNtl1^ʦ"R]9G<UR,s$bzIURZlP|^J:odPvy戱X=2|yP`y.v^ISNxBw~hY薬S*^}TJpPbj@uMtMs>t{jz&eu_ܳ:E]r憪PV7b3~Nu,cKټẢcٷBͅ                                                                                    !   ,    Z -   	 *\ȰÇ8F&2jȱǏ C٤
M,9˗0cʜIMKLP4aeϟ@
+JѣHZ9PJJիXN1Ď`ÊKٳhӪ%ipʝKݻxC`LÈ+6oǐ#KN!l\
ϠCMthASKfX-ӢFaD	Nx$תYk<<~iCӧbi94_-pӣ5h5MڵǑB۾;Ć
Y߀_g o}'z*7Nr2vD(b a!!^  .",  %\xa㘧#zL҅/D!+EȆ4`0h @,\$ZH 8A+0!M/dHۊ2@c 17#8A
+H"Mb+|f)te8"6
+@
+,,h
D2z:Z%7(g +  ؘ8-Jl+!JaaJ+lmbz^k=ج iL 0̵|*E2Z(p%p
+pZ
+ [άmB)Z`
2DŔ^@	5n@,("*,-pƒ  &UOm˵o$hM.Ktk	l{pꞽw
wsv-w=bmxG>\8/#v.褗n{4PTnGGdR{0.P,=d2⛗ G/}?g؂w֛" 
+{! J)oChEH0sg 
8'H
+ւ0  GHB"`(L
+WxB"<H>@84w8!B
HL&:zP3(tX̢؁;<;0E7D76pH\!6> IBRF:򑐌$'IJZR:H
Nz(GIR6`8V򕰌,gIZ򖱜DLP	0IbfT$PЌ4IjZ3̊8IrL:!%:IzsE ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/dankort.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/dankort.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/dankort.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/dankort.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,6 @@
+GIF89aZ -  $WTUXUVuz*1!)KQkq6=䖔=DSY+3ROP^[\%-AGVSTBHǙ߭ގܔ-5,4chV\ifg(0mrRXLHI3:ns8?xvw>Efk[a.5gee<Ckhi]Z[dabõcihmSPQROORNOkijGDEDKrpqpu$+ljjzxx#*&MS{gl,()ek%!"@G?FOKLRYjo&.X^x}"*bg512744OUtrr                                                                                 !   ,    Z -   	h*\ȰÇ-8E+2jȱǏ CyKD!˗0cʜIMQJP,aϟ@
+JѣH9PJJիXNm1`ÊKٳhӪ%Ki	pʝ+W+h`*˷߿~BaIǍx9lƁ˘3k̹s/d
^ͺj"B M۸s@˕߭ۂ)ٴX|УKN]:fqɱڪXϾ/eelHB (f
%01M('7)0[5v{G&JX!9`
+.1[+) @@yDy5]7L 3䔒X-@
)H7X Znɣta&Sznn's6\@ %
`饘f:
+]rxiC͈^@ʩM1cmLL yj"Ϊ!`hm8fªbj,	bln҆Fb ۾k鷷AQ#Cn}
V/[mm8[-020 0tqmJ؂
9'bi3 wm0	nNKnr,/290+ dRzx{@ttCs+YY$#A]u\wLA*q$X(g:hwVH,l߀86݈l!!	ֈ3K/lRa$4	m}, }o!P/k 6/"4ЋWoׯCm R Po藿H8n m
,~=?.DaNC
9p
+Z`7*@z GB0"(Da*򀛸0aMl (8̡w@b)!*,HL&:Pb X̢.z`mr!hL6p(`ȣ> !1%>"F:򑐌$'IIE
+Nz(GIRX8	J S򕰌'  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/ec.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/ec.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/ec.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/ec.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,8 @@
+GIF89aZ - p  .# U#8ISa?>~TaTb/z&O?OYVVRsFT
+e %*o}}|bnN˟~~UY񉒝I*:Kh                                             !  p ,    Z -  p.0??0. FF  EE00 <<;;* 
+H-`J(\p
"eDHHQ3ZᯀǏ C憀(SFÀ0c1M
+:)RMʟ';RQ<z	GRcѧIz ׯ`Ú*Q2C]+
+A[;hAE;s߮o;n*X:&VxdQH VD,2鶙OnV,lQТfkzX;=6ھޗRxU УKN	dH5C 4p<GϞu_zoOz뿇Z~GVG .xR!5H{@@$6$8Bw0(c
+@bF@ F @ ,id4dzK:(GVpiIdcFi[)J $HiJ\	g u!Vli	?j衈&(RD|/U[(j饇 
+t@A PxX꫰r*w(+Ğ1+~Aۃ 4h VkO̚qƵKq覫^D1E|)^C4 ,l G\gw ܱ(,0̐8<@QH'L7PG-55LBd\w`-[Pt*8Llp-tٕ |߀.N8:
+!GP ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/enets.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/enets.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/enets.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/enets.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,11 @@
+GIF89aZ -  MJR64K7373qnD@C@LheO72D@73Jt62qnLM{I䅣𘕆gdLMMLv=:MO63'YIi638g|tmi63C@힜=kS{gdz*\{#W-\~}%XhroFrNx5/끀쉆62~HrMuur40Mt礷ZFB>97261]Y흜CoLp䊥XU쒐40^}z읛팋~NNhM]_LwMvv!U{.^|}ݿLRzJtKtfc!   ,    Z -   	*\ȰÇ38G-2jȱǏ C%QA˗0cʜIMePPDĂϟ@
+JѣH>90ȄPJJիXN
2	`ÊKٳhӪ%+pʝKݻx;EL҆È+^̸^#K◁˘3kNg
+B
@ϦK.
ZͰc;eΨMwZйڶf;wS;_
x少0SD^}z Ͼ.7޺=/|?^}jsС
+h {xw!  ~Vb!("D4H#61c,,1#w]4dPF		PjP &dZf)eO*]bd5 a,,1h
9*
+c /F Y@ ߗF*`"C" 
Ma	;":萏1:<RE#'ilL
OJ
<N
+#@7q81ܐh`P'2+d2<rBuDIlLpmMs
 s&F:.		K( R&{)j1G?D<(0)ڬp
+4o3MDP@88xBjUd PN
r-?
fR(q	3\83|4{FRKx筷8
+"'<tL oQ66:^:R ݜNmD viM2PRVDFHS>9{7<-KA|3,u0#PBϾoo|_ 	- jPj$XHI:k
v̠ .Gy&(|f4	T0gHP89%(~4 tHLhƇ|"	0%ZRH@.z`GCDfp6qH:H=q}#
GA"Ip$'IJZ̤&-yT&(GY%D
+H*WV򕰌,gUȥ.w^03D	
H2f:Ќ4L%0ap6nz8INoa"(Bv<IzL.>~ 
@JЂWgE@8D'JъZNP  
HG
+Q
+H" ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/eps.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/eps.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/eps.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/eps.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,7 @@
+GIF89aZ -  荁sD~qԤ%ufEVhWR=Øƽ@6rۍfT縱:"(U/YE̱͊~傽D}E}re:"~	y}gXݱE~~{ֿ9ArscP;λXF
+~GcKckY}qG1E/YHvѱaQػpþxYtdufxjjZz6~qSE4xׇᱧ%߷}Pu⃻ヽqcCtesvv~ͿUL隐}~þſP<^vstĩt]JӺ\!   ,    Z -   	$*\ȰÇ8pX2jȱǏ CA²˗0cʜIMrPϟ@
+JѣH9̔PJJjUNVjjf;TKٳf;L۳w9Bݻx+ci{F '+^̸ƾHˎ6¹ϠCNdV^:4ͭc欢mۑfoݻːȓ+_μУ7#иX#ҳ1ȩ%ǊT`NP4y߀
+0r&$\}97pCHp
(ьAbs⨣d15(q,xDC_7ǹ ɹȤr1 hTY:Di_<g`<<duf&
+f!
+  _?&矀*8ơjR'1  0覜.'nJ i2S|HDxj7|3g҆K
+@g}O)CJJ"knr7\-J0%D,A
 L2,P9Ɯլ0PEQ(,r.,Q<8s<\?&,Q0'<`q+LiVm9\w`-d]@axyS'wI#]Ȱ|0KA'l"0,A 	AM
P, ग@Llꬷ넸m5'&ӈ'8A'cdC`!PZdwϽ,}jhqlV(0h_ZĂ}p  B4 `L@`5X̠7ZH
C$b(L@p4$XGgvp4t b,@1Q(LQA`"E 4X̢.z`cw/`	hL6p8 #Lȣ> <Ls"F:򑐌$'IIF)C6Nz(GIRnRV򕰌,gIZڲxxIPB(0_P$  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/euro6000.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/euro6000.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/euro6000.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/euro6000.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,9 @@
+GIF89aZ -  wxe
# P,髯L\|BSfs2Dq~zuEVN)k;Lw|sIY!5;w.A*=vg.ۻ>O^mz덗0%8Q`DgUe%hu`n9!va+jrt,>>^l%j4AR^lZiꆑiS b	!c+df
+ 엠TcCT\kܾCnɁxh
+WpP_ݛ^XbWO_w(9~aaܕ=z~l7Hm{g驢Wr{eMwZPk~lAts&OVŰr{uk͉;ʐ܅>m);(;Oie.~_L[EPOZNZɶx$pgkgo(Xgky!   ,    Z -   	X*\ȰÇ8P"t2jȱǏ CID Hò˗0cʜIM:PIϟ@
+JѣHB9PǛPJJիXN1O#>`ÊKv%%t-G@(*K.2CJ~(K0FLY̸ǏLe=\ϋ	TӨSn0d3.'b4ד=ͻfN8q-iYr*ؘ؃nѽÌ ]n{|.qWM'k$}}F(a\Eq-L	{6Ʉ$`5hVXT; !
(SK6L6, hAY"aX&> ѩ` e,"J9!uaNhrC-G'E	`dI'DL12!!yqdXJbFe FP Ey qѩ`) Wj>`+8Ʋ6
+$+.	 ` ld!@k̮,:d`@c* ŸŶ&KH&ln{0p11(H(l"焒,VfV򹑒&lH d	G${0PY/CrJ^5d7&JT G`-d e `x-@F3>e?ma!x=ȓ1hAkjMd`ߐmDer-0x1<E3ePߒ[uQT6/gSvc´z}x샣X)*s	],\&Gg7X@ܧ>h?$ :+0 $# d.E0Iц@p
+Z`@#X  %h, `[d12 `;wC:avH"H# 2D` 
+`#B@6pceAKĀH@VfAD@p
*X A` `RCHJqq6Nz|np  =Go`B0$3	X&#@^n7pIb f1X_PP8i2
+ĩ"|Mx J̧>ɬ~ 
h?!MBІ:hC?`
ͨF7юz 
H9#lHJWҖ0LgHL5NwӞ@
PJT)Ԧ:PTJժ.( 3x`
XJֲfNUp\
+V8H" ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/giropay.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/giropay.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/giropay.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/giropay.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,9 @@
+GIF89aZ - `  :}$?j?k*1?j_TZF/^ՏFMRbhOwoqv̙>j.]\8?^Nv^                                                                                             !  ` ,    Z -  `69BB96#CC##TT99#LLQQ- 
+H*4H߃#JQŋ3jȱ*:$H@ \ɲ˗0c Ȓ`Z،C%
+J(Q3!NJ*5 FjT,TFE!X" hW3EJٹQӶnRxǖ
 o]zvPĊ]2똰Z'W9湝	Ə0:pѡ` #@	,EAv XW9cg[-r)wPa	7(SQ" ҠkPIʭ~*i݁!߅'p{g	VPC|`x ` & ;B
+A"+Ƞw
+5w5AW!{@YPV~ A
+ 8	7P#Yrc ;z@%dAqxdIC1AÕ]j`_Y9d ?Pvyx_Me+h0J@]yn7fee(_!h~pP߀-ayce z}40xaC
+*uł uk2Ph{lR/eem]Fly4+ԢDg,t/[rA&o_~y0j U]Y]-p`_\ZkqEd,Z>W@t>]4lsO$)G7M$H'>7=JGhXguF8JFYS 
lp-o7|߀.o!$҃ V, Wngc P( 褗n騧ꬣE*=  n3`Lo'7WogwI 
+=o觯#!~%NHQ p
+TL9@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/ideal.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/ideal.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/ideal.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/ideal.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,8 @@
+GIF89aZ -   g   ????===xyy~~~󾾾?p{~{{|///z}}}/>>>]]]OOO^^^鏼?_ӭͿo...>>?nnnܞ_Ľm==>|||kll鬬yyz{{{|/NNNzzzyoookkk흝؎ٚ}jjj~ů釈l}}}~                                                                                                                                                                                                                                                                                             !   ,    Z -   A	X*\ȰÇ+8.2jȱǏ Cم
I@9˗0cʜIMPHP$ϟ@
+JѣH~9FPJJիXN1
+`ÊK6hӪ]Qٷpt	xݛƀWɎ4|+^D`
+#KLY_3XQϞ8&@ӨM!kI8xE׸s+7խ}N築B"9nÜN:0J1WE O偣B3weߏB zg|~ @_>x߃
^B 6!gyf %7b
8
+@xt  )t d) F >lF#z3>kfdY@hY@ | CEf ]`#BS%pY@h_%9^裐F*)!`! ]j)C` !L$(>Z
+&eF)ZI(l0@ꪄ:k %C  ,]rjG6"Hdh"ad} pKQk*!J1X	<6Ŏ.뀗(1`E%+缲,`1Ls|.h@73(>7s/UP 5OKƱXH 06"( T= H3  D؂n Lh`jhIym+$[!
+ 9 `  	fL@!w!;gpz`dPǀlFlG/Mgk gX`ψB!"7 JtoW! 0 `BX̠1؇} AHb(LE&\0gC8h憀yB$@ЇnbHL	DbLz *0X̢.z`c .,hL6pc$x̣>{P\AL"F:򑐌$yȤ&7Nz(GI22%c*WV򕰌,gIKUB^0Ib3
+X8	J c:Ќ/  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/laser.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/laser.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/laser.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/laser.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,6 @@
+GIF89aZ - g c58/AH;icD<@9D=n6C>FPIB0]VM2x8vp}X3ɛ                                                                        !  g ,    Z -  g
:7FF7:#NN##@@77#EMMEXe 
+8@\)\ "JHE32p C(SN˗0cʜC8pJEʴA$ӧ/zyB
X_="kVL<}S#+Xuk pʝKn3r,EbLX.Ao+KSI Ř>8
+ {^jE%g_np+*E+ބy#KN9+PʯmTkqӫ_^P{-W'0兓X<u߂S)HqA!h
XF?9МaI(tDOe}+؞hU G! 鸞
L6(4 Ep(<L6 H\d
Ct`c
bg馘d9ڙv9pvhzCH/Dz! 6vv
+|( v駠քhA (jKCE+VQĪ+>d2+C@b $  ˂   HfI@+D@ 2A@@C Qk Kp lZPQpo4CgL ,$W.
+L@@2 A=LO$s,@-DD@Պ ³<(
N+<QX R| dmR|}Xp-tmx]w߀.n'^G.Wng>̜.褗n騧:JL2.nCy*YL o'AWogw=G
+!
xoo}P ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/maestro.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/maestro.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/maestro.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/maestro.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,7 @@
+GIF89aZ -  . ;{ܱ;Yv[Tb}(:/bo7H^?z7GEUo{oʟʏSzp|z Q_+C_j);gcoXk?=⏳ߓKoH]m?`m]|R`}_􌕗Oo?zցz_ n!?OӢCd?OOy_o?my?w5]<Umpn.Ufan{DT$GSa uIs ?so#8Sat:ퟹO2T_𕞶hzg\UETkg):?fM3N>~ {{ꞫĽ/L񉓞񛈣>~욠o                                          !   ,    Z -   	X*\ȰÇ+8P82jȱǏ C	ǅ;()˗0cʜIMJ:PPDϟ@
+JѣH9ŃPJJիXNu1`ÊKٳhӪ%)pʝKݻxE
+L0`2eP(FQajbǘ3kϠC3CӦu	Uװ_;[#
+8
+OΏaƻD8}#ӡ$;7 O_ A˟BӯÇ'm_~}~Z(	g_e({(y"8xp#.VȉH#yxڃ<>H87\.  IC
"
\v9%B3&3p`;H<h$tG@$@}捗@&1&<*ģ#ˣD(:c0ǣ<Fl+((MZWjUHf`J#&p+!$C <Avx*>%똷p>	3f9Ҡȭ଴\ӞĭiwɝE|pGICcRڻ o[q+0i0ī6IǘQ@ A4VZ <̳
$Ѱ%,l	_lF,H(͜M5,0`H5Fh@;69(6@VnO|L8ʆrǅY \($ D.V(ꬣtz/S!P{ᕉ(^ީ]L77?:[G{8ܳ!/O>8>p91c/@T\FSTPC`& JX̠7=zKt@F'7648̡w@bw!HLkHPH*ZX̢H
+a`H2hL8 pH:x̣
+ IBL"YH,L`$'IJZ̤&7IJ)iFIRL*WV	pZ̥.w^K8IPBL2o P$  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/nordea.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/nordea.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/nordea.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/nordea.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,8 @@
+GIF89aZ - o  gp??/>yz__oׯ~noOON^y/n^O莻}޽                                                !  o ,    Z -  o		7;TT;7"[[""ZZ;;"LLRR1	 
+H*4ğ#JHŋ3VTPǏ C^&ȓ(Sn˗0cʜI͛8i`ϟ7@1Q=#˝oZJ Xj
.JJ [ @GXfVVkX +/"uB
+f/\6Gl7I`n ˘3k̹3f8xݙE]
Vn04wJжsC]geyv$6,<A~|5g9UQe'xjpbq:p?
+7ǪFVԇ
+iwZpZm'`'U0[VE~Y)	uj7^ g	YwBsX`	qpoZ| $gxUG)`u !e 4`5dB |YXP%A0hX)f	XPhЂi BxI&\e dUXy%niy
y&^Yn"ik	~zỲi2`EÛJ`偯X)h_:J&Ϊ~0@a&qu
+F@
PƆ梫hpnXEʰteO``]V= P.)\ H.XUPŐ&$ad<L1'L
+<`*2OV73H't\>PG-!d\w`-_{!lp-o7!
|߀._ $7G.7dw砇.蟫!Hr M, n~ UD o'#_E*G  Wog[3o`io觯> Fob _*pL: +х+̠7z p
+T!L
+WR@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/p24.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/p24.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/p24.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/p24.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,11 @@
+GIF89aZ -  43fffeML@?䙘噙ee벲ހጌsrᖖYXZY찰䘘rrLL覥ߊ~@?祤񶵵壣椤껻rqdc◖XX~}މጋYXʼ篮鰰祥㗗겱Ƥ걱篯YY谯                                                                                                                                                                                          !   ,    Z -   	@*\ȰÇ8ǒD2jȱǏ ChIA˗0cʜIMu@Pϟ@
+JѣH9p	PJJիXN]2D`ÊKٳhӪ%pʝKݻx+FLÈ+6Ưǐ#KL \ycΠC_Pӏ=5d͓e툢 qءr̡U{@ȓ+P8CznJ.ԳĐ@Iμ˫__x _|x\ ZK>7] uX_A 
++?Pg]
?hC
+ ~`\aDvR(rCm9AbX 葝<afBd`8 j0 ƙYH>H&ـxz0ː)x '|2 (w( t@3<j3t馜vA|2ߥ uD@ꪬ*2¬'ّ1h2QB詀J/!|lb5T[yAf*E$ۨgp'-xґD2w77<,
+7!q
+
?LBĥ
+ŰA@-H+/tQ~D,_c0D
+! )lB^H4+"5!si2#<<0`@BG	4֥ pui`2Y;\QP/DQ@p6# 19 0N; pz_$Afo9xzФrF4ogG&o M|
+Mp	q!4ApHǑH@H9A@b 
̀0~DA?0 U0=,pF)2RDr 
#.\ 2<.E
+2``"0"F88<g8 I@$`'"
+]eH9u#X>@	h =H
(s,A 2'Ȥ&O<r2$@@RL*WJV"h,W9!̥.w^򗾴q	`ӗ#f:Ќ4IjZS	!nz8IrSnv5@z̧>ɦ~t@MBІ:MCJZͨF7юzS(MJWҖ0U) &DL8ͩNwӞ@
jN1ҔHMRԦ:PTڇV~ Vծz`
X*V?$(!ֶ\D( ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/poli.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/poli.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/poli.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/poli.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,8 @@
+GIF89aZ -   wJJJᆆwww?_;;;Є~iii땕hhhܽꅅ쇇/ೳMIII/YYY^ZZZ,,,߿o>oO.?n鴴/xxx>ůOʤm<<<|֋َ῿---^~vvv겲                                                                                                                                                                                                                                                                                                               !   ,    Z -   5	 *\ȰÇ8І)2jȱǏ C)Ņ
?)˗0cʜIMG>P`ϟ@
+JѣHZ9ЅPJJիXNu1	`ÊKٳhӪ%pʝKݻx+FLÈ+6ǐ#KL˘3W^Xc>YѨ#@԰%۶e ͻw/pqWj_Y#EݗC "Ҿn'dy*Fw㍫vvMοmxut v_~{%(`Ew\p

>` [<@px\4gb}:>gw) yv0G} )|GtP݉Crs1ԆwApMq9B@Ph		|sUs7F}y&R
+)}*'|	zz[J
ꩦyH	f{jz[ao%aޡw`*ni+~q9
+yA|WЬ Ä yҺyQ4[͖K浛Ƶfo zsjkD,/ 8!ǑA1C7D}| a,Ԭ1iʍpl@r1?	0Hr^;S\
q CHK4>J+@FHtI  zÇ
+vU
(,Qw\GWH!0	|?呷!x{=F!C?wL:w! o+l=`}^8cBo`
+7l 觯췿>"8qqg8!!{!P HLx@D
'H
+Z̠7xh
GH(L
+WxB87gHÚ A ^xw@HD A I`&:PHE(&!%@P.z`HF/)`6pH:	 (> IBҏ\@cJ`F:򑐌$'IJZԂ"+R*(GIR<%p$,gIPF@"	 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/postepay.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/postepay.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/postepay.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/postepay.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,13 @@
+GIF89aZ -  [CFzY6M<1hWXvhdgiyZWd8<QXZd;Cv{|tolUYiZ}_Ym9LbfoV<BL1W<Bg=EwziIwuAXipid_]udZcn<X.ADGf_ABKOwR\2H*1^볷?CZVV@ynuvZSPTqrnx^T[EI1EIn\MIUfH>4RPw4;Ap5UVEf[HJ_V?WAQR\`e\IJVJY59OXWCc]F$V[4=U9-]HRNJ:<~b:=OO9DGHEK?=VSVC-GE=<G=G3Mv68NNWw_amd5?TI[6`0PQ|@D?uPOoD%.d9?6?𤂋M=EOPĬQpopWSZ4a1)/+!   ,    Z -   	˗*\ȰÇy
8OiȱǏ C1{˗0cʜIM,zQT	ϟ@
+Jѣ?sNd1ӧPJJիQYDׯ`ÊKٳh>opʝKݻx֝"LÈ.7ǐ#KL˘)jϠ-oW#Ө5Tװc˞M۳G޵%E;#1`@CUP@-RIAqU3^N
B·^~p◟HčZwk2 ,A(PBI	Q60%pP  @ 1p7 |`%,7 
+
+*UI	4# 4,ĀG	jqdE+`"z8ɼHU+0AG?h4ӄ-O{ :AH6Lh FL زx4?MB
+8 cބ H,&H" -xS?
+t=xP
+G22xCqDp*p	PhJ,1n,aIgq،+QHc	H@B Td7<pbK(\H0&p8ц$@9X D&Jr.#$0Bc Dp@g A2uD	Iс86ċ>kd0$_T	(G9T@4bbp		l&հZ-R"  &7k Dp&s`aA9##,p`t!9 #
CRG p($`=,i
+bG-gp9sA`A 7CC%9	0@oh Wap
+x@Ab[8F m o$+$H 7P`O ׂ}ܘp00, 1P..e " +m> @`Q|`4P;V3B(CPDpx6,PoJ* EDOl@!`Q .;8*^D3P4<J,89$PK!$8B`!, A@4sks
+x>z~а%D 5 lo`E6aHP9xx"[ !	p B 	x 
t B""@І'Q	xp p׈[:7p1@p\IP2P[b^JhsFx0p\ 8@Ѐ<5:2 niH,"<@#@m `Pa  fl`pDT,\/@ 8`'VP	
+@x@/ NH@0%Y0@*EBhE,89۰ǲp5|c7
 C2p#@	s/أ? & 
++CX/\@ hF?F4A?@(րe`q'wѐa4
#0	M 8.xQ$ j l0	 ~,d?? A6J0%/A".Cy	 B&Pa/  \%cΩ JPCTD6,*11|UpxA- ^`r, .AXB1&|6t%J(pÀl=yzr!ιSe(C$n|86J|FqxQ zIp'N[ϸ7qGN(OW~r)$gN8Ϲw~sH	ЇNt0Hҗ;PԧjD
+7ɺַ$	Nv E
Nxϻߝl1@AO;ǘH/![ϼ7{?FSb)OWֻ7F_cXϽw>p`d"H@  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/sofort.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/sofort.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/sofort.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/sofort.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+GIF89aZ -  ƎVUUǎVČԪ,rHҨ~ƍdōGc+ڷ:Ōժ۸r,q۸˚pٵH͜͜9                                                                                                                                                                                                                                                                                                                                             !   ,    Z -   #	i*\ȰÇ HQR@ñǏ CIdH<{4 XPq6 I͛8sSE.  
+&(]ʴӧPJ:Հ"B-Vׯ`ÊKٳhRx*(H@ݻx˷ߺ\yF@È+^̸ǐ#+NE h̹ϠCMڳ `   װc˞M۱Kd5ȓ+]7УnI k> {෋O~oRzڱǛ{- H
+᠃(2 7,'u6(`!XqH0
++*@!
&"Vbd *b
l @
+/tGގ@F bfV0V	+!@Q>h9އ,,a" , $S !F Uj饖""~b
+
+@c i\
+&.Aw	Ŋ hzI!b4௽AE">,
+  	$i0m#J$	"F*oz@
+\'>B*iwL"KڑG,mx꤆ khw"JdH**!!`Ȋ t BoPSa}DǗ@v! Pt*ZQekH2 ƛ+TLaL1k C  eCk3[ !UQM3,ڱ,0il'TVvuMX*PK`BP @j|$I3;!P՗9|)|n)7 	d`]/eλվC| Jo9暏ڹE
+p s*N)cS Dnr8>-oYpq`%0 ` 7(LVȌ.Uq
D !Ml*@%K 9  a5 $2,`V@ 0jVA5a XEЮ ;S U8 `= YD"~(K?Wढ_X0krQ#[CHL &5ɀz44CDQ P* 
+(
+ 
2/O hR cC`
X``ә@}d5 .L':YYM ̀1N	$sA u^3T>yL	ȀB   f0k24sؤFyQkrdG-M&hASP0Ҙ8ͩNwSb@@ZJԢ,
+`:PTJժZ5d&pz`
XJֲa%" 2Ȥ'p\
+W)F*@@׾
`KUnY@:d'KZ ,
hGKҚMjC
` @fKlͭnwP
+>`Mr:Ѝt/@  @ )l
xK%oF	T-X@ͯ~w
A ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/solo.gif 2.3.1.src/ext/modules/payment/moneybookers/logos/solo.gif
--- 2.2rc2a.cp.src/ext/modules/payment/moneybookers/logos/solo.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/moneybookers/logos/solo.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,9 @@
+GIF89aZ - ^ -a^   {aGn:`T2$_?-*d%qR`w_j~[K6!meIX?	                                                                                                   !  ^ ,    Z -  ^
46@@64)LL))AA66)P==PEZ
+H**WD	#JH"D3jTaǈNIɓ(Gb,8bA)s$@Ο'W
+<b6 !b q:T
+UZbCRJ|
 5O! ]˶۷jA5!B@&ߵ.Kح܀%ԑÃJ(!oj{htJ|fέnQpF 
-Xz_	pY`8E`v_oX=6<0Ͽ W
m0iF(!7
Hbt1DH&bX
+&@,bnv|FM(A9p0M'P^=@# Kd(B]2$vb\_
$ti` 9@$ߝ*giu@1(GP{
+h:ڣ	WjĂ	*f
"n0@m_a6
++A
+f0LF+nEdXQQ6!ۏvmdL!H+ko>\Z,	#plR 7Gp1e,Cp $7 M`,*S<.{B	/ԅ4@2XH'LmA0#F:Mw5!y!EdmhMj-w\-xC߀A<,7G.W w砇.褗:ꬷ.x1D/o<CL4G/Wo{*O@/4o{AD/o?G
+!
П HʯD   ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/express_payflow.php 2.3.1.src/ext/modules/payment/paypal/express_payflow.php
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/express_payflow.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/express_payflow.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,317 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+// if the customer is not logged on, redirect them to the login page
+  if (!tep_session_is_registered('customer_id')) {
+    $snapshot = array('page' => 'ext/modules/payment/paypal/express_payflow.php',
+                      'mode' => $request_type,
+                      'get' => $HTTP_GET_VARS,
+                      'post' => $HTTP_POST_VARS);
+
+    $navigation->set_snapshot($snapshot);
+
+    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+  }
+
+// if there is nothing in the customers cart, redirect them to the shopping cart page
+  if ($cart->count_contents() < 1) {
+    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+  }
+
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/paypal_pro_payflow_ec.php');
+  require('includes/modules/payment/paypal_pro_payflow_ec.php');
+
+  $paypal_pro_payflow_ec = new paypal_pro_payflow_ec();
+
+  if (!$paypal_pro_payflow_ec->check() || !$paypal_pro_payflow_ec->enabled) {
+    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+  }
+
+  if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_SERVER == 'Live') {
+    $api_url = 'https://payflowpro.verisign.com/transaction';
+    $paypal_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
+  } else {
+    $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
+    $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
+  }
+
+  if (!tep_session_is_registered('sendto')) {
+    tep_session_register('sendto');
+    $sendto = $customer_default_address_id;
+  }
+
+  if (!tep_session_is_registered('billto')) {
+    tep_session_register('billto');
+    $billto = $customer_default_address_id;
+  }
+
+// register a random ID in the session to check throughout the checkout procedure
+// against alterations in the shopping cart contents
+  if (!tep_session_is_registered('cartID')) tep_session_register('cartID');
+  $cartID = $cart->cartID;
+
+  $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME) ? MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME : MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR),
+                  'VENDOR' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR,
+                  'PARTNER' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PARTNER,
+                  'PWD' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PASSWORD,
+                  'TENDER' => 'P',
+                  'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'));
+
+  switch ($HTTP_GET_VARS['osC_Action']) {
+    case 'retrieve':
+      $params['ACTION'] = 'G';
+      $params['TOKEN'] = $HTTP_GET_VARS['token'];
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '[' . strlen(urlencode(utf8_encode(trim($value)))) . ']=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $paypal_pro_payflow_ec->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if ($response_array['RESULT'] == '0') {
+        include(DIR_WS_CLASSES . 'order.php');
+
+        if ($cart->get_content_type() != 'virtual') {
+          $country_iso_code_2 = tep_db_prepare_input($response_array['SHIPTOCOUNTRY']);
+          $zone_code = tep_db_prepare_input($response_array['SHIPTOSTATE']);
+
+          $country_query = tep_db_query("select countries_id, countries_name, countries_iso_code_2, countries_iso_code_3, address_format_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = '" . tep_db_input($country_iso_code_2) . "'");
+          $country = tep_db_fetch_array($country_query);
+
+          $zone_name = $response_array['SHIPTOSTATE'];
+          $zone_id = 0;
+
+          $zone_query = tep_db_query("select zone_id, zone_name from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country['countries_id'] . "' and zone_code = '" . tep_db_input($zone_code) . "'");
+          if (tep_db_num_rows($zone_query)) {
+            $zone = tep_db_fetch_array($zone_query);
+
+            $zone_name = $zone['zone_name'];
+            $zone_id = $zone['zone_id'];
+          }
+
+          $sendto = array('firstname' => $response_array['FIRSTNAME'],
+                          'lastname' => $response_array['LASTNAME'],
+                          'company' => '',
+                          'street_address' => $response_array['SHIPTOSTREET'],
+                          'suburb' => '',
+                          'postcode' => $response_array['SHIPTOZIP'],
+                          'city' => $response_array['SHIPTOCITY'],
+                          'zone_id' => $zone_id,
+                          'zone_name' => $zone_name,
+                          'country_id' => $country['countries_id'],
+                          'country_name' => $country['countries_name'],
+                          'country_iso_code_2' => $country['countries_iso_code_2'],
+                          'country_iso_code_3' => $country['countries_iso_code_3'],
+                          'address_format_id' => ($country['address_format_id'] > 0 ? $country['address_format_id'] : '1'));
+
+          $billto = $sendto;
+
+          $order = new order;
+
+          $total_weight = $cart->show_weight();
+          $total_count = $cart->count_contents();
+
+// load all enabled shipping modules
+          include(DIR_WS_CLASSES . 'shipping.php');
+          $shipping_modules = new shipping;
+
+          $free_shipping = false;
+
+          if ( defined('MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING') && (MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING == 'true') ) {
+            $pass = false;
+
+            switch (MODULE_ORDER_TOTAL_SHIPPING_DESTINATION) {
+              case 'national':
+                if ($order->delivery['country_id'] == STORE_COUNTRY) {
+                  $pass = true;
+                }
+                break;
+
+              case 'international':
+                if ($order->delivery['country_id'] != STORE_COUNTRY) {
+                  $pass = true;
+                }
+                break;
+
+              case 'both':
+                $pass = true;
+                break;
+            }
+
+            if ( ($pass == true) && ($order->info['total'] >= MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER) ) {
+              $free_shipping = true;
+
+              include(DIR_WS_LANGUAGES . $language . '/modules/order_total/ot_shipping.php');
+            }
+          }
+
+          if (!tep_session_is_registered('shipping')) tep_session_register('shipping');
+          $shipping = false;
+
+          if ( (tep_count_shipping_modules() > 0) || ($free_shipping == true) ) {
+            if ($free_shipping == true) {
+              $shipping = 'free_free';
+            } else {
+// get all available shipping quotes
+              $quotes = $shipping_modules->quote();
+
+// select cheapest shipping method
+              $shipping = $shipping_modules->cheapest();
+              $shipping = $shipping['id'];
+            }
+          }
+
+          if (strpos($shipping, '_')) {
+            list($module, $method) = explode('_', $shipping);
+
+            if ( is_object($$module) || ($shipping == 'free_free') ) {
+              if ($shipping == 'free_free') {
+                $quote[0]['methods'][0]['title'] = FREE_SHIPPING_TITLE;
+                $quote[0]['methods'][0]['cost'] = '0';
+              } else {
+                $quote = $shipping_modules->quote($method, $module);
+              }
+
+              if (isset($quote['error'])) {
+                tep_session_unregister('shipping');
+
+                tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+              } else {
+                if ( (isset($quote[0]['methods'][0]['title'])) && (isset($quote[0]['methods'][0]['cost'])) ) {
+                  $shipping = array('id' => $shipping,
+                                    'title' => (($free_shipping == true) ?  $quote[0]['methods'][0]['title'] : $quote[0]['module'] . ' (' . $quote[0]['methods'][0]['title'] . ')'),
+                                    'cost' => $quote[0]['methods'][0]['cost']);
+                }
+              }
+            }
+          }
+
+          if (!tep_session_is_registered('payment')) tep_session_register('payment');
+          $payment = $paypal_pro_payflow_ec->code;
+
+          if (!tep_session_is_registered('ppeuk_token')) tep_session_register('ppeuk_token');
+          $ppeuk_token = $response_array['TOKEN'];
+
+          if (!tep_session_is_registered('ppeuk_payerid')) tep_session_register('ppeuk_payerid');
+          $ppeuk_payerid = $response_array['PAYERID'];
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
+        } else {
+          if (!tep_session_is_registered('shipping')) tep_session_register('shipping');
+          $shipping = false;
+
+          $sendto = false;
+
+          if (!tep_session_is_registered('payment')) tep_session_register('payment');
+          $payment = $paypal_pro_payflow_ec->code;
+
+          if (!tep_session_is_registered('ppeuk_token')) tep_session_register('ppeuk_token');
+          $ppeuk_token = $response_array['TOKEN'];
+
+          if (!tep_session_is_registered('ppeuk_payerid')) tep_session_register('ppeuk_payerid');
+          $ppeuk_payerid = $response_array['PAYERID'];
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
+        }
+      } else {
+        switch ($response_array['RESULT']) {
+          case '1':
+          case '26':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_CFG_ERROR;
+            break;
+
+          case '7':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_ADDRESS;
+            break;
+
+          case '12':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_DECLINED;
+            break;
+
+          case '1000':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_EXPRESS_DISABLED;
+            break;
+
+          default:
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_GENERAL;
+            break;
+        }
+
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
+      }
+
+      break;
+
+    default:
+      include(DIR_WS_CLASSES . 'order.php');
+      $order = new order;
+
+      $params['ACTION'] = 'S';
+      $params['CURRENCY'] = $order->info['currency'];
+      $params['EMAIL'] = $order->customer['email_address'];
+      $params['AMT'] = $paypal_pro_payflow_ec->format_raw($order->info['total']);
+      $params['RETURNURL'] = tep_href_link('ext/modules/payment/paypal/express_payflow.php', 'osC_Action=retrieve', 'SSL', true, false);
+      $params['CANCELURL'] = tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL', true, false);
+
+      if ($order->content_type == 'virtual') {
+        $params['NOSHIPPING'] = '1';
+      }
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '[' . strlen(urlencode(utf8_encode(trim($value)))) . ']=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $paypal_pro_payflow_ec->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if ($response_array['RESULT'] == '0') {
+        tep_redirect($paypal_url . '&token=' . $response_array['TOKEN']);
+      } else {
+        switch ($response_array['RESULT']) {
+          case '1':
+          case '26':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_CFG_ERROR;
+            break;
+
+          case '1000':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_EXPRESS_DISABLED;
+            break;
+
+          default:
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_GENERAL;
+            break;
+        }
+
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
+      }
+
+      break;
+  }
+
+  tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/express.php 2.3.1.src/ext/modules/payment/paypal/express.php
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/express.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/express.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: express.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2009 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,39 +13,22 @@
   chdir('../../../../');
   require('includes/application_top.php');
 
-// if the customer is not logged on, redirect them to the login page
-  if (!tep_session_is_registered('customer_id')) {
-    $snapshot = array('page' => 'ext/modules/payment/paypal/express.php',
-                      'mode' => $request_type,
-                      'get' => $HTTP_GET_VARS,
-                      'post' => $HTTP_POST_VARS);
-
-    $navigation->set_snapshot($snapshot);
-
-    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
-  }
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/paypal_express.php');
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CREATE_ACCOUNT);
 
-// if there is nothing in the customers cart, redirect them to the shopping cart page
-  if ($cart->count_contents() < 1) {
-    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+// initialize variables if the customer is not logged in
+  if (!tep_session_is_registered('customer_id')) {
+    $customer_id = 0;
+    $customer_default_address_id = 0;
   }
 
   require('includes/modules/payment/paypal_express.php');
-
   $paypal_express = new paypal_express();
 
   if (!$paypal_express->check() || !$paypal_express->enabled) {
     tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
   }
 
-  if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
-    $api_url = 'https://api-3t.paypal.com/nvp';
-    $paypal_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
-  } else {
-    $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
-    $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
-  }
-
   if (!tep_session_is_registered('sendto')) {
     tep_session_register('sendto');
     $sendto = $customer_default_address_id;
@@ -61,66 +44,332 @@
   if (!tep_session_is_registered('cartID')) tep_session_register('cartID');
   $cartID = $cart->cartID;
 
-  $params = array('USER' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME,
-                  'PWD' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD,
-                  'VERSION' => '3.2',
-                  'SIGNATURE' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE);
-
   switch ($HTTP_GET_VARS['osC_Action']) {
-    case 'retrieve':
-      $params['METHOD'] = 'GetExpressCheckoutDetails';
-      $params['TOKEN'] = $HTTP_GET_VARS['token'];
+    case 'cancel':
+      tep_session_unregister('ppe_token');
 
-      $post_string = '';
+      tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL'));
 
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '=' . urlencode(trim($value)) . '&';
-      }
+      break;
+    case 'callbackSet':
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_INSTANT_UPDATE == 'True') {
+        $counter = 0;
+
+        while (true) {
+          if (isset($HTTP_POST_VARS['L_NUMBER' . $counter])) {
+            $cart->add_cart($HTTP_POST_VARS['L_NUMBER' . $counter], $HTTP_POST_VARS['L_QTY' . $counter]);
+          } else {
+            break;
+          }
 
-      $post_string = substr($post_string, 0, -1);
+          $counter++;
+        }
 
-      $response = $paypal_express->sendTransactionToGateway($api_url, $post_string);
-      $response_array = array();
-      parse_str($response, $response_array);
+// exit if there is nothing in the shopping cart
+        if ($cart->count_contents() < 1) {
+          exit;
+        }
+
+        $sendto = array('firstname' => '',
+                        'lastname' => '',
+                        'company' => '',
+                        'street_address' => '',
+                        'suburb' => '',
+                        'postcode' => $HTTP_POST_VARS['SHIPTOZIP'],
+                        'city' => $HTTP_POST_VARS['SHIPTOCITY'],
+                        'zone_id' => '',
+                        'zone_name' => $HTTP_POST_VARS['SHIPTOSTATE'],
+                        'country_id' => '',
+                        'country_name' => $HTTP_POST_VARS['SHIPTOCOUNTRY'],
+                        'country_iso_code_2' => '',
+                        'country_iso_code_3' => '',
+                        'address_format_id' => '');
+
+        $country_query = tep_db_query("select * from " . TABLE_COUNTRIES . " where countries_iso_code_2 = '" . tep_db_input($sendto['country_name']) . "' limit 1");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          $sendto['country_id'] = $country['countries_id'];
+          $sendto['country_name'] = $country['countries_name'];
+          $sendto['country_iso_code_2'] = $country['countries_iso_code_2'];
+          $sendto['country_iso_code_3'] = $country['countries_iso_code_3'];
+          $sendto['address_format_id'] = $country['address_format_id'];
+        }
+
+        if ($sendto['country_id'] > 0) {
+          $zone_query = tep_db_query("select * from " . TABLE_ZONES . " where zone_country_id = '" . (int)$sendto['country_id'] . "' and (zone_name = '" . tep_db_input($sendto['zone_name']) . "' or zone_code = '" . tep_db_input($sendto['zone_name']) . "') limit 1");
+          if (tep_db_num_rows($zone_query)) {
+            $zone = tep_db_fetch_array($zone_query);
+
+            $sendto['zone_id'] = $zone['zone_id'];
+            $sendto['zone_name'] = $zone['zone_name'];
+          }
+        }
+
+        $billto = $sendto;
+
+        $quotes_array = array();
 
-      if (($response_array['ACK'] == 'Success') || ($response_array['ACK'] == 'SuccessWithWarning')) {
         include(DIR_WS_CLASSES . 'order.php');
 
         if ($cart->get_content_type() != 'virtual') {
-          $country_iso_code_2 = tep_db_prepare_input($response_array['SHIPTOCOUNTRYCODE']);
-          $zone_code = tep_db_prepare_input($response_array['SHIPTOSTATE']);
+          $order = new order;
+
+          $total_weight = $cart->show_weight();
+          $total_count = $cart->count_contents();
+
+// load all enabled shipping modules
+          include(DIR_WS_CLASSES . 'shipping.php');
+          $shipping_modules = new shipping;
+
+          $free_shipping = false;
+
+          if ( defined('MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING') && (MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING == 'true') ) {
+            $pass = false;
+
+            switch (MODULE_ORDER_TOTAL_SHIPPING_DESTINATION) {
+              case 'national':
+                if ($order->delivery['country_id'] == STORE_COUNTRY) {
+                  $pass = true;
+                }
+                break;
+
+              case 'international':
+                if ($order->delivery['country_id'] != STORE_COUNTRY) {
+                  $pass = true;
+                }
+                break;
+
+              case 'both':
+                $pass = true;
+                break;
+            }
+
+            if ( ($pass == true) && ($order->info['total'] >= MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER) ) {
+              $free_shipping = true;
+
+              include(DIR_WS_LANGUAGES . $language . '/modules/order_total/ot_shipping.php');
+            }
+          }
+
+          if ( (tep_count_shipping_modules() > 0) || ($free_shipping == true) ) {
+            if ($free_shipping == true) {
+              $quotes_array[] = array('id' => 'free_free',
+                                      'name' => FREE_SHIPPING_TITLE,
+                                      'label' => FREE_SHIPPING_TITLE,
+                                      'cost' => '0',
+                                      'tax' => '0');
+            } else {
+// get all available shipping quotes
+              $quotes = $shipping_modules->quote();
+
+              foreach ($quotes as $quote) {
+                if (!isset($quote['error'])) {
+                  foreach ($quote['methods'] as $rate) {
+                    $quotes_array[] = array('id' => $quote['id'] . '_' . $rate['id'],
+                                            'name' => $quote['module'],
+                                            'label' => $rate['title'],
+                                            'cost' => $rate['cost'],
+                                            'tax' => isset($quote['tax']) ? $quote['tax'] : '0');
+                  }
+                }
+              }
+            }
+          }
+        } else {
+          $quotes_array[] = array('id' => 'null',
+                                  'name' => 'No Shipping',
+                                  'label' => 'No Shipping',
+                                  'cost' => '0',
+                                  'tax' => '0');
+        }
+
+        $params = array('METHOD' => 'CallbackResponse',
+                        'OFFERINSURANCEOPTION' => 'false');
+
+        $counter = 0;
+        $cheapest_rate = null;
+        $cheapest_counter = $counter;
+
+        foreach ($quotes_array as $quote) {
+          $shipping_rate = $paypal_express->format_raw($quote['cost'] + tep_calculate_tax($quote['cost'], $quote['tax']));
+
+          $params['L_SHIPPINGOPTIONNAME' . $counter] = $quote['name'] . ' (' . $quote['label'] . ')';
+          $params['L_SHIPINGPOPTIONLABEL' . $counter] = $quote['name'] . ' (' . $quote['label'] . ')';
+          $params['L_SHIPPINGOPTIONAMOUNT' . $counter] = $paypal_express->format_raw($quote['cost']);
+          $params['L_SHIPPINGOPTIONISDEFAULT' . $counter] = 'false';
+          $params['L_TAXAMT' . $counter] = $paypal_express->format_raw($order->info['tax'] + tep_calculate_tax($quote['cost'], $quote['tax']));
+
+          if (is_null($cheapest_rate) || ($shipping_rate < $cheapest_rate)) {
+            $cheapest_rate = $shipping_rate;
+            $cheapest_counter = $counter;
+          }
+
+          $counter++;
+        }
+
+        $params['L_SHIPPINGOPTIONISDEFAULT' . $cheapest_counter] = 'true';
+
+        $post_string = '';
+
+        foreach ($params as $key => $value) {
+          $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+        }
+
+        $post_string = substr($post_string, 0, -1);
+
+        echo $post_string;
+      }
+
+      exit;
+
+      break;
+    case 'retrieve':
+// if there is nothing in the customers cart, redirect them to the shopping cart page
+      if ($cart->count_contents() < 1) {
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+      }
+
+      $response_array = $paypal_express->getExpressCheckoutDetails($HTTP_GET_VARS['token']);
 
-          $country_query = tep_db_query("select countries_id, countries_name, countries_iso_code_2, countries_iso_code_3, address_format_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = '" . tep_db_input($country_iso_code_2) . "'");
+      if (($response_array['ACK'] == 'Success') || ($response_array['ACK'] == 'SuccessWithWarning')) {
+        $force_login = false;
+
+// check if e-mail address exists in database and login or create customer account
+        if (!tep_session_is_registered('customer_id')) {
+          $force_login = true;
+
+          $email_address = tep_db_prepare_input($response_array['EMAIL']);
+
+          $check_query = tep_db_query("select * from " . TABLE_CUSTOMERS . " where customers_email_address = '" . tep_db_input($email_address) . "' limit 1");
+          if (tep_db_num_rows($check_query)) {
+            $check = tep_db_fetch_array($check_query);
+
+            $customer_id = $check['customers_id'];
+            $customers_firstname = $check['customers_firstname'];
+            $customer_default_address_id = $check['customers_default_address_id'];
+          } else {
+            $customers_firstname = tep_db_prepare_input($response_array['FIRSTNAME']);
+            $customers_lastname = tep_db_prepare_input($response_array['LASTNAME']);
+
+            $customer_password = tep_create_random_value(max(ENTRY_PASSWORD_MIN_LENGTH, 8));
+
+            $sql_data_array = array('customers_firstname' => $customers_firstname,
+                                    'customers_lastname' => $customers_lastname,
+                                    'customers_email_address' => $email_address,
+                                    'customers_telephone' => '',
+                                    'customers_fax' => '',
+                                    'customers_newsletter' => '0',
+                                    'customers_password' => tep_encrypt_password($customer_password));
+
+            if (isset($response_array['PHONENUM']) && tep_not_null($response_array['PHONENUM'])) {
+              $customers_telephone = tep_db_prepare_input($response_array['PHONENUM']);
+
+              $sql_data_array['customers_telephone'] = $customers_telephone;
+            }
+
+            tep_db_perform(TABLE_CUSTOMERS, $sql_data_array);
+
+            $customer_id = tep_db_insert_id();
+
+            tep_db_query("insert into " . TABLE_CUSTOMERS_INFO . " (customers_info_id, customers_info_number_of_logons, customers_info_date_account_created) values ('" . (int)$customer_id . "', '0', now())");
+
+// build the message content
+            $name = $customers_firstname . ' ' . $customers_lastname;
+            $email_text = sprintf(EMAIL_GREET_NONE, $customers_firstname) . EMAIL_WELCOME . sprintf(MODULE_PAYMENT_PAYPAL_EXPRESS_EMAIL_PASSWORD, $email_address, $customer_password) . EMAIL_TEXT . EMAIL_CONTACT . EMAIL_WARNING;
+            tep_mail($name, $email_address, EMAIL_SUBJECT, $email_text, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+          }
+
+          if (SESSION_RECREATE == 'True') {
+            tep_session_recreate();
+          }
+
+          $customer_first_name = $customers_firstname;
+          tep_session_register('customer_id');
+          tep_session_register('customer_first_name');
+
+// reset session token
+          $sessiontoken = md5(tep_rand() . tep_rand() . tep_rand() . tep_rand());
+        }
+
+// check if paypal shipping address exists in the address book
+        $ship_firstname = tep_db_prepare_input(substr($response_array['SHIPTONAME'], 0, strpos($response_array['SHIPTONAME'], ' ')));
+        $ship_lastname = tep_db_prepare_input(substr($response_array['SHIPTONAME'], strpos($response_array['SHIPTONAME'], ' ')+1));
+        $ship_address = tep_db_prepare_input($response_array['SHIPTOSTREET']);
+        $ship_city = tep_db_prepare_input($response_array['SHIPTOCITY']);
+        $ship_zone = tep_db_prepare_input($response_array['SHIPTOSTATE']);
+        $ship_zone_id = 0;
+        $ship_postcode = tep_db_prepare_input($response_array['SHIPTOZIP']);
+        $ship_country = tep_db_prepare_input($response_array['SHIPTOCOUNTRYCODE']);
+        $ship_country_id = 0;
+        $ship_address_format_id = 1;
+
+        $country_query = tep_db_query("select countries_id, address_format_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = '" . tep_db_input($ship_country) . "' limit 1");
+        if (tep_db_num_rows($country_query)) {
           $country = tep_db_fetch_array($country_query);
 
-          $zone_name = $response_array['SHIPTOSTATE'];
-          $zone_id = 0;
+          $ship_country_id = $country['countries_id'];
+          $ship_address_format_id = $country['address_format_id'];
+        }
 
-          $zone_query = tep_db_query("select zone_id, zone_name from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country['countries_id'] . "' and zone_code = '" . tep_db_input($zone_code) . "'");
+        if ($ship_country_id > 0) {
+          $zone_query = tep_db_query("select zone_id from " . TABLE_ZONES . " where zone_country_id = '" . (int)$ship_country_id . "' and (zone_name = '" . tep_db_input($ship_zone) . "' or zone_code = '" . tep_db_input($ship_zone) . "') limit 1");
           if (tep_db_num_rows($zone_query)) {
             $zone = tep_db_fetch_array($zone_query);
 
-            $zone_name = $zone['zone_name'];
-            $zone_id = $zone['zone_id'];
+            $ship_zone_id = $zone['zone_id'];
           }
+        }
+
+        $check_query = tep_db_query("select address_book_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' and entry_firstname = '" . tep_db_input($ship_firstname) . "' and entry_lastname = '" . tep_db_input($ship_lastname) . "' and entry_street_address = '" . tep_db_input($ship_address) . "' and entry_postcode = '" . tep_db_input($ship_postcode) . "' and entry_city = '" . tep_db_input($ship_city) . "' and (entry_state = '" . tep_db_input($ship_zone) . "' or entry_zone_id = '" . (int)$ship_zone_id . "') and entry_country_id = '" . (int)$ship_country_id . "' limit 1");
+        if (tep_db_num_rows($check_query)) {
+          $check = tep_db_fetch_array($check_query);
+
+          $sendto = $check['address_book_id'];
+        } else {
+          $sql_data_array = array('customers_id' => $customer_id,
+                                  'entry_firstname' => $ship_firstname,
+                                  'entry_lastname' => $ship_lastname,
+                                  'entry_street_address' => $ship_address,
+                                  'entry_postcode' => $ship_postcode,
+                                  'entry_city' => $ship_city,
+                                  'entry_country_id' => $ship_country_id);
+
+          if (ACCOUNT_STATE == 'true') {
+            if ($ship_zone_id > 0) {
+              $sql_data_array['entry_zone_id'] = $ship_zone_id;
+              $sql_data_array['entry_state'] = '';
+            } else {
+              $sql_data_array['entry_zone_id'] = '0';
+              $sql_data_array['entry_state'] = $ship_zone;
+            }
+          }
+
+          tep_db_perform(TABLE_ADDRESS_BOOK, $sql_data_array);
 
-          $sendto = array('firstname' => substr($response_array['SHIPTONAME'], 0, strpos($response_array['SHIPTONAME'], ' ')),
-                          'lastname' => substr($response_array['SHIPTONAME'], strpos($response_array['SHIPTONAME'], ' ')+1),
-                          'company' => '',
-                          'street_address' => $response_array['SHIPTOSTREET'],
-                          'suburb' => '',
-                          'postcode' => $response_array['SHIPTOZIP'],
-                          'city' => $response_array['SHIPTOCITY'],
-                          'zone_id' => $zone_id,
-                          'zone_name' => $zone_name,
-                          'country_id' => $country['countries_id'],
-                          'country_name' => $country['countries_name'],
-                          'country_iso_code_2' => $country['countries_iso_code_2'],
-                          'country_iso_code_3' => $country['countries_iso_code_3'],
-                          'address_format_id' => ($country['address_format_id'] > 0 ? $country['address_format_id'] : '1'));
+          $address_id = tep_db_insert_id();
+
+          $sendto = $address_id;
+
+          if ($customer_default_address_id < 1) {
+            tep_db_query("update " . TABLE_CUSTOMERS . " set customers_default_address_id = '" . (int)$address_id . "' where customers_id = '" . (int)$customer_id . "'");
+            $customer_default_address_id = $address_id;
+          }
+        }
+
+        if ($force_login == true) {
+          $customer_country_id = $ship_country_id;
+          $customer_zone_id = $ship_zone_id;
+          tep_session_register('customer_default_address_id');
+          tep_session_register('customer_country_id');
+          tep_session_register('customer_zone_id');
 
           $billto = $sendto;
+        }
 
+        include(DIR_WS_CLASSES . 'order.php');
+
+        if ($cart->get_content_type() != 'virtual') {
           $order = new order;
 
           $total_weight = $cart->show_weight();
@@ -170,9 +419,30 @@
 // get all available shipping quotes
               $quotes = $shipping_modules->quote();
 
+              $shipping_set = false;
+
+// if available, set the selected shipping rate from PayPals order review page
+              if (isset($response_array['SHIPPINGOPTIONNAME']) && isset($response_array['SHIPPINGOPTIONAMOUNT'])) {
+                foreach ($quotes as $quote) {
+                  if (!isset($quote['error'])) {
+                    foreach ($quote['methods'] as $rate) {
+                      if ($response_array['SHIPPINGOPTIONNAME'] == $quote['module'] . ' (' . $rate['title'] . ')') {
+                        if ($response_array['SHIPPINGOPTIONAMOUNT'] == $paypal_express->format_raw($rate['cost'] + tep_calculate_tax($rate['cost'], $quote['tax']))) {
+                          $shipping = $quote['id'] . '_' . $rate['id'];
+                          $shipping_set = true;
+                          break 2;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+
+              if ($shipping_set == false) {
 // select cheapest shipping method
-              $shipping = $shipping_modules->cheapest();
-              $shipping = $shipping['id'];
+                $shipping = $shipping_modules->cheapest();
+                $shipping = $shipping['id'];
+              }
             }
           }
 
@@ -200,34 +470,29 @@
               }
             }
           }
-
-          if (!tep_session_is_registered('payment')) tep_session_register('payment');
-          $payment = $paypal_express->code;
-
-          if (!tep_session_is_registered('ppe_token')) tep_session_register('ppe_token');
-          $ppe_token = $response_array['TOKEN'];
-
-          if (!tep_session_is_registered('ppe_payerid')) tep_session_register('ppe_payerid');
-          $ppe_payerid = $response_array['PAYERID'];
-
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
         } else {
           if (!tep_session_is_registered('shipping')) tep_session_register('shipping');
           $shipping = false;
 
           $sendto = false;
+        }
 
-          if (!tep_session_is_registered('payment')) tep_session_register('payment');
-          $payment = $paypal_express->code;
+        if (!tep_session_is_registered('payment')) tep_session_register('payment');
+        $payment = $paypal_express->code;
 
-          if (!tep_session_is_registered('ppe_token')) tep_session_register('ppe_token');
-          $ppe_token = $response_array['TOKEN'];
+        if (!tep_session_is_registered('ppe_token')) tep_session_register('ppe_token');
+        $ppe_token = $response_array['TOKEN'];
 
-          if (!tep_session_is_registered('ppe_payerid')) tep_session_register('ppe_payerid');
-          $ppe_payerid = $response_array['PAYERID'];
+        if (!tep_session_is_registered('ppe_payerid')) tep_session_register('ppe_payerid');
+        $ppe_payerid = $response_array['PAYERID'];
 
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
-        }
+        if (!tep_session_is_registered('ppe_payerstatus')) tep_session_register('ppe_payerstatus');
+        $ppe_payerstatus = $response_array['PAYERSTATUS'];
+
+        if (!tep_session_is_registered('ppe_addressstatus')) tep_session_register('ppe_addressstatus');
+        $ppe_addressstatus = $response_array['ADDRESSSTATUS'];
+
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
       } else {
         tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . stripslashes($response_array['L_LONGMESSAGE0']), 'SSL'));
       }
@@ -235,34 +500,180 @@
       break;
 
     default:
+// if there is nothing in the customers cart, redirect them to the shopping cart page
+      if ($cart->count_contents() < 1) {
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+      }
+
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+        $paypal_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
+      } else {
+        $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
+      }
+
       include(DIR_WS_CLASSES . 'order.php');
       $order = new order;
 
-      $params['METHOD'] = 'SetExpressCheckout';
-      $params['PAYMENTACTION'] = ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD == 'Sale') ? 'Sale' : 'Authorization');
-      $params['RETURNURL'] = tep_href_link('ext/modules/payment/paypal/express.php', 'osC_Action=retrieve', 'SSL', true, false);
-      $params['CANCELURL'] = tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL', true, false);
-      $params['AMT'] = $paypal_express->format_raw($order->info['total']);
-      $params['CURRENCYCODE'] = $order->info['currency'];
+      $params = array('CURRENCYCODE' => $order->info['currency']);
+
+// A billing address is required for digital orders so we use the shipping address PayPal provides
+//      if ($order->content_type == 'virtual') {
+//        $params['NOSHIPPING'] = '1';
+//      }
+
+      $line_item_no = 0;
+      $items_total = 0;
+      $tax_total = 0;
+
+      foreach ($order->products as $product) {
+        $params['L_NAME' . $line_item_no] = $product['name'];
+        $params['L_AMT' . $line_item_no] = $paypal_express->format_raw($product['final_price']);
+        $params['L_NUMBER' . $line_item_no] = $product['id'];
+        $params['L_QTY' . $line_item_no] = $product['qty'];
+
+        $product_tax = tep_calculate_tax($product['final_price'], $product['tax']);
+
+        $params['L_TAXAMT' . $line_item_no] = $paypal_express->format_raw($product_tax);
+        $tax_total += $paypal_express->format_raw($product_tax) * $product['qty'];
+
+        $items_total += $paypal_express->format_raw($product['final_price']) * $product['qty'];
+
+        $line_item_no++;
+      }
+
+      $params['ITEMAMT'] = $items_total;
+      $params['TAXAMT'] = $tax_total;
+
+      if (tep_not_null($order->delivery['firstname'])) {
+        $params['ADDROVERRIDE'] = '1';
+        $params['SHIPTONAME'] = $order->delivery['firstname'] . ' ' . $order->delivery['lastname'];
+        $params['SHIPTOSTREET'] = $order->delivery['street_address'];
+        $params['SHIPTOCITY'] = $order->delivery['city'];
+        $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
+        $params['SHIPTOCOUNTRYCODE'] = $order->delivery['country']['iso_code_2'];
+        $params['SHIPTOZIP'] = $order->delivery['postcode'];
+      }
+
+      $quotes_array = array();
+
+      if ($cart->get_content_type() != 'virtual') {
+        $total_weight = $cart->show_weight();
+        $total_count = $cart->count_contents();
+
+// load all enabled shipping modules
+        include(DIR_WS_CLASSES . 'shipping.php');
+        $shipping_modules = new shipping;
+
+        $free_shipping = false;
+
+        if ( defined('MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING') && (MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING == 'true') ) {
+          $pass = false;
+
+          switch (MODULE_ORDER_TOTAL_SHIPPING_DESTINATION) {
+            case 'national':
+              if ($order->delivery['country_id'] == STORE_COUNTRY) {
+                $pass = true;
+              }
+              break;
+
+            case 'international':
+              if ($order->delivery['country_id'] != STORE_COUNTRY) {
+                $pass = true;
+              }
+              break;
+
+            case 'both':
+              $pass = true;
+              break;
+          }
+
+          if ( ($pass == true) && ($order->info['total'] >= MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER) ) {
+            $free_shipping = true;
+
+            include(DIR_WS_LANGUAGES . $language . '/modules/order_total/ot_shipping.php');
+          }
+        }
 
-      if ($order->content_type == 'virtual') {
-        $params['NOSHIPPING'] = '1';
+        if ( (tep_count_shipping_modules() > 0) || ($free_shipping == true) ) {
+          if ($free_shipping == true) {
+            $quotes_array[] = array('id' => 'free_free',
+                                    'name' => FREE_SHIPPING_TITLE,
+                                    'label' => FREE_SHIPPING_TITLE,
+                                    'cost' => '0.00',
+                                    'tax' => '0');
+          } else {
+// get all available shipping quotes
+            $quotes = $shipping_modules->quote();
+
+            foreach ($quotes as $quote) {
+              if (!isset($quote['error'])) {
+                foreach ($quote['methods'] as $rate) {
+                  $quotes_array[] = array('id' => $quote['id'] . '_' . $rate['id'],
+                                          'name' => $quote['module'],
+                                          'label' => $rate['title'],
+                                          'cost' => $rate['cost'],
+                                          'tax' => $quote['tax']);
+                }
+              }
+            }
+          }
+        }
+      }
+
+      $counter = 0;
+      $cheapest_rate = null;
+      $expensive_rate = 0;
+      $cheapest_counter = $counter;
+      $default_shipping = null;
+
+      foreach ($quotes_array as $quote) {
+        $shipping_rate = $paypal_express->format_raw($quote['cost'] + tep_calculate_tax($quote['cost'], $quote['tax']));
+
+        $params['L_SHIPPINGOPTIONNAME' . $counter] = $quote['name'] . ' (' . $quote['label'] . ')';
+        $params['L_SHIPINGPOPTIONLABEL' . $counter] = $quote['name'] . ' (' . $quote['label'] . ')';
+        $params['L_SHIPPINGOPTIONAMOUNT' . $counter] = $shipping_rate;
+        $params['L_SHIPPINGOPTIONISDEFAULT' . $counter] = 'false';
+
+        if (is_null($cheapest_rate) || ($shipping_rate < $cheapest_rate)) {
+          $cheapest_rate = $shipping_rate;
+          $cheapest_counter = $counter;
+        }
+
+        if ($shipping_rate > $expensive_rate) {
+          $expensive_rate = $shipping_rate;
+        }
+
+        if (tep_not_null($shipping) && ($shipping['id'] == $quote['id'])) {
+          $default_shipping = $counter;
+        }
+
+        $counter++;
       }
 
-      $post_string = '';
+      if (!is_null($default_shipping)) {
+        $cheapest_rate = $params['L_SHIPPINGOPTIONAMOUNT' . $default_shipping];
+        $cheapest_counter = $default_shipping;
+      }
+
+      if (!is_null($cheapest_rate)) {
+        if ( (MODULE_PAYMENT_PAYPAL_EXPRESS_INSTANT_UPDATE == 'True') && ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER != 'Live') || ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') && (ENABLE_SSL == true))) ) { // Live server requires SSL to be enabled
+          $params['CALLBACK'] = tep_href_link('ext/modules/payment/paypal/express.php', 'osC_Action=callbackSet', 'SSL', false, false);
+          $params['CALLBACKTIMEOUT'] = '5';
+        }
 
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '=' . urlencode(trim($value)) . '&';
+        $params['INSURANCEOPTIONSOFFERED'] = 'false';
+        $params['L_SHIPPINGOPTIONISDEFAULT' . $cheapest_counter] = 'true';
       }
 
-      $post_string = substr($post_string, 0, -1);
+// don't recalculate currency values as they have already been calculated
+      $params['SHIPPINGAMT'] = $paypal_express->format_raw($cheapest_rate, '', 1);
+      $params['AMT'] = $paypal_express->format_raw($params['ITEMAMT'] + $params['TAXAMT'] + $params['SHIPPINGAMT'], '', 1);
+      $params['MAXAMT'] = $paypal_express->format_raw($params['AMT'] + $expensive_rate + 100, '', 1); // safely pad higher for dynamic shipping rates (eg, USPS express)
 
-      $response = $paypal_express->sendTransactionToGateway($api_url, $post_string);
-      $response_array = array();
-      parse_str($response, $response_array);
+      $response_array = $paypal_express->setExpressCheckout($params);
 
       if (($response_array['ACK'] == 'Success') || ($response_array['ACK'] == 'SuccessWithWarning')) {
-        tep_redirect($paypal_url . '&token=' . $response_array['TOKEN']);
+        tep_redirect($paypal_url . '&token=' . $response_array['TOKEN'] . '&useraction=commit');
       } else {
         tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . stripslashes($response_array['L_LONGMESSAGE0']), 'SSL'));
       }
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/express_uk.php 2.3.1.src/ext/modules/payment/paypal/express_uk.php
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/express_uk.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/express_uk.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,317 +0,0 @@
-<?php
-/*
-  $Id: express_uk.php 1803 2008-01-11 18:16:37Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  chdir('../../../../');
-  require('includes/application_top.php');
-
-// if the customer is not logged on, redirect them to the login page
-  if (!tep_session_is_registered('customer_id')) {
-    $snapshot = array('page' => 'ext/modules/payment/paypal/express_uk.php',
-                      'mode' => $request_type,
-                      'get' => $HTTP_GET_VARS,
-                      'post' => $HTTP_POST_VARS);
-
-    $navigation->set_snapshot($snapshot);
-
-    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
-  }
-
-// if there is nothing in the customers cart, redirect them to the shopping cart page
-  if ($cart->count_contents() < 1) {
-    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
-  }
-
-  require(DIR_WS_LANGUAGES . $language . '/modules/payment/paypal_uk_express.php');
-  require('includes/modules/payment/paypal_uk_express.php');
-
-  $paypal_uk_express = new paypal_uk_express();
-
-  if (!$paypal_uk_express->check() || !$paypal_uk_express->enabled) {
-    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
-  }
-
-  if (MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_SERVER == 'Live') {
-    $api_url = 'https://payflowpro.verisign.com/transaction';
-    $paypal_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
-  } else {
-    $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
-    $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout';
-  }
-
-  if (!tep_session_is_registered('sendto')) {
-    tep_session_register('sendto');
-    $sendto = $customer_default_address_id;
-  }
-
-  if (!tep_session_is_registered('billto')) {
-    tep_session_register('billto');
-    $billto = $customer_default_address_id;
-  }
-
-// register a random ID in the session to check throughout the checkout procedure
-// against alterations in the shopping cart contents
-  if (!tep_session_is_registered('cartID')) tep_session_register('cartID');
-  $cartID = $cart->cartID;
-
-  $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME) ? MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME : MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR),
-                  'VENDOR' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR,
-                  'PARTNER' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PARTNER,
-                  'PWD' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PASSWORD,
-                  'TENDER' => 'P',
-                  'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'));
-
-  switch ($HTTP_GET_VARS['osC_Action']) {
-    case 'retrieve':
-      $params['ACTION'] = 'G';
-      $params['TOKEN'] = $HTTP_GET_VARS['token'];
-
-      $post_string = '';
-
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '[' . strlen(trim($value)) . ']=' . trim($value) . '&';
-      }
-
-      $post_string = substr($post_string, 0, -1);
-
-      $response = $paypal_uk_express->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
-      $response_array = array();
-      parse_str($response, $response_array);
-
-      if ($response_array['RESULT'] == '0') {
-        include(DIR_WS_CLASSES . 'order.php');
-
-        if ($cart->get_content_type() != 'virtual') {
-          $country_iso_code_2 = tep_db_prepare_input($response_array['SHIPTOCOUNTRY']);
-          $zone_code = tep_db_prepare_input($response_array['SHIPTOSTATE']);
-
-          $country_query = tep_db_query("select countries_id, countries_name, countries_iso_code_2, countries_iso_code_3, address_format_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = '" . tep_db_input($country_iso_code_2) . "'");
-          $country = tep_db_fetch_array($country_query);
-
-          $zone_name = $response_array['SHIPTOSTATE'];
-          $zone_id = 0;
-
-          $zone_query = tep_db_query("select zone_id, zone_name from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country['countries_id'] . "' and zone_code = '" . tep_db_input($zone_code) . "'");
-          if (tep_db_num_rows($zone_query)) {
-            $zone = tep_db_fetch_array($zone_query);
-
-            $zone_name = $zone['zone_name'];
-            $zone_id = $zone['zone_id'];
-          }
-
-          $sendto = array('firstname' => $response_array['FIRSTNAME'],
-                          'lastname' => $response_array['LASTNAME'],
-                          'company' => '',
-                          'street_address' => $response_array['SHIPTOSTREET'],
-                          'suburb' => '',
-                          'postcode' => $response_array['SHIPTOZIP'],
-                          'city' => $response_array['SHIPTOCITY'],
-                          'zone_id' => $zone_id,
-                          'zone_name' => $zone_name,
-                          'country_id' => $country['countries_id'],
-                          'country_name' => $country['countries_name'],
-                          'country_iso_code_2' => $country['countries_iso_code_2'],
-                          'country_iso_code_3' => $country['countries_iso_code_3'],
-                          'address_format_id' => ($country['address_format_id'] > 0 ? $country['address_format_id'] : '1'));
-
-          $billto = $sendto;
-
-          $order = new order;
-
-          $total_weight = $cart->show_weight();
-          $total_count = $cart->count_contents();
-
-// load all enabled shipping modules
-          include(DIR_WS_CLASSES . 'shipping.php');
-          $shipping_modules = new shipping;
-
-          $free_shipping = false;
-
-          if ( defined('MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING') && (MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING == 'true') ) {
-            $pass = false;
-
-            switch (MODULE_ORDER_TOTAL_SHIPPING_DESTINATION) {
-              case 'national':
-                if ($order->delivery['country_id'] == STORE_COUNTRY) {
-                  $pass = true;
-                }
-                break;
-
-              case 'international':
-                if ($order->delivery['country_id'] != STORE_COUNTRY) {
-                  $pass = true;
-                }
-                break;
-
-              case 'both':
-                $pass = true;
-                break;
-            }
-
-            if ( ($pass == true) && ($order->info['total'] >= MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER) ) {
-              $free_shipping = true;
-
-              include(DIR_WS_LANGUAGES . $language . '/modules/order_total/ot_shipping.php');
-            }
-          }
-
-          if (!tep_session_is_registered('shipping')) tep_session_register('shipping');
-          $shipping = false;
-
-          if ( (tep_count_shipping_modules() > 0) || ($free_shipping == true) ) {
-            if ($free_shipping == true) {
-              $shipping = 'free_free';
-            } else {
-// get all available shipping quotes
-              $quotes = $shipping_modules->quote();
-
-// select cheapest shipping method
-              $shipping = $shipping_modules->cheapest();
-              $shipping = $shipping['id'];
-            }
-          }
-
-          if (strpos($shipping, '_')) {
-            list($module, $method) = explode('_', $shipping);
-
-            if ( is_object($$module) || ($shipping == 'free_free') ) {
-              if ($shipping == 'free_free') {
-                $quote[0]['methods'][0]['title'] = FREE_SHIPPING_TITLE;
-                $quote[0]['methods'][0]['cost'] = '0';
-              } else {
-                $quote = $shipping_modules->quote($method, $module);
-              }
-
-              if (isset($quote['error'])) {
-                tep_session_unregister('shipping');
-
-                tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
-              } else {
-                if ( (isset($quote[0]['methods'][0]['title'])) && (isset($quote[0]['methods'][0]['cost'])) ) {
-                  $shipping = array('id' => $shipping,
-                                    'title' => (($free_shipping == true) ?  $quote[0]['methods'][0]['title'] : $quote[0]['module'] . ' (' . $quote[0]['methods'][0]['title'] . ')'),
-                                    'cost' => $quote[0]['methods'][0]['cost']);
-                }
-              }
-            }
-          }
-
-          if (!tep_session_is_registered('payment')) tep_session_register('payment');
-          $payment = $paypal_uk_express->code;
-
-          if (!tep_session_is_registered('ppeuk_token')) tep_session_register('ppeuk_token');
-          $ppeuk_token = $response_array['TOKEN'];
-
-          if (!tep_session_is_registered('ppeuk_payerid')) tep_session_register('ppeuk_payerid');
-          $ppeuk_payerid = $response_array['PAYERID'];
-
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
-        } else {
-          if (!tep_session_is_registered('shipping')) tep_session_register('shipping');
-          $shipping = false;
-
-          $sendto = false;
-
-          if (!tep_session_is_registered('payment')) tep_session_register('payment');
-          $payment = $paypal_uk_express->code;
-
-          if (!tep_session_is_registered('ppeuk_token')) tep_session_register('ppeuk_token');
-          $ppeuk_token = $response_array['TOKEN'];
-
-          if (!tep_session_is_registered('ppeuk_payerid')) tep_session_register('ppeuk_payerid');
-          $ppeuk_payerid = $response_array['PAYERID'];
-
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL'));
-        }
-      } else {
-        switch ($response_array['RESULT']) {
-          case '1':
-          case '26':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR;
-            break;
-
-          case '7':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_ADDRESS;
-            break;
-
-          case '12':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_DECLINED;
-            break;
-
-          case '1000':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED;
-            break;
-
-          default:
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL;
-            break;
-        }
-
-        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
-      }
-
-      break;
-
-    default:
-      include(DIR_WS_CLASSES . 'order.php');
-      $order = new order;
-
-      $params['ACTION'] = 'S';
-      $params['CURRENCY'] = $order->info['currency'];
-      $params['EMAIL'] = $order->customer['email_address'];
-      $params['AMT'] = $paypal_uk_express->format_raw($order->info['total']);
-      $params['RETURNURL'] = tep_href_link('ext/modules/payment/paypal/express_uk.php', 'osC_Action=retrieve', 'SSL', true, false);
-      $params['CANCELURL'] = tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL', true, false);
-
-      if ($order->content_type == 'virtual') {
-        $params['NOSHIPPING'] = '1';
-      }
-
-      $post_string = '';
-
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '[' . strlen(trim($value)) . ']=' . trim($value) . '&';
-      }
-
-      $post_string = substr($post_string, 0, -1);
-
-      $response = $paypal_uk_express->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
-      $response_array = array();
-      parse_str($response, $response_array);
-
-      if ($response_array['RESULT'] == '0') {
-        tep_redirect($paypal_url . '&token=' . $response_array['TOKEN']);
-      } else {
-        switch ($response_array['RESULT']) {
-          case '1':
-          case '26':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR;
-            break;
-
-          case '1000':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED;
-            break;
-
-          default:
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL;
-            break;
-        }
-
-        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
-      }
-
-      break;
-  }
-
-  tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, '', 'SSL'));
-
-  require(DIR_WS_INCLUDES . 'application_bottom.php');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express_espanol.gif 2.3.1.src/ext/modules/payment/paypal/images/btn_express_espanol.gif
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express_espanol.gif	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/images/btn_express_espanol.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-GIF89a *  +ƨʤ5_ry;eEؒ>l񎗐j\9Oϓ3OXSdЃϾշӜҭ\౞ٞɹ۶V΂puz0sɛ43oщԑ/TtlA.awڢ)֖)ٕ<ݞ?b}QY7JnGaOkٚzL~0-֘ԈY?^wsfogJ'RHf@f̏wF LyݧҎwPsJq/IZMy_`P>B_`$ܚ-ߢ-'$@p%0Y@Ӑ,~A`%?cϯ:/ߛ01@o͗oFޟ؏ۭOogܹ_OM@oř΀א|=ܢ^(&#3f 3f!   ,     *   	8H@(\ȰÇ#JHED!B9l bU(S\ɲ˗0cʜIS&1g(llxcGC6@i#H*]ʴӧPJJu2VA7Ă `p!]Ҫ]˶۷pzÅuWQݻꞍ;W`v)%+.>%|XqŹϮ8F:ШS{^%TfըvlJ.5DfAuոBA#șËp_>1@ɟG"GG&Y#ɀqK?&xHb~~)VO\ўx|`xcDGXL% ˊ,!?2pp?,6ǢL|L8hq&> J
LSFd
8fA ͋x&ā6XDI72&袌'<K'\O3?Wp"g|#<|0MHP9\<#	
-A0,G8越bIQP2 {
0@110K/8_
-13
-IP'IP##qC	2l{ 2dn,{Lu:"<|c`s<	BK,%Dl󈫷1# q"0
@3)F/mG./AP)A	ȇ	5@ы| 	3̠-S*Kw	"!G"S "P.t"
-l 
-xA!"oH !~;`O C-/> t |Тgc$X0Z4ll[4"o&P{E<=lO	
-a:PW(L
-WhBkD,Ta7ymhf7
-X`)@)bQt#,!8Vу@E%xX<*@2hLX3amaX#z'* mB6AC "PAĻ5y 6=E*A{5@RJH*WV@lp@OX M!W
cFp@PCxF 'MC0{eVЉXnP@)Kc(,vd)L")A8<ՀMg̧	ZhBDqxԑ!dϖ
-A? 8ͩNwӞ@	@OS8)26?O̡ *Hh1[0-<L>F7/i
#h: `A7>K(	Cc Th V=X 8_ c86/ơ\b>(_hj`!$@: 
l&	Nh
-P:װ](>zU2R!Y( bqw P@	PAۥ@0
̡=P%0M9 07A
-I  w@*A _{Gl}t
-TQGF tA`gLxg*@:@G$XH>"ƬЈC#$aI1/lZXβk^C?fJ 0-A:x3̆<π69lcD? l-XH#
-N{.`|~$(H+	>pڅZ?ָεK
c( vM] 6O`"l 	Mj[vo0MrNvMnn~w7n{L"|"O^q[s"߸K	r{6\;}Nt|Fq>r\8gM9a{=Hѹ~u;=<ԿtcMuu_rsQwyg^7u?`8pf;{ʋ/77y{OWֻgOr ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express_german.gif 2.3.1.src/ext/modules/payment/paypal/images/btn_express_german.gif
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express_german.gif	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/images/btn_express_german.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-GIF89a *  νTZQљҭˤ+'6LYµ6=iָEҾߢؒj?a}9On~\o`ũ_xdЃ֞ګ\ٞʻ۶Vߜ2΂pu/Uvz0s33_t~щԑڎlA.֖ۢϓ2)ٔOj{<ݟQYJaOmٚ?^wzLvC~0-Ip֘Ԉߚ-Ys|=fogK'RHf@f LyݧҎwPsMy5?`nFA^$-ܚ-@o'@p$Ǔ0Y%@Ӑ,%ʰ/pJϦ^țڏ߭FMg?Vd؏^뼠ܹ@ooOřƿπא(&#3f 3f!   ,     *   	8pʗ	V(\ȰÇ#JHE&|BD2r3Z(S\ɲ˗0cʜIS3k7@cQJtcH*]ʴӧPJJuQ?hu)%!12Ҫ]˶۷p-̙`xIV[wݳe,UPcr1*>r̹ϠCY30F ;Be̤=SF+Y
-t=B`=;%!#xJ}X1rzurxkνwN<#ڋ@qdb5O6_4Vk0$$a~+	 :UtD'}O
ˋ0(4H?@5¸D
@`lS
-}HhrtaKJl`h%jJEX h)A(sX $4:BO8b3 R 
4'4j4,J f角Rp#7V:tC_*@7(?t 6(7س*x&Z$L4ء`4$Z|7 %}	*CPfJ'B
-VpRH*E
R@20pH|Hp@J	HÊK@Ї		ֈr+'IӋ t|yQa(arC	ƻ
| s <@>#.KR @5:4UYc2P{O6J.$`r?Ģ(&ʘL&e?v $h9m
To0G
 O ;k{E2$;Ƴ;4@?ưH2/p7GW4"ˎ1w@(!
-j.@A `?V@0$HA
-$!(!I
-0 0^: wsZeFB`cQ7c7dP2Bp	G&C.2&1a\tУ7!.P0(Bx̣
|`z0 A  " ґTTJYKa]l@Vt8`89Q
hA
-8K8T.嘄w "0EP(L2e:Ü" 2 `6A(9Q`B
7'ޚ ^Ѕ
f> 
-uarĂv,PCZІ:D'Qmc-6Z!d1! 2xVpDdq>0K,9@$88G!IP1nAժZXͪVի2!_.nQAȁR'~gaL	fB4r
-8ܡ %GUjL`9"vZͬf7&,?fN)@@ ,Q0C	D@A	{UPL$.qt
lz
x]4 -h DLGPwqrP4LqrPfHD&]*"
-(B1paQ]7
]DD*TV؇gL8α)W(@q^RB	@ !2nD
-V!	I(2P#.DX"<WHq A!2p%gP/1!D?NF;ѦfQY8]E#
/]GZ	E#V#؇>!~0#Ee=aNf7@Y
<
-Q8'MngC.j\(Mz;h7qa.p]wX@Bʦ䍸'^Ox݅ő7P!DB	 0gNs
-%w@ЇNHOҗ;Pԧ>|=:Qut'_שng;ڇ=d/zحvӧf_~kv޵.wqWw¯zw;wPW<!z˓?}Cu·V9y׋^򫯼7~Wxћ=;w㿾/<U/>ׯ{OO ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express.gif 2.3.1.src/ext/modules/payment/paypal/images/btn_express.gif
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/images/btn_express.gif	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/images/btn_express.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-GIF89a * ? 7d#%+e1g 3f@0ܜؓ=r$Go2PuCt%\rl~ZuԃvGONh~ͬ!>j@]|6LY__O8ɻĘA^Д4.+h!  ? ,     *  pH!&cl:ШtJZҔh(zʣCDzn|NG$Σ
-
-{}EdB$$ͻμ̢`
-
 -0
-\	8qZ1C
-dd8W@(Oj $Ȝ)顅8R2>8ȱB)UFȑԩեY&X
-4ԠR!L(E73KWALErTT0b4DM|
-5:ֱ-W6p%%@b@XO&TVŋ'˼	NhD@Af&5@!X0
 xTD#|QST }@|VAS7 ,Ԁq'I\Pp |@e|	0ԔɔM3]~0c`~)HPT&#8 BNPڗ2dF%lPAxBÙ P)' TBeyO,nJA(pJ/{lL-x	`@3]`qɧ\IeS;	j0Yj0u8֑+pZA&Aə H	6B'ZB$Td$%@(V@	&3xiڸ8$(X #4%A2H Ui*HZ g8Y_o&ޞ)ԐAz	
-dքADd`AZj.`xl!¾@`xlW-# Q[}8 l]5.Ȣ:tA	m@8R!  P4}CQxN 	D.WnW n,@(mB 0/pn	Ƕ!_O0 	"(ɸ!A7><l>D/xp8&]'50,%B	C<ꮴ긗L@
-<t@CP
-:(@
-4
-@	|jxDPli X~d;$`R 	sOd҂<p
-!@"H<"
-P%ΠNh0/-@SLx H@ZTI
- @\'	`I	R]Q`q DL"D<lF\"
-t(@$iF:I O@G$jEm $@ %*(@.҈b]MxB$` 4`҆`Rdf  <d
L)GF(- ؀b #pG (H8>`@&8@.Ѕ"@JЂ
-TS\b$ 5A{HZ",pT;eR Px$(HP\T V`W	 A]F}A`uCK @rBjT	 ` NSi^):p/P`@h ֶD\J׺ڵl)pC-b>4` :h*ZЊ֗hGX	B" -cJ@[*6ͭnw[q b;̖Mr:ЍtK]ڮո%Bˀy
xKv|Km@z LNp;'L
-[}P PacX0Ea"8'&1S!%/>Pbo4ްgl50O 9q{d!w/ޱl#GUv\d,xE 3e)TG08A1,$;,s\f3G;q/B̃shC3zƉtfCk`fwZy'=4[dvMd%Gٝ33`YyָV[Y ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/paypal/standard_ipn.php 2.3.1.src/ext/modules/payment/paypal/standard_ipn.php
--- 2.2rc2a.cp.src/ext/modules/payment/paypal/standard_ipn.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/paypal/standard_ipn.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: standard_ipn.php 1778 2008-01-09 23:37:44Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,6 +13,10 @@
   chdir('../../../../');
   require('includes/application_top.php');
 
+  if (!defined('MODULE_PAYMENT_PAYPAL_STANDARD_STATUS') || (MODULE_PAYMENT_PAYPAL_STANDARD_STATUS  != 'True')) {
+    exit;
+  }
+
   $parameters = 'cmd=_notify-validate';
 
   reset($HTTP_POST_VARS);
@@ -137,29 +141,6 @@
 
       tep_mail('', MODULE_PAYMENT_PAYPAL_STANDARD_DEBUG_EMAIL, 'PayPal IPN Invalid Process', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
     }
-
-    if (isset($HTTP_POST_VARS['invoice']) && is_numeric($HTTP_POST_VARS['invoice']) && ($HTTP_POST_VARS['invoice'] > 0)) {
-      $check_query = tep_db_query("select orders_id from " . TABLE_ORDERS . " where orders_id = '" . $HTTP_POST_VARS['invoice'] . "' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
-      if (tep_db_num_rows($check_query) > 0) {
-        $comment_status = $HTTP_POST_VARS['payment_status'];
-
-        if ($HTTP_POST_VARS['payment_status'] == 'Pending') {
-          $comment_status .= '; ' . $HTTP_POST_VARS['pending_reason'];
-        } elseif ( ($HTTP_POST_VARS['payment_status'] == 'Reversed') || ($HTTP_POST_VARS['payment_status'] == 'Refunded') ) {
-          $comment_status .= '; ' . $HTTP_POST_VARS['reason_code'];
-        }
-
-        tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . ((MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID > 0) ? MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID : DEFAULT_ORDERS_STATUS_ID) . "', last_modified = now() where orders_id = '" . $HTTP_POST_VARS['invoice'] . "'");
-
-        $sql_data_array = array('orders_id' => $HTTP_POST_VARS['invoice'],
-                                'orders_status_id' => (MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID > 0) ? MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID : DEFAULT_ORDERS_STATUS_ID,
-                                'date_added' => 'now()',
-                                'customer_notified' => '0',
-                                'comments' => 'PayPal IPN Invalid [' . $comment_status . ']');
-
-        tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-      }
-    }
   }
 
   require('includes/application_bottom.php');
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/rbsworldpay/hosted_callback.php 2.3.1.src/ext/modules/payment/rbsworldpay/hosted_callback.php
--- 2.2rc2a.cp.src/ext/modules/payment/rbsworldpay/hosted_callback.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/rbsworldpay/hosted_callback.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,99 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (isset($HTTP_POST_VARS['M_sid']) && !empty($HTTP_POST_VARS['M_sid'])) {
+    chdir('../../../../');
+    require ('includes/application_top.php');
+
+    if ($HTTP_POST_VARS['transStatus'] == 'Y') {
+      $pass = false;
+
+      if (isset($HTTP_POST_VARS['M_hash']) && !empty($HTTP_POST_VARS['M_hash']) && ($HTTP_POST_VARS['M_hash'] == md5($HTTP_POST_VARS['M_sid'] . $HTTP_POST_VARS['M_cid'] . $HTTP_POST_VARS['cartId'] . $HTTP_POST_VARS['M_lang'] . number_format($HTTP_POST_VARS['amount'], 2) . MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD))) {
+        $pass = true;
+      }
+
+      if (isset($HTTP_POST_VARS['callbackPW']) && ($HTTP_POST_VARS['callbackPW'] != MODULE_PAYMENT_RBSWORLDPAY_HOSTED_CALLBACK_PASSWORD)) {
+        $pass = false;
+      }
+
+      if (tep_not_null(MODULE_PAYMENT_RBSWORLDPAY_HOSTED_CALLBACK_PASSWORD) && !isset($HTTP_POST_VARS['callbackPW'])) {
+        $pass = false;
+      }
+
+      if ($pass == true) {
+        include('includes/languages/' . basename($HTTP_POST_VARS['M_lang']) . '/modules/payment/rbsworldpay_hosted.php');
+
+        $order_query = tep_db_query("select orders_status, currency, currency_value from " . TABLE_ORDERS . " where orders_id = '" . (int)$HTTP_POST_VARS['cartId'] . "' and customers_id = '" . (int)$HTTP_POST_VARS['M_cid'] . "'");
+        if (tep_db_num_rows($order_query) > 0) {
+          $order = tep_db_fetch_array($order_query);
+
+          if ($order['orders_status'] == MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID) {
+            $order_status_id = (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID);
+
+            tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $order_status_id . "', last_modified = now() where orders_id = '" . (int)$HTTP_POST_VARS['cartId'] . "'");
+
+            $sql_data_array = array('orders_id' => $HTTP_POST_VARS['cartId'],
+                                    'orders_status_id' => $order_status_id,
+                                    'date_added' => 'now()',
+                                    'customer_notified' => '0',
+                                    'comments' => 'WorldPay: Transaction Verified');
+
+            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+
+            if (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE == 'True') {
+              $sql_data_array = array('orders_id' => $HTTP_POST_VARS['cartId'],
+                                      'orders_status_id' => $order_status_id,
+                                      'date_added' => 'now()',
+                                      'customer_notified' => '0',
+                                      'comments' => MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_WARNING_DEMO_MODE);
+
+              tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+            }
+?>
+<html>
+<head>
+<title><wpdisplay msg=result.success></title>
+<style>
+.pageHeading {
+  font-family: Verdana, Arial, sans-serif;
+  font-size: 20px;
+  font-weight: bold;
+  color: #9a9a9a;
+}
+
+.main {
+  font-family: Verdana, Arial, sans-serif;
+  font-size: 11px;
+  line-height: 1.5;
+}
+</style>
+</head>
+<body>
+<p class="pageHeading"><?php echo STORE_NAME; ?></p>
+
+<p class="main" align="center"><?php echo MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_SUCCESSFUL_TRANSACTION; ?></p>
+
+<form action="<?php echo tep_href_link(FILENAME_CHECKOUT_PROCESS, tep_session_name() . '=' . $HTTP_POST_VARS['M_sid'] . '&hash=' . $HTTP_POST_VARS['hash'], 'SSL', false); ?>" method="post"><p align="center"><input type="submit" value="<?php echo sprintf(MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_CONTINUE_BUTTON, addslashes(STORE_NAME)); ?>" /></p></form>
+
+<p>&nbsp;</p>
+
+<WPDISPLAY ITEM=banner>
+
+</body>
+</html>
+<?php
+          }
+        }
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/sage_pay/checkout.php 2.3.1.src/ext/modules/payment/sage_pay/checkout.php
--- 2.2rc2a.cp.src/ext/modules/payment/sage_pay/checkout.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/sage_pay/checkout.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,103 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+// if the customer is not logged on, redirect them to the login page
+  if (!tep_session_is_registered('customer_id')) {
+    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
+    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+  }
+
+// if there is nothing in the customers cart, redirect them to the shopping cart page
+  if ($cart->count_contents() < 1) {
+    tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+  }
+
+// avoid hack attempts during the checkout procedure by checking the internal cartID
+  if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
+    if ($cart->cartID != $cartID) {
+      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+    }
+  }
+
+// if no shipping method has been selected, redirect the customer to the shipping method selection page
+  if (!tep_session_is_registered('shipping')) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+  }
+
+  if (!tep_session_is_registered('payment') || (($payment != 'sage_pay_direct') && ($payment != 'sage_pay_server'))) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
+  }
+
+// load the selected payment module
+  require(DIR_WS_CLASSES . 'payment.php');
+  $payment_modules = new payment($payment);
+
+  require(DIR_WS_CLASSES . 'order.php');
+  $order = new order;
+
+  $payment_modules->update_status();
+
+  if ( ( is_array($payment_modules->modules) && (sizeof($payment_modules->modules) > 1) && !is_object($$payment) ) || (is_object($$payment) && ($$payment->enabled == false)) ) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(ERROR_NO_PAYMENT_MODULE_SELECTED), 'SSL'));
+  }
+
+  if (is_array($payment_modules->modules)) {
+    $payment_modules->pre_confirmation_check();
+  }
+
+// load the selected shipping module
+  require(DIR_WS_CLASSES . 'shipping.php');
+  $shipping_modules = new shipping($shipping);
+
+  require(DIR_WS_CLASSES . 'order_total.php');
+  $order_total_modules = new order_total;
+  $order_total_modules->process();
+
+// Stock Check
+  $any_out_of_stock = false;
+  if (STOCK_CHECK == 'true') {
+    for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+      if (tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty'])) {
+        $any_out_of_stock = true;
+      }
+    }
+    // Out of Stock
+    if ( (STOCK_ALLOW_CHECKOUT != 'true') && ($any_out_of_stock == true) ) {
+      tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+    }
+  }
+
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_CONFIRMATION);
+
+  $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
+  $breadcrumb->add(NAVBAR_TITLE_2);
+
+  if ($payment == 'sage_pay_direct') {
+    $iframe_url = tep_href_link('ext/modules/payment/sage_pay/direct_3dauth.php', '', 'SSL');
+  } else {
+    $iframe_url = $sage_pay_server_nexturl;
+  }
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+    <iframe src="<?php echo $iframe_url; ?>" width="100%" height="600" frameborder="0">
+      <p>Your browser does not support iframes.</p>
+    </iframe>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/sage_pay/direct_3dauth.php 2.3.1.src/ext/modules/payment/sage_pay/direct_3dauth.php
--- 2.2rc2a.cp.src/ext/modules/payment/sage_pay/direct_3dauth.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/sage_pay/direct_3dauth.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,54 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+// if the customer is not logged on, redirect them to the login page
+  if (!tep_session_is_registered('customer_id')) {
+    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
+    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+  }
+
+  if (!tep_session_is_registered('sage_pay_direct_acsurl')) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
+  }
+
+  if (!tep_session_is_registered('payment') || ($payment != 'sage_pay_direct')) {
+    tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
+  }
+
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_CONFIRMATION);
+  require(DIR_WS_LANGUAGES . $language . '/modules/payment/sage_pay_direct.php');
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html <?php echo HTML_PARAMS; ?>>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
+<title><?php echo MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_TITLE; ?></title>
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
+<link rel="stylesheet" type="text/css" href="stylesheet.css">
+</head>
+<body>
+<FORM name="form" action="<?php echo $sage_pay_direct_acsurl; ?>" method="POST">
+<input type="hidden" name="PaReq" value="<?php echo $sage_pay_direct_pareq; ?>" />
+<input type="hidden" name="TermUrl" value="<?php echo tep_href_link('ext/modules/payment/sage_pay/redirect.php', '', 'SSL'); ?>" />
+<input type="hidden" name="MD" value="<?php echo $sage_pay_direct_md; ?>" />
+<NOSCRIPT>
+<?php echo '<center><p>' . MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_INFO . '</p><p><input type="submit" value="' . MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_BUTTON . '"/></p></center>'; ?>
+</NOSCRIPT>
+<script type="text/javascript"><!--
+document.form.submit();
+//--></script>
+</body>
+</html>
+<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/sage_pay/errors.php 2.3.1.src/ext/modules/payment/sage_pay/errors.php
--- 2.2rc2a.cp.src/ext/modules/payment/sage_pay/errors.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/sage_pay/errors.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,208 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  $errors = array('400' => 'The syntax of the request was not understood by the server.',
+                  '401' => 'The request needs user authentication.',
+                  '403' => 'The server has refused to fulfill the request.',
+                  '404' => 'The document/file requested by the client was not found.',
+                  '405' => 'The method specified in the Request-Line is not allowed for the specified resource.',
+                  '408' => 'The client failed to send a request in the time allowed by the server.',
+                  '414' => 'The request was unsuccessful because the URI specified is longer than the server is willing to process.',
+                  '500' => 'The request was unsuccessful due to an unexpected condition encountered by the server.',
+                  '501' => 'The request was unsuccessful because the server can not support the functionality needed to fulfill the request.',
+                  '503' => 'The request was unsuccessful to the server being down or overloaded.',
+                  '2000' => 'The Authorisation was Declined by the bank.',
+                  '2001' => 'The Authorisation was Rejected by the vendor rule-base.',
+                  '2002' => 'The Authorisation timed out.',
+                  '2003' => 'An ERROR has occurred on the Protx System.',
+                  '2008' => 'The Transaction timed-out.',
+                  '2009' => 'The network connection to the bank is currently unavailable.',
+                  '2015' => 'The server encountered an unexpected condition which prevented it from fulfilling the request.',
+                  '3002' => 'The VPSTxId is invalid.',
+                  '3003' => 'The Currency is invalid.',
+                  '3004' => 'The Amount is invalid.',
+                  '3005' => 'The Amount is outside the mininum and maximum limits.',
+                  '3006' => 'The fractional part of the Amount is invalid for the specified currency.',
+                  '3007' => 'The RelatedSecurityKey format invalid.',
+                  '3008' => 'The Vendor or Vendorname format is invalid.',
+                  '3009' => 'The VendorTxCode is missing.',
+                  '3010' => 'The RelatedVPSTxId is invalid.',
+                  '3011' => 'The NotificationURL format is invalid.',
+                  '3012' => 'The RelatedVendorTxCode format invalid.',
+                  '3013' => 'The Description is missing.',
+                  '3014' => 'The TxType or PaymentType is invalid.',
+                  '3015' => 'The BillingAddress value is too long.',
+                  '3016' => 'The BillingPostCode value is too long.',
+                  '3017' => 'The RelatedTxAuthNo format is invalid.',
+                  '3018' => 'The GiftAid flag is invalid. If a value is supplied, should contain either 0 or 1.',
+                  '3019' => 'The ApplyAVSCV2 flag is invalid. The value, if supplied, should contain either 0, 1, 2 or 3.',
+                  '3020' => 'The Apply3DSecure flag is invalid. The value, if supplied, should contain either 0, 1, 2 or 3.',
+                  '3021' => 'The Basket format is invalid.',
+                  '3022' => 'The CustomerEMail is too long.',
+                  '3023' => 'The ContactFax is too long.',
+                  '3024' => 'The ContactNumber is too long.',
+                  '3025' => 'The DeliveryPostCode is too long.',
+                  '3026' => 'The DeliveryAddress is too long.',
+                  '3027' => 'The BillingPostCode is too long.',
+                  '3028' => 'The BillingAddress is too long.',
+                  '3029' => 'The FailureURL is missing.',
+                  '3030' => 'The SuccessURL is missing.',
+                  '3031' => 'The Amount value is required.',
+                  '3032' => 'The Amount format is invalid.',
+                  '3033' => 'The RelatedSecurityKey is required.',
+                  '3034' => 'The Vendor or VendorName value is required.',
+                  '3035' => 'The VendorTxCode format is invalid.',
+                  '3036' => 'The Description format is invalid.',
+                  '3037' => 'The NotificationURL is too long.',
+                  '3038' => 'The RelatedVendorTxCode is required.',
+                  '3039' => 'The TxType or PaymentType is missing.',
+                  '3040' => 'The RelatedTxAuth number is required.',
+                  '3041' => 'The Basket field is too long.',
+                  '3042' => 'The CustomerName field is too long.',
+                  '3043' => 'The eMailMessage field is too long.',
+                  '3044' => 'The VendorEMail is too long.',
+                  '3045' => 'The Currency field is missing.',
+                  '3046' => 'The VPSTxId field is missing.',
+                  '3047' => 'Invalid VPSTxId format.',
+                  '3048' => 'The CardNumber length is invalid.',
+                  '3049' => 'The StartDate format is invalid.',
+                  '3050' => 'The ExpiryDate format is invalid.',
+                  '3051' => 'The CardNumber field is required.',
+                  '3052' => 'The ExpiryDate field is required.',
+                  '3053' => 'The IssueNumber format is invalid.',
+                  '3054' => 'The CardType length is invalid.',
+                  '3055' => 'The CardType field is required.',
+                  '3056' => 'Invalid Amount field format. The Amount value contains a decimal point.',
+                  '3057' => 'The CV2 format is invalid.',
+                  '3058' => 'The CardHolder field is required.',
+                  '3059' => 'The CardHolder value is too long.',
+                  '3060' => 'The GiftAid format is invalid.',
+                  '3061' => 'The AuthCode format invalid.',
+                  '3062' => 'The CardNumber field should only contain numbers. No spaces, hyphens or other characters or separators.',
+                  '3063' => 'The 3DStatus value is too long.',
+                  '3064' => 'The ECI format is invalid.',
+                  '3065' => 'The XID format is invalid.',
+                  '3066' => 'The CAVV format is invalid.',
+                  '3067' => 'The ClientIPAddress is too long.',
+                  '3068' => 'The PaymentSystem invalid.',
+                  '3069' => 'The PaymentSystem is not supported on the account.',
+                  '3070' => 'The RelatedVPSTxId is required.',
+                  '3071' => 'The RelatedVPSTxId format is invalid.',
+                  '3072' => 'The TxAuthNo field is missing.',
+                  '3073' => 'The TxAuthNo format is invalid.',
+                  '3074' => 'The SecurityKey is missing.',
+                  '3075' => 'The SecurityKey format is invalid.',
+                  '3076' => 'The NotificationURL is required.',
+                  '3077' => 'The CustomerName is required.',
+                  '3078' => 'The CustomerEMail format is invalid.',
+                  '3079' => 'The ClientIPAddress format is invalid. Should not include leading zero\'s, and only include values in the range of 0 to 255.',
+                  '3080' => 'The VendorTxCode value is too long.',
+                  '3081' => 'The RelatedVendorTxCode value is too long.',
+                  '3082' => 'The Description value is too long.',
+                  '3083' => 'The RelatedTxAuthNo value is too long.',
+                  '3084' => 'The FailureURL value is too long.',
+                  '3085' => 'The FailureURL format is invalid.',
+                  '3086' => 'The SuccessURL value is too long.',
+                  '3087' => 'The SuccessURL format is invalid.',
+                  '3088' => 'The VendorEMail format is invalid.',
+                  '3089' => 'The BillingAddress is required.',
+                  '3090' => 'The BillingPostCode is required.',
+                  '3091' => 'The BillingAddress and BillingPostCode are required.',
+                  '3092' => 'The DeliveryAddress and DeliveryPostcode are required.',
+                  '3093' => 'The DeliveryAddress is required.',
+                  '3094' => 'The DeliveryPostcode is required.',
+                  '3095' => 'The VPSProtocol value is invalid.',
+                  '3096' => 'The VPSProtocol value is required.',
+                  '3097' => 'The VPSProtocol value is outside the valid range. Should be between 2.00 and 2.22.',
+                  '3098' => 'The VPSProtocol value is not supported by the system in use.',
+                  '3099' => 'The AccountType is not setup on this account.',
+                  '3100' => 'The AccountType value is invalid.',
+                  '3101' => 'The PaymentSystem does not support direct refund.',
+                  '3102' => 'The ReleaseAmount invalid.',
+                  '4000' => 'The VendorName is invalid or the account is not active.',
+                  '4001' => 'The VendorTxCode has been used before. All VendorTxCodes should be unique.',
+                  '4002' => 'An active transaction with this VendorTxCode has been found but the Amount is different.',
+                  '4003' => 'An active transaction with this VendorTxCode has been found but the Currency is different.',
+                  '4004' => 'An active transaction with this VendorTxCode has been found but the TxType is different.',
+                  '4005' => 'An active transaction with this VendorTxCode has been found but the some data fields are different.',
+                  '4006' => 'The TxType requested is not supported on this account.',
+                  '4007' => 'The TxType requested is not active on this account.',
+                  '4008' => 'The Currency is not supported on this account.',
+                  '4009' => 'The Amount is outside the allowed range.',
+                  '4020' => 'Information received from an Invalid IP address.',
+                  '4021' => 'The Card Range not supported by the system.',
+                  '4022' => 'The Card Type selected does not match card number.',
+                  '4023' => 'The Card Issue Number length is invalid.',
+                  '4024' => 'The Card Issue Number is required.',
+                  '4025' => 'The Card Issue Number is invalid.',
+                  '4026' => '3D-Authentication failed. This vendor\'s rules require a successful 3D-Authentication.',
+                  '4027' => '3D-Authentication failed. Cannot authorise this card.',
+                  '4028' => 'The RelatedVPSTxId cannot be found.',
+                  '4029' => 'The RelatedVendorTxCode does not match the original transaction.',
+                  '4030' => 'The RelatedTxAuthNo does not match the original transaction.',
+                  '4031' => 'The RelatedSecurityKey does not match the original transaction.',
+                  '4032' => 'The original transaction was carried out by a different Vendor.',
+                  '4033' => 'The Currency does not match the original transaction.',
+                  '4034' => 'The Transaction has already been Refunded.',
+                  '4035' => 'This Refund would exceed the amount of the original transaction.',
+                  '4036' => 'The Transaction has already been Voided.',
+                  '4037' => 'The Related transaction is not a DEFFERED payment.',
+                  '4038' => 'The Transaction has already been Released.',
+                  '4039' => 'The Tranaction is not in a DEFERRED state.',
+                  '4040' => 'The Transaction has been Aborted.',
+                  '4041' => 'The Transaction type does not support the requested operation.',
+                  '4042' => 'The VendorTxCode has been used before for another transaction. All VendorTxCodes must be unique.',
+                  '4043' => 'The Vendor Rule Bases disallow this card range.',
+                  '4044' => 'This Authorise would exceed 115% of the value of the original transaction.',
+                  '4045' => 'The Related transaction is not an AUTHENTICATE.',
+                  '4046' => '3D-Authentication required. Cannot authorise this card.',
+                  '4047' => 'The vendor account is closed.',
+                  '4048' => 'The Card Number length is invalid.',
+                  '4049' => 'The ReleaseAmount larger the original amount.',
+                  '5001' => 'The required service is not available or invalid.',
+                  '5002' => 'Invalid request.',
+                  '5003' => 'Internal server error.',
+                  '5004' => 'The Transaction state is invalid.',
+                  '5005' => 'The Vendor configuration is missing or invalid.',
+                  '5006' => 'Unable to redirect to Vendor\'s web site. The Vendor failed to provide a RedirectionURL.',
+                  '5007' => 'Invalid request. A required parameter is missing.',
+                  '5008' => 'Missing Custom vendor template.',
+                  '5009' => 'The Encryption password is missing.',
+                  '5010' => 'The CardNumber is required.',
+                  '5011' => 'The check digit invalid. Card failed the LUHN check. Check the card number and resubmit.',
+                  '5012' => 'The CardHolder name is required.',
+                  '5013' => 'The card has expired.',
+                  '5014' => 'The card expiry date is required.',
+                  '5015' => 'Card validation failure.',
+                  '5016' => 'The StartDate is in the future. The card is not yet valid.',
+                  '5017' => 'The Security Code is required.',
+                  '5018' => 'The Security Code length is invalid.',
+                  '5019' => 'The Security Code is not a number.',
+                  '5020' => 'The Card Address is required.',
+                  '5021' => 'The Card Address is too long.',
+                  '5022' => 'The Post Code value is required.',
+                  '5023' => 'The Post Code value is too long.',
+                  '5024' => 'The CardHolder value is too long.',
+                  '5025' => 'The number of authorisation attempts exceeds the limit.',
+                  '5026' => 'The Card Number is not numeric.',
+                  '5027' => 'The Card Start Date is invalid.',
+                  '5028' => 'The Card Expiry Date is invalid.',
+                  '5029' => '3D-Authentication failed. This vendor\'s rules require a successful 3D-Authentication.',
+                  '5030' => 'Unable to decrypt the request message. This might be caused by an incorrect password or invalid encoding.',
+                  '5994' => 'The Authorisation process failed, due to an internal server error.',
+                  '5995' => 'The AVS/CV2 checks failed.',
+                  '5996' => 'The Authorisation process timed-out. The bank did not respond within an acceptable time limit.',
+                  '5997' => 'A communication related error occured.',
+                  '5998' => 'Duplicate vendor notification attempt.',
+                  '5999' => 'The Session is invalid or has expired.',
+                  '6000' => 'Data Access Error.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/sage_pay/redirect.php 2.3.1.src/ext/modules/payment/sage_pay/redirect.php
--- 2.2rc2a.cp.src/ext/modules/payment/sage_pay/redirect.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/sage_pay/redirect.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,57 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  chdir('../../../../');
+  require('includes/application_top.php');
+
+// if the customer is not logged on, redirect them to the login page
+  if (!tep_session_is_registered('customer_id')) {
+    $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
+    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+  }
+
+  if ( isset($HTTP_GET_VARS['payment_error']) && tep_not_null($HTTP_GET_VARS['payment_error']) ) {
+    $redirect_url = tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $HTTP_GET_VARS['payment_error'] . (isset($HTTP_GET_VARS['error']) && tep_not_null($HTTP_GET_VARS['error']) ? '&error=' . $HTTP_GET_VARS['error'] : ''), 'SSL');
+  } else {
+    $hidden_params = '';
+
+    if ($payment == 'sage_pay_direct') {
+      $redirect_url = tep_href_link(FILENAME_CHECKOUT_PROCESS, 'check=3D', 'SSL');
+      $hidden_params = tep_draw_hidden_field('MD', $HTTP_POST_VARS['MD']) . tep_draw_hidden_field('PaRes', $HTTP_POST_VARS['PaRes']);
+    } else {
+      $redirect_url = tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL');
+    }
+  }
+
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_CONFIRMATION);
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html <?php echo HTML_PARAMS; ?>>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
+<title><?php echo TITLE; ?></title>
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
+<link rel="stylesheet" type="text/css" href="stylesheet.css">
+</head>
+<body>
+<form name="redirect" action="<?php echo $redirect_url; ?>" method="post" target="_top"><?php echo $hidden_params; ?>
+<noscript>
+  <p align="center" class="main">The transaction is being finalized. Please click continue to finalize your order.</p>
+  <p align="center" class="main"><input type="submit" value="Continue" /></p>
+</noscript>
+</form>
+<script type="text/javascript">
+document.redirect.submit();
+</script>
+</body>
+</html>
+<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/sofortueberweisung/callback.php 2.3.1.src/ext/modules/payment/sofortueberweisung/callback.php
--- 2.2rc2a.cp.src/ext/modules/payment/sofortueberweisung/callback.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/sofortueberweisung/callback.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: callback.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,18 +14,22 @@
   chdir('../../../../');
   require ('includes/application_top.php');
 
-  $order_id = $customer_id = $pw = $betrag_integer = '';
+  if (!defined('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS') || (MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS  != 'True')) {
+    exit;
+  }
+
+  $kunden_var_0 = $kunden_var_1 = $pw = $betrag_integer = '';
 
   if (isset($HTTP_GET_VARS['kunden_var_0'])) {
-    $order_id = $HTTP_GET_VARS['kunden_var_0'];
+    $kunden_var_0 = $HTTP_GET_VARS['kunden_var_0'];
   } elseif (isset($HTTP_POST_VARS['kunden_var_0'])) {
-    $order_id = $HTTP_POST_VARS['kunden_var_0'];
+    $kunden_var_0 = $HTTP_POST_VARS['kunden_var_0'];
   }
 
   if (isset($HTTP_GET_VARS['kunden_var_1'])) {
-    $customer_id = $HTTP_GET_VARS['kunden_var_1'];
+    $kunden_var_1 = $HTTP_GET_VARS['kunden_var_1'];
   } elseif (isset($HTTP_POST_VARS['kunden_var_1'])) {
-    $customer_id = $HTTP_POST_VARS['kunden_var_1'];
+    $kunden_var_1 = $HTTP_POST_VARS['kunden_var_1'];
   }
 
   if (isset($HTTP_GET_VARS['pw'])) {
@@ -41,7 +45,7 @@
   }
 
   // Check if Order exists
-  if (empty($order_id) || empty($customer_id) || empty($pw)) {
+  if (empty($kunden_var_0) || empty($kunden_var_1) || empty($pw)) {
     exit();
   }
 
@@ -52,12 +56,12 @@
   }
 
   // check if order exists
-  $order_query = tep_db_query("select * from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "' and customers_id = '" . (int)$customer_id . "'");
+  $order_query = tep_db_query("select * from " . TABLE_ORDERS . " where orders_id = '" . (int)$kunden_var_0 . "' and customers_id = '" . (int)$kunden_var_1 . "'");
   if (tep_db_num_rows($order_query) > 0) {
     $order = tep_db_fetch_array($order_query);
 
     if ($order['orders_status'] == MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_PREPARE_ORDER_STATUS_ID) {
-      $total_query = tep_db_query("select value from " . TABLE_ORDERS_TOTAL . " where orders_id = '" .  (int)$order_id . "' and class = 'ot_total' limit 1");
+      $total_query = tep_db_query("select value from " . TABLE_ORDERS_TOTAL . " where orders_id = '" .  (int)$kunden_var_0 . "' and class = 'ot_total' limit 1");
       $total = tep_db_fetch_array($total_query);
 
       $order_total_integer = number_format($total['value'] * $currencies->get_value('EUR'), 2, '.','')*100;
@@ -81,7 +85,7 @@
 
       $order_status = (MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID);
 
-      $sql_data_array = array('orders_id' => (int)$order_id,
+      $sql_data_array = array('orders_id' => (int)$kunden_var_0,
                               'orders_status_id' => $order_status,
                               'date_added' => 'now()',
                               'customer_notified' => '0',
@@ -89,7 +93,7 @@
 
       tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
 
-      tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $order_status . "', last_modified = now() where orders_id = '" . (int)$order_id . "'");
+      tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $order_status . "', last_modified = now() where orders_id = '" . (int)$kunden_var_0 . "'");
     }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/ext/modules/payment/worldpay/junior_callback.php 2.3.1.src/ext/modules/payment/worldpay/junior_callback.php
--- 2.2rc2a.cp.src/ext/modules/payment/worldpay/junior_callback.php	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/ext/modules/payment/worldpay/junior_callback.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,92 +0,0 @@
-<?php
-/*
-  $Id: junior_callback.php 1807 2008-01-13 00:50:08Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (isset($HTTP_POST_VARS['M_sid']) && !empty($HTTP_POST_VARS['M_sid'])) {
-    chdir('../../../../');
-    require ('includes/application_top.php');
-
-    if ($HTTP_POST_VARS['transStatus'] == 'Y') {
-      $pass = false;
-
-      if (isset($HTTP_POST_VARS['M_hash']) && !empty($HTTP_POST_VARS['M_hash']) && ($HTTP_POST_VARS['M_hash'] == md5($HTTP_POST_VARS['M_sid'] . $HTTP_POST_VARS['M_cid'] . $HTTP_POST_VARS['cartId'] . $HTTP_POST_VARS['M_lang'] . number_format($HTTP_POST_VARS['amount'], 2) . MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD))) {
-        $pass = true;
-      }
-
-      if (isset($HTTP_POST_VARS['callbackPW']) && ($HTTP_POST_VARS['callbackPW'] != MODULE_PAYMENT_WORLDPAY_JUNIOR_CALLBACK_PASSWORD)) {
-        $pass = false;
-      }
-
-      if (tep_not_null(MODULE_PAYMENT_WORLDPAY_JUNIOR_CALLBACK_PASSWORD) && !isset($HTTP_POST_VARS['callbackPW'])) {
-        $pass = false;
-      }
-
-      if ($pass == true) {
-        include('includes/languages/' . basename($HTTP_POST_VARS['M_lang']) . '/modules/payment/worldpay_junior.php');
-
-        $order_query = tep_db_query("select orders_status, currency, currency_value from " . TABLE_ORDERS . " where orders_id = '" . (int)$HTTP_POST_VARS['cartId'] . "' and customers_id = '" . (int)$HTTP_POST_VARS['M_cid'] . "'");
-        if (tep_db_num_rows($order_query) > 0) {
-          $order = tep_db_fetch_array($order_query);
-
-          if ($order['orders_status'] == MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID) {
-            $order_status_id = (MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID);
-
-            tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . $order_status_id . "', last_modified = now() where orders_id = '" . (int)$HTTP_POST_VARS['cartId'] . "'");
-
-            $sql_data_array = array('orders_id' => $HTTP_POST_VARS['cartId'],
-                                    'orders_status_id' => $order_status_id,
-                                    'date_added' => 'now()',
-                                    'customer_notified' => '0',
-                                    'comments' => 'WorldPay: Transaction Verified');
-
-            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-
-            if (MODULE_PAYMENT_WORLDPAY_JUNIOR_TESTMODE == 'True') {
-              $sql_data_array = array('orders_id' => $HTTP_POST_VARS['cartId'],
-                                      'orders_status_id' => $order_status_id,
-                                      'date_added' => 'now()',
-                                      'customer_notified' => '0',
-                                      'comments' => MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_WARNING_DEMO_MODE);
-
-              tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-            }
-?>
-<style>
-.pageHeading {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 20px;
-  font-weight: bold;
-  color: #9a9a9a;
-}
-
-.main {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 11px;
-  line-height: 1.5;
-}
-</style>
-
-<p class="pageHeading"><?php echo STORE_NAME; ?></p>
-
-<p class="main" align="center"><?php echo MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_SUCCESSFUL_TRANSACTION; ?></p>
-
-<p align="center"><input type="button" value="<?php echo sprintf(MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_CONTINUE_BUTTON, addslashes(STORE_NAME)); ?>" onclick="document.location.href='<?php echo tep_href_link(FILENAME_CHECKOUT_PROCESS, tep_session_name() . '=' . $HTTP_POST_VARS['M_sid'] . '&hash=' . $HTTP_POST_VARS['hash'], 'SSL', false); ?>';"></p>
-
-<p>&nbsp;</p>
-
-<WPDISPLAY ITEM=banner>
-<?php
-          }
-        }
-      }
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/.htaccess 2.3.1.src/.htaccess
--- 2.2rc2a.cp.src/.htaccess	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,38 @@
+# $Id$
+#
+# This is used with Apache WebServers
+#
+# For this to work, you must include the parameter 'Options' to
+# the AllowOverride configuration
+#
+# Example:
+#
+# <Directory "/usr/local/apache/htdocs">
+#   AllowOverride Options
+# </Directory>
+#
+# 'All' with also work. (This configuration is in the
+# apache/conf/httpd.conf file)
+
+# The following makes adjustments to the SSL protocol for Internet
+# Explorer browsers
+
+#<IfModule mod_setenvif.c>
+#  <IfDefine SSL>
+#    SetEnvIf User-Agent ".*MSIE.*" \
+#             nokeepalive ssl-unclean-shutdown \
+#             downgrade-1.0 force-response-1.0
+#  </IfDefine>
+#</IfModule>
+
+# If Search Engine Friendly URLs do not work, try enabling the
+# following Apache configuration parameter
+
+# AcceptPathInfo On
+
+# Fix certain PHP values
+# (commented out by default to prevent errors occuring on certain
+# servers)
+
+# php_value session.use_trans_sid 0
+# php_value register_globals 1
diff -x .svn -aruN 2.2rc2a.cp.src/images/category_gadgets.png 2.3.1.src/images/category_gadgets.png
--- 2.2rc2a.cp.src/images/category_gadgets.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/category_gadgets.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,29 @@
+PNG
+
+   
IHDR   U   <     iCCPICC Profile  xMKAQAXAHt܃E_"4<l⡢j.f:QRAd:Dv$EtR K3?< u=+ʙFtiAZ][_0iĕ?u[?^b}7y%'iN$9;nXIǓ46b0qxH\f|øh̷B%39q @d4E7Fdq\~id:Z?ƞ;> b0Z+>;࠻YVs?%j]ZVrMe(ڶtIuĬv?~3߶ u D3`"Eul Y,O"T&?.K} y}hiS
+яRrNvK>׃/ qG  IDATx\	TUGtN:3I3IϤ{f3$q,3Lr1ic4wx*  l&
+(,oݫOL:P09ߩu-_聻	&<h4Y,_FF%xawr]db2wDyH3L"uHC(Fl2`i4ZIm&(	מo7{O*D???+\/cr{>XM]?䕁kl7J3~ 偸yeGl{:̝i!{eN>6,}5{EM;j/LF
"5mF#h_s72S
+H70MVwIrG?TӗRRN%H{
mːװTYJ+r;~B{SMM-{׮dR*5Iw<Ç<z"zv9,^qHoo7U
+ş<=]P ^^7
++(ggZZ<m߸1
+uJ{^q|\jo&wER!aJ8&>)
Z,-'u??۹`
U xIR'LcS?pC*H`^HNN*}yjll/Rsp5|544
ڦ&57?跸Yj]FDDģM]"dU qRJٶ-Ng72z{z	R:UvO'`rFtHz32	U*MK0<j .H~\VR;Gzt{' :<IG5%%Guuu$odD0`>?kj6EGvuu7mB^^>CT	߻H5ϗIEY-Kj~~yzI%/o%(Ԃ;饠E Jր ~{챱YR6<|gdR
+HҐJ,*-;S@G~GPQq>WƘ
r;;;:$56vЗ[ Hf\܄A깢bAaHB*l
=p\~0|T9uttеkaSR߬6 $5//_j@|u֫Qh(^BSt mlZʄRWw}RV>,Z\H
:F݇#:s|^Zp
+*Sbb}ٲp/?H؀g\#aCs]<Tא@tu%T\EN:۰VQ6D>
+
+ώIDyy,Yd*AѬhjiD
bM4\(ʋm[ꛣ:xPRDIOvE"<[`!	YdH7>ϐ&UH%aI
&_7>sMT15sR#BJRNl>ŤFkwH^-^џAГBCh&v WaCYRBR-++[jB-T`F+5Q]s0Uj(x%ͩ/lEFSܾQ-Z).RzzђhIrnE<r "iHjMfefAW)IKU5 VOPn_(9k%|_ѢL)#}$FK׼$W^Vt+-{OX,:6IeIɣ^-#3K"5yTZ9=:zz
+,Oɇ^ٯӞ(5GTߝ=Ҋ_u.RAEFh{XRh0xQ%{9rOI[zFMR}PɩTY?O|@
+FѾA	؟?UA֮]Goîr$x3񞂅>_SRwuu3$RᝍD*:̒єU2oEƑ1_16sT6l!v^ׂ8U^uԬCtz---*?(
;>KRNwGѱTT9H"٩[KyF
+e		@5$6{K*~k)wX*Gc䷣ 嗏cchc.
+R*5mGoɨE 5-
+<T%<*CŕLwGT^?bށ-54g'Ҏ;V3h
^ٳOؾ0Z1?)hD
+ME'J;6UҎ+9MR]{!fB[.]n=h	30LP ip1KwԽV UJmμ/?zDm{12yVg NRw+Pqޭ/Tj-͜5GdS陴g>{ĊUT@˛W(Oƚ{SvNv;%SPEos}u=68HQڑUTf7D++];{D
+(ȒAoa	eR9570q*Cb:vW pٙ2ngfLǊ,H?Q[%Bwy~؟WLn(It8@R1qL&'#G(%e7߰Qlزu`8QNGG}>prlzAG*?nS%YPo;KjaQ%PyIݴQ'MrsΧ3fҗӿ"vTM	ϓsI>t6U%GnJt~̝;RVbzyv9ރMu$$$BKK@.H='O>n͔+ͷ'&USMݩTUuS~;oysR6Ć~]ƈ?Ļf uBenR?vz!m2ԹWUy9S-#H^))"ʆ@DO*ReiA{G0@2An98S@6iƞ[QdٺycYPPH#_1=tD_h YMBe	b`J00l8ʁ@FKQ1*.)5eX#lA^m̙38zpj'^Ҷo
+i	JM3p&Uq_޼q=KHv	cs䰤͞=ÖB=X7Ҕ/q<*/lܤz%lA["Ntgr/t%88fT4I_ϹI&Ti4$VcQgBCa.
+	egǓh<a_N.ҝwbP/A~DgC՚ɻmc/z^N RksC89dgj eEEٴ:j
MS͠EiV
+}6eJ:W^928^^aj!B"4=#[z%PK8Ra7g͚,bUMD8SS#^$;'6klt%K!< 5]TޑrBÍ>a^0pU\F3ʡaSlrIU{֠^^/x{+Iߝj
ADݹsvv.X|D8Ϥn o7!M4) Q@ayy5_lr.Rx7,3"w)ʏZe
n8^LZUsFU۟9S8Z|Q<sx&vk.H!TpT֭('EE&&=zzY ~
V}J| Ej5y	I	S/0PU{uM-1˃`4΄&-^LģL;"9dΑ'F&l] &RᨖEFF>/},w1{zzjum&BcC V{FT=fGG2f L.;ݩ{.lNa--bcUS[P{'u4?0wätfY !vN#wW+ANoyƦfKRݹ`2ٰ\-l)O6G{#uL%`cg}J׽?>f
A`TY9>D?bEyH?g۷U"gv+l h
+6M+&T_LLCcؽ5%@&%sl$4{+mtV"o?<@hT4$bR
+ŏCCC|;44	A?-]ޓLNI@`^L6v* /D	sWy5Ow~Aemmx%8]&$ϡ9%'X
cҊ3A!VW^&NM넚s4ЦR`j%$y\rAhG&鵑 D\*owRö& HՀP%K:?(iFF>gdRCz9,ڲ%Γ$SP{8@tf;A	\,W ^\qCyՁ͖; 1*)H-T~yMI``/!Hdu8v**Cix	#Ʊ*gW7Ĉt3.>Av7||ܯ|'b|}Md4x`j,H3?I$ǒ<EǎRRXzO jjy
+8%ȯ.O2p\
+*	Ǥ}}P9cA 9?{Ii<HI
+U
+B]o¹7@O裡ONfgsL<eqnc{SKG,ç"_}?,=h7s	a!"(Ë^'d187'qKۨɟq_R,{-R8b >}',O
hkX]oL#2s<8|qa#맚OJ$zA%s~2L2_ᗒqуCS&iL;ڟ{2:N9a#6Hw?J    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/.htaccess 2.3.1.src/images/.htaccess
--- 2.2rc2a.cp.src/images/.htaccess	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,10 @@
+# $Id$
+#
+# This is used to restrict access to this folder to anything other
+# than images
+
+# Prevents any script files from being accessed from the images folder
+<FilesMatch "\.(php([0-9]|s)?|s?p?html|cgi|pl|exe)$">
+   Order Deny,Allow
+   Deny from all
+</FilesMatch>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/mail/background.gif 2.3.1.src/images/mail/background.gif
--- 2.2rc2a.cp.src/images/mail/background.gif	2008-01-31 16:34:12.000000000 -0600
+++ 2.3.1.src/images/mail/background.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-GIF89am2                                                                                                                                                                                                         !  ,    m2   H*\ȰÇ#JHŋ3jȱǏ Cő9A\ɲ˗0cl d˙3)T*QGFJѣH3BRH  AB@Az IÊKF
f0t˃Mv@ *(bjŅٿNRx>&h˘3wk̇F`%$H\cʔ@%x`5B2#.5N`:qSp"<0)(sHPATԪULb"TC,.!7l`1Hda [By)+@)%p,ȧ)RB	A
a4BF!A'ptq-1u=r,⍤E+J+
-!!P-hJ0iBq 
-7X찃@r
-V)	(<@A!A `RW  R\<Vy`[m
-PB*4+$]\P r
- 
-@)+s0Ey)g+A
-   (Y@I a@qx,R
-&)'BR#2.+pQ.8
-."&wb 
-/.*`K,Tk"K k90Q <Cͱʔ8
-%∖H"H\P+#A<(RK ʼ8`顑qt,̑+<H-XF	+bJ .p8
-n,@UW+-Q"2+᠇>+`z{a#+8Bn,4.J)s'Kh#TI}FofdN:OAa/F-SQMUUYmW/HhŖ[pE]x R$f1yLd2S:P3hDCӠF5ak6
o|,IrL vFg<	y=a}Rq"VD?D ! 
-b	#ІDA e26DF4t#itC*ґ$&IQY-uKa4MoӜt'OdS-C!JQP` IQRB)OJT2@P*<U լju\!`W!wb+Yjֳ5-TZ&խok\:Wpv+^׽~A_A01a,<hl@֮Rḑ@T2Lf4+p6%g@ьf
-)iPpԤF5aMk\6ll1*Ц6
nr7>i8)q&WeN$L*ҕt@:G.$Q ]Q~<x XӼU3C֓i&9"UXs
-TB`E+\
-
Jo-myK\Re/})dS@(1d0z LhFSӤf5yMlfsE&7M(~5ʙs )Zv #1zt)m'@*Ёq UH!yD"ZHցqEXhG=QhD%+w Z2kB&1U3$'9Nxzd'IAʒZ@6YNNRԦheP,M+YWJVlK 
-X/,f9Z1Lmq[̅.W]e
K_6q lUb:ٓdrٲlf5A
ڳ%"hC+T,iOԪvmkhA>-mkk@7 ̭nw7kz5Mdr0ws6Qյ mFw+LضHYn{/ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/manufacturer_samsung.png 2.3.1.src/images/manufacturer_samsung.png
--- 2.2rc2a.cp.src/images/manufacturer_samsung.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/manufacturer_samsung.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,21 @@
+PNG
+
+   
IHDR   d   9   }   	pHYs       IDATx[UřsνwsDb$h,VYǘ3`kU2Ywڪ}T9͖nv+$aƊ	d#3PkJY$C|<fӧsaPܤn}{9U/CS;1!193ΐ@Sא:Cj5N]C1
+:u
3(Pc5>gFQw߭ծZڦT]{{~3*V~8>3Qsr2rJҚt*	FEhOhaPV6>h|fUþCnC;ઋ~&rjĪdԮYC-fIV:a
+܄ <qal鋝SS1n,J{2_TLYAjRشP*EALD
zn=""TMw{nK;,&hlI%q\GvS2T<[;=iu<VyYȵGH@}:HIJ?JBKi~*ar2Ѐ)ùfoqj3y{ճTQ`H{5k\<vnyڙ+@ùY!<%C7;Ve纔$M>!Vv.zuL`NacW
ԴyWl<ReH}MSL4Q贅pGBiAf
+;jeO!*Ժ諮K! 1C[,ɗI_ό5;50ס*<T U2`yjMibK~lQ4E=(B?CT]\	MR($Ga^57crp쑏!^AՓE7m^ǻWCeGӵJRb	Aaɉ޸i;bscnZ㩦@#f,9_D7 'Wր3X9sNBfT~<xRt/PA#?XWG˸RJWޱҼ9YGcҹ  %<*F%Usή9s=
+E*32H(ʣ)//OVU3IU(Iy@1eO9ҳEX+9}=/sDtuJ =7Κ!roz?8:bM9RXVR$d@N"i]5)BՒ0쉕e'ze9D~pVL1GJMj,	sL+}JMnY%0&4]<*90LRTW87g= xhAf8+EaD
mVcqlpSVE>1R6Kmhg8frӰ7yߴߵK0 32`FIˢD]7u&'Lqq]dFsjsu5l{4ԩ&GОncypqxZlھc7uݡ RC"	k]+%9)a%uN/SሿE3͝ӑ˺UCᠥ.h{U5{ZشK:@LB3ȑyv}|TbuG^cI	 nw<?qu^E[A8Cߓ*!NNyX
2$)w"NܯŽ!pвsf7?sv
+OPu~{sVCxajEfiǧ&uqN }3fn^K]zFK2M/ϑвI7ߧ<vTsq<i)~cc0;.FǇ=*;(M!cimP1S"H.k nfe+v8
Żuksδ+Gh^U]h"3x8ouz
+tL!%o8-
+gLHzQh.`Hl=ZJV &{|m~Pyҧ2x	@rSjm3jX!n.N]߶[]t	|
+tp: HPԜtecӶv *	WbcrcOoxŉ])V!
+{l+1cOƞJsKTOhWۭ2#"!l3}uvs/om+@/n0v)cWCrB&\
>󈘉iօX&,FWn	V %Yǌk9(ϰߜ:9($i_6\
+G_Q"@X@bTh/Qܖ&*0YmY `:_|J rB;`:pü CoLExe9~~^Rbc͈(;]I٢k9.仲
Nc	ٱw@#z2KϗAZi-;.>d?iou@[xݟ2UH;۰YpݠEdY٣Cte<Z>bpNԵb-Jw;ef ,}ɳo6dcAz|8}Lڢ)N~C/)0>C^L`^l-<۸LJ{O- a,}*C?G!8[?OξT!V*s=DߠC(&o_Bʝjjⓐd,HG[7-Qv`4f_Ɠg-IU(Ic2Ӱ*dGaWlLq6۞ qK9zh%`,=0LEm"ۘc0`BmJ2rJR!
7f}:&gN[XY2XE {EU-X\(~_o-¥Y	.gt;enL2\8Wєg4Q|b36bxP]@
+A~@\fuW(*ч4w@?F]2ڗYmv&0(txPC0
+/Xp"3Qd&V@zOl>bgˉ9h4ֺOKGM-lAw.vp޿DP\Woī	|RՓګ*
+wa	+[L>	蟩&*Mk*ǒ:RlnK1:YS:Vl:	gK<&ll:M#8AJH*hz^lAOPjp7L4 Tŝ]oѷ1Wʟq1?RnKqaVz-^ Q4N.r:2.uy w27.Bt{}*0g*4nN{T45}SݰHjԠ;57x~!p
!;\`p {!Iu2A_;0YdX03)|(WPwI ^ї&9L_}!Z
\fE2`(5iB}qħKloaC 2Q[٧дxAj#fU"G Zt( 3 .׵ej-``5o_X'lkÈ,tea*\"^9vgc3԰tL9O-C	c+ڄ)pW]CVKKhn"+&!dp#'	8I2k<FGOq=
+=Z̞}@\@JDaIv?Z$0DVIr	4\rvi*h`mH{Ij"'B"Pb6Xpm'@H
+ 0(װ-3fp<0@#efW$[5P} lAI9TVB|?s5^l<2oo=jo:?FHy.C#f:Uu?:h(_f 8MTp~
_tqqy=6|Mܑ0/r
>l#e+	2HܝSW2`<P[<O 	%<4i	S
+~~;E^@˟`Y 01gj%>b.N1x<54;7E݆/!6EZ1!g	~,L9kqstԴ|j!.1&6^0؊
+ _./~&
+Fľ@ܴKzY#Ԣ!~]ΌkHLԙ16ݓI*sA<U}\VC‡NavX㿠qd_Qo9T2<,ESmrc!6?HknItQ"Gg£Jrǁr *)9gc)u}n.UCҟ]8J.g]fʦyC2Ȏ:}%by lbI ReJ&T*KB#5C¾ f}*|=;趬b&eM.x::Vi$A'OM''1ntnFc#@PzQuf).΃%'ptD? ;3w٣CIz'k)33rI?Oa>WuMa3dH?uMa3dH?uMa3dH?uMa3dH?uMaͷB    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/samsung/galaxy_tab_1.jpg 2.3.1.src/images/samsung/galaxy_tab_1.jpg
--- 2.2rc2a.cp.src/images/samsung/galaxy_tab_1.jpg	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/samsung/galaxy_tab_1.jpg	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,167 @@
+ JFIF  H H   Exif  MM *           J       R(       1       Zi       n       H      H   Acorn version 2.5.1                   C 			
+	
+ C "            	
+    } !1AQa"q2#BR$3br	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
+   w !1AQaq"2B	#3Rbr
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? ( ( ( ( ( ( ( ( ( ( ( ( (p Rdz	p<7Z Z)zE&{2=E -#ր
+)7QA u"LQFGL#Q{@E&(@E&Gp= -RnB@EpFG\PM'PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPHHHf3>   |
 p#>,(^¾V7#s@qRCΕk$4CH yPɏ]&[KMտixV;d֓j# =~[~R,6a
+-ğxZ-Kƴo3'>]+ -<r#+S	F鿳~'gǷRRܬOJ7:z Zۻ''?`̉C~
.j AO#pxt?lbn@?U~	''T7V C0F+smj1U[ eBxǲɴ ?
+|ݎ⓰?J~|
+-olF?>D H 3y[ ~-y ȴG	vk~7S̊Oƾɿ1a[ u
T\d՘Ȁj s@1ǌnb5q R 4
+W: ';ּ τdeY0B (PDJg ug L~7uBy_c#?r߇9'1 ׋x^e1xgL%"O \~ŀ
~Ƕo! @V`º$q ߺW^Q\G
+|\ 0~8؃~'am&O1C' ?b|^; O_ƍ(uME3mP~ um_Ⱥ~إ`PA'{sO:*`wG ԟGJr|YO7 dg_v
+n%BF3OؠgTu?O
c1z *oؗ9_xɿL'a˳6G3֏b3  bC N?7 :!CGơGq#_}$M0#Ě77!{!tCْ  2p	# EU a|/\gvǷ+/n{]+qX3vA߰S?lc_:S
$ $cǟ_Dڕ$7jŸ5w_*|7OΎDW1	h e |;WNCk%
CQ ]kMCP
+z9p G"6~ xaY cF {N  ڃciVix|򌏥#Sdu]Q[ IrsȋoCM  `ߴ];K
(y[89ej:9$HFPT2ՔM9nW2?C__M?.)k:7/k-~y
+
+N)>[斾t i_ |x_>"&)u8>|<
}YQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QHqԜP` 
<wcڤZ7|9\ːpD8 {_ை G 4!%F/2Ú=eYy> |c|aV*Jܐ4Irr;`闄ῇïiO
6DҭaM
k`'Ԓ{֐]@ݑIFgw,K3$MA!,B)b] bA%d<)A*bj9 `eLr:ְ.#q=nGMso| s~;q\.q89PsQ,HPv䞘~$ӚOp5&:UNz5 9'׫xh^zyl#ۜ7F_c~}x޵pA9N?<bia߳=:
CuͯMOR/4}G6ђFiE%8#5 K٫|'Qxg{ 5n#~
+0zTK]ƦDߎ1^+kdiMp/ۜBq$ 'EK/?T>qؾ(JY4yr6Ry_^3?`o(2X#ˡMkm%{dξ_ +B1OG4Mm<7V1C$$3FPq#=+ 0%lw75?¾"_(쵩~.,⛯	/ťxmp0m~$8Ig2|௄Oj x7ǃu.jp̽0.r0sNN(%ğ{QϡcXwbhᴚ[kmA{if8cwPWOK'j	oX>/WUm7Y!Fc[_1ayW S9r?xB
 ^m[ˣYKa	_7	do-j;|3ޱeqwVӐyi}7FUӞsq]΍4i
s^}]n8Y|rr6Wt(<ܘ2wsX}SGNZ4@@>G𷅼/
GL[pڇ
Ù`q1_6&rJ×h
+"# dUg\y b.P*0' q޲go#Ԛ#>F>q!#ɴ1x+cIߊW{i<q0xBoG\8v "Wv;e +?c_A6kO
L.~ϡ
+@]9q.AXE$WS*rJ  ׉Ohvmc]Դ2g$zkZ>Q 9e_!k IᘴmvF 1ԬY':gֳO((( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ){`[oƆ|-GÚͅhIʥzu+`¿Ys{?  gxk +xu 7!xdb=iۘj3bp?Qk>8~?f Go3ǦũkF.e`*ppN5V&CGx M <.qڹ_\Yan/M o?b Mi>X m dn ~(@}|R.Y=k*W@?m.qP _S'w9xqDcO\o\esׇkR/.hk߂ 
 h׌P?ؖx?joۋ Uq`%u<ׇfL5Z \4SL v^yNe~yČan !ϬxVd>2t
+M&*Z=^-PxİK{&Ym)26.x,տkٲCq{ yM|Eg# (DٞoZi<CiZۤ7ƶ0܃
+Ğ.$)լKkSIX}-#j[ B SVu̿'#8O"|>/4x]?2Ǟ8:qs,r{\Kn+8aι&+/iOI\_ ̀ 8"o_3\8q'd;/f=0t:FH:&Vdka!"v9属MPYrGѵ]t17ڭͶXbB1+~v_{|s*,(#AfvI ;Fw9
+A!EH$cUGâ{?GϦEa.Nۗ@=0=o]5?;OʢRrߥ`ɽmƻRHXαHȅ˹\A<5odաavPv՗. k"WTE:632UKbF%LKM:Apy?cWe&߂Ox>;L2=jy|S6rsڲoHIqUSJ޹;8"R85&18YCިK&ђ#qL{+7AD,?9k( ]Z	GOZ"7viM_'dg OM	㑃wCYUΊ(QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE i'uI?{S F?kvQG"" mO	̥?_s_!b	Qf8(&Ǯ9Z? :~~ fV1_׈Fʎ+O H d ܏Zn fEB}2O_A/KQJϻ<NiJ$wt?) 9
+w~%mUAI	P1#?+I
+E`}ߑ @pv}?N\}A zO*ٱ V/t_ a\qE'<n:kCdϥ Sͥ:uz|T9˗"\E[ xt)ama. <UXUnO_2O*?f[GL?[Ə9Ċxg
+47VҠ\	NI Q=!>&^q0׏C '^%OzsI!;I?t](?d ⪣6jQ  ֜/GLϨCken?Z4Tx?O*q!H3 V Յ?3c|9{_ ?v.Oմel`?/>B]щBVPThRO'ԱoB$0F;~AV/en=B[nNqykMkڢNNqn1G32[ȅ'C&~ܞ9ѵm_	>k#
棥ټxVҮH"n{Q(\9<o+xPS{M:}KOnNP\En_ˎW e 5?x0-|g ۦkvjq<݁L;Ʋ}	 ;w!v?c>9%?&7Km8"W>x_4}W%䡑#ずߏx7<7/W :
݋أy,V%lzWQ:΁7uxUvs:ܶidv}JF4_-~?ݜB+;
?ƚy'lqPd1}Wse؉VJ5V]FYRio <AV㢵:jr@p+(~$ g#ïOqk-Ė;R&IXȩp?i_|J߈ '|@ӭg7/ᶔHʌG84_xH ,
+¹xTs;8g40ԜVCbo់"׿eσgt yh=Eς<U%Ҵ~ղ&QKpFy>S?g/j;^x ZEѦ{O'oRQ޺8S b"<7hF:
+3fi>b:gH^A|[ sxKWGaq6o-EM]TNiE, &V tʒN}y578oC)w8H4ggmSɯ>2J*ngn]PƝ3&`O$w;T[:TI#9_f(J,ub6Q oKŸ Nzy  N | >#>1߽U
+?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( :&v@s  i.1/pb!nc GP@ }~
+VRgHF-X
P3l (~ǉ^ c_ IH k եd |U:l6k)e~o>>FOjt>
+7N}9ϵX%GjSHeP#%cxIo_X7/#~ui-H|xk̝C8@$5i-OZX~lp{{UVyϨNf{fObiSx_x:Im]9`ҔRa)׊xC~+ss eg<IOijVKxq]WdP0%Vđma0Z6,i UɗG*#QUݚb%IF.(4y$$Ffcڽ[?	-'{[?OzIu*KD >dET`H.6wM^[M22"8tbz ? o/
+|,oĿ|=ዩuYFkW{!lB.[<cKE8тpo}Q7Iӓ~h\ZZ?cߴ v:E$u^G8(!`0\FW@x8~ 9 ?~~^&?h|'۝_t[[Go2OO+9-;[>_0s˕}luu 4G?O[Wxßώ?mυ[kfm&0;D|>WPÂ#19?)'w=~?o{g}Ǌu6m0EpaO@qX`>pCU,zKϰw?xg~83z߈T2wq E`د(pL #"BF hρd/_QjW.z08_j!X"hWJOEE'۪8Rf殮H,.nT(a#U3RE{?hZ_5Sjv_lmddfRT	s[g1fxGԭu}6$=ݼ,nT2f?n ߷6Q~l,4I"KC+3ɱ~\P8lM,jӍ(Iߙ^Sdݤ>0pyOʚ0߆WG7PX:Q,%pw5-؆G)l:#ִuLoD2	SsZ^NNO#֜ 	W{C/rWk/,C^Bcc8k|K5 H+/r唟 F}Nz쭐:޳&nI
+˙agLmމٓҿ҃
8~'cU\ lhXgB?7 ſ` CS75QXQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE R}iiҀ?d  ۍ~#[ֿ$m'(?#=~;
+ y桔iIP 8犥\b?)Ȁs SP<$⿷/:1DIҿ#$濊9*};_og<GRؗfe~m-`@~;Sr:5e f=ǥ~
+(X 9$-[5i2ji#uN}%TKrrx Px_OoJ#'v2J(ጝFSHU[RLpw;uS|0yo#)LTqһ
716U݇0k*L6kUB	L>5Kך^YVIrWqj5?ƦBF~VQߑtulޖU=kO˥^[nށ~6}a<kicileI nk+ 0rB1	=wkEvGGlqId>I\|O$|:VZ9,O5:Gɒx5O	r%X9'
+-s8e/yӁS$[I'#נ+8DgQoR2G$Ԣ~aO01 ֶO18lqڤHw5`sUOk|rhyQv{wz5Ϝߵ5-UVi.A2:\f+Ń.	Tq诣 |`GS_9x^+T L+O,yrO >߁'|Tq㿭eW+5fs@ 
+>|Nbumg # ``c75i,9$+¤}ߌ'u 袊((((((((((((((((((((lۇ7 <
?jj=6   8FOPG_a+㰮=q,0@98i%sZ@POh˟VsGPNkX[L ?d п?PkXz_>A2##|T#uYKfUq߿Bj	x;BtGZGYFEP9#NI= ׯ~ٳǯ3W:uc[6˸ud9{⿖镈ʱxPe8P2_JD $V9ǂ+o#]m{;VD1r6濙AQֿr9} WBt9{X,`	d?ZH1${v dê*o
+.g:uΫC}>k&i#%G济oQS|R.%<lMO\ւ2~KV>jg{{O%6wh[ X4*MV-fteiUvaOZ Gτ߰g<mizլkc-ߵċuHU= /[TX9W8>WY_$
+q:h*;"ϵTMqYϙpO]scH!zw,%Vj?=IFn=H\8VW@/Iڪ=Ihdr{NP|p~xKYK"%XO.2:+BdsNKI,E+s42V2 .z~lѰI#h8lsW ߀SSm|:"ƻV;fDQt@4rjMW
+pkl3悓Vfў>2pj7J2>cYddx#|G:(58v' *3l},x ݻT'o=o?%m_1W
ڽi֖sLHr y8\+=cZ$~Y ZIn06o"Ĺ\ 5GF9IcRJ*/=t>Y|_n
+Wsۯ֦|o	0~͟¯ڿ|g❏Ueڝb{9,h%S
+xG윆 1x<86SkUgt|goksfc|t"dm=s`ubI&4|OI:2C^I>	<exa<iOYkG(>9A*y;$W-X '}|=մ[$:tv2 (,=k.Aizf%#OQ^
xVF:Vzh~m0mHԥx3^  ~Ox,	q>E>˕`Pr:Wş8t
k%G(?џxw4S^_<lt^zj)=j˰pgLw"Kƫ/m{WZ? r?xA_dtN1{k ҿҏ
z״ c^QY˯ujm!h
DWe4V`QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE gZkgu'  ۬~FH-n?྿N-KK_I㰐)-ۊ8F 皥,;GV?e : "#zſ..2E)5vl_>o%Y~gW%ƻXo߃^{=sHCOn+} ??m xc^ymi-AVᗊ]Y,k)H8CÞ7Ѵ:Yc ɴ#<^{ķ6#OƟ<Mwll.t``:ʞAǊ|3j8YѫRNF9pi:uי/ 5<[>3ƚTj:]sZȪGѕ]rk*њI\_O}k0<M{O%73v 6VF(cp@_C e2ƺeJ2q2xxH;CbV$__τ|S|':%#-ԗJρd}|
RXq޾;oګ^2 mkZ?+bKH%(i]9_^.9
ZXd&֑sT㌋^gt~$4oپ]|1u]]OZO57vFcd{~N8G#5{Lv\}{=Uk3f-=_n>$Ig q^
 -엧G` 7@Gedf]g\xoZfQO@I
*ey&AƝ:5_yVXOSf.<5<J5#]Zv;4{7-A%"OLJl8NaWaթhtHC]:'zv%__H-L}_wQkPxK(׬37HA_ds	hՀ$sx'k 
4߆Z
+. =Nv9s`LX{twNn 3C_aݛ
+{S~đVEB12Cׂ&QA5ĘPҾ4x~[@5]*X4O2 n7`0$~Piz6xL,j>Y]b5m)B{<5{ uO-#-3,zHԗՆvbq5FDav޿E%
ZZf쓌zޕ<e;K𕷋8u[S%<~\leI;zx~]9]|58ӋHl^N~%'
|;.zg9=KrF~`̼`, ~_5jW-dnό忉.WK{sgaU8?	~:fNs1qw':`cs_/k?i__
 c؉yčr&)w挓ìy^b8.巑<Q[%?wZ⻵$chs`Tdwf{LQ.~^N8=	>'/({X;/?25]z<%Kc=1h20;%ǆMVԼKkoU\(Jq8MIx[b#'&vcOS;-JvݖTb?Hf<Y5|z^/> MV"kph.xkcJo|&tֵ49
+Ѳ[Va#}3j	ImuNYVr|-Ȑ/@@}+踞|[.%*ucfC)96>Zf-ţxv\YZHaɂxyH$^rAϥuCP[D03(~}Oί17 N1	Y eL5U࿌!Zx-Ѩ8/WE 
|3TmSW_Lv3!a*[)87խw\?\W3A	~5pF@Ώ'on
ܢ ${3d_<yD1:VdjYI:|}M؝ڞpMW _(y񮎱bU3jIM 6=+Z t OO({.ʳaQEdEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPHN1?/+  wp?_x䴵I u3_?! <? 4\[tk}W;A5ҮF:ewA)^0cs<~|vQqoem5̂i$bs@ > ͩJAc 2MkC}[EմH$$w+gbxA yXogjZliOE\/ڴZ_Pgar#i6V`	 KwOվxKmH_hY"FqE}_xcA/7 
u˻KXo7WJxW p,ׯi?SB	Cx~Z~j,fR5Bb+|fE>@|M&~Ƿ+H⮫47|Cc,0-4w14hD=5^4 zΚ-܆9F_Њ?)Cy|Du?V
/Rƭsyrsy}:C+ȭHbdEG,|#.iz&Y0
+  O:γN"QZzO<>Sŧk*>x^Y\[ʖ	08*҅*L"Ko;maz]LʐEwUPbNѓW׿ion-]ׅ>(|6Sյ+eK}l][2m*C}џq࡟4B}VgaM⫿c'ດ5#Y6I",Hlq\qwm2B.U5{ W?5akK	%R<R-Y"u8ee)A؃ߊl>7yiW3+ƫ
+ԆԿnoBEm"Nmj;{I"g97%;+7Fx+qC>%
?@QCZ`\Gcif`T+]Rw^KU_˺Gc<Tz/4vHu}PnAp }ľ'Ï ĝ`]IsCPZv5æzD$j<|Gw\4o
+<
}yoqiy>#@TxYI/p,	T
+^)/7&"k7X- [o`0DFy#ܓ>I8ӥj<n+.ǹ!/i>ӯ~k~{kH/,.5R"Ib#޻scg \]O[$Ie
+UԖ  4W컡xk:m
"a-pAm7g?`,clW0*̺~$~#/ÖMN47@-;˰m$4{UӍ'w  O>EOGxJ):rPH-' 
<4q)ˑ澎 xGH gc{곴kUVhxe²IYE
GׇeH5ǷS1]񆍱kwNӢxe=^[."*$f{ {2GmZ\W45[AYN3럄ΕOֵ
?W泧ehפﰐA~;)x/<V5{R$X7YbB
|c>|[?&~7:sўF[(-=#n$Mx\Z獾߅o>>%YJ.mϝ!t26I7C9QJ:Oڽ>g._s~?  esH֭n崗P2\,Vte*ʅE|i2msR uknn܆iHh"ۑz	(~.k_ amOE
="5rehkbrIt /O~~7]b-BY;#-&mrx\lG ]u}>~k➯w;GgO)4$nPHB)$nl`s_w짢|3 %7jtWӭYUx^Ό[28Ƨ(<5߱wu{ 6q}" dٛ{{xmD`WYrNE~~89'P΍k?cmAs$4#}1RGK	6iKc^oS,:Sϓ?mK#m߈u=O[IO
u_K(m171joڿO};Q7n;7.#0?F2
~_K=u?>"Mce41kUb@V ry2+XտmxŞ1a;k_Mp:<s%[chPgupsfg6k*8e 4rө[{ iӯ. RO?ʖE֥.	b'O11?i~.H׼AѭXMy<9oPBC{f@
,u~ʺ4:ܚh򛣿oş5ӟiO7/ox5
phP+4aTg5'aRM*qu, b0Czc۽~b|zO'#Q?W뎓yqkd-<rU@@ 4░$v^«"Lqۃ_k$oοD>zsײBF=Gz#n15JF
$W Mc !=/=>iJ A4FLH~"i>|VLu _ ο` Z<wҳ؅QYQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE R[$s@̗ྟN 3 %թ@ǽ~Lޏ |BZB
+v/B޸FVV0=ǧ\VvDj~cZ܇#GaN?_Z**ddMF޷ñ_ٕbB@u+4/3*0x ]Aq gU􀜂[bsZY1e*$ta{`_ӡ[ǚBo@{+ZQUym_qKTJdyvicA95
|G}+A-
+&<C^hsJ`#9%0VZ0[@CO=1|2߃i]m8 <vM_wR٢0f%1wvgv\̿'wt_BeYl:m#m;滫Ky*]CaXQX	duKc!_NxҖ[Y\[m=ܒ<-O5y>fP[T bp"yJ-ϡ5;^nv]Iugbիhgy<+DB1Zkq]O]ibUxܟbi4so?TTq1
+1zx[f%ң#;yQqr{|?xsӡ{bQ@fn_LLs$P^g?ҿ)'Sݏذ1ǨVLݮd	r%Ñji6Er͏ްr¸^+mѤG*2pv5Qϥ-ڶr:ruT|b'4O?hER8!G8}y/+Haz1Y:\`vu?4?ks[iݼAd9D,NC#uּMQʞ:G\m
+@qd^vSB0ʵq{D|~Ծ(=,0h6WtoLqzW?grĞ	9&Y<e46t5cV\wOOq_HH<A+t1FY^NW'A`
+Gx5'|Fo^	ѫ(䴍{㞧_et2d'
Ѹ_?io~Qn6:3IV%ӿ3oyFO&~qIRsU\
+9$ZjGs,iWF' Ou(Μ$]U;_I]BWu  X,ó `Rz+GJZ(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )9@{ |EGXN9{WAz?<B)+
+ֶ;pL=*{7S\=`xt 9?-Y' ǅ>"6?ϭ@ WG_ςr|Wt~[l'uN?M?@lK~GO'Wm ZֻsO-ڼnn
?d
+wI#|X_O
V.ծ5׻	1f	%I g7s<^^=Q., 
+{h_ o|OOx ú5Amiqos*yh̛k~42YHқ!tn/ x{7^n^g~ڟ/?{70GÓ?>6gpv_!Mj?~.|Og"ī$bQm$ҳnpRʣڿmLVuO\Wq77:XZPL9jUTK$\Ŏ{w]>z 7ifE1 lYhqF@e[xpt6_2
3׊ ^2 fG?ǌOZ[&ȹdw4wN	B\Hc,GiifJ+۹sZxeH
|,K;mE^.ŧu+yM$m6Fc	'=^-CV?o!R4kih)}3qxHYbFv_\??` jOH|[{,mliV9#ThU|]Y?io{
>
"<AjfY/&Xq=D>HMe~"dqKwSØ
+^TVt`K+ȥx't)$tuVRzS%vj
+j/îmS5ٖ!ItB&$5ዦ3!#-5`*X¼迲=we]Twk×+
+VM~,;p"ʠ1' Vhw3[_8K_7i1|휪NrKOxgRtǅ_>#fDQn.+=+ğ _\
+aKFH ?&]=x5x})\E8el55i+k19wMJWz\~
iCmfG.܆$ Ov-O"=>|9W4?K/t&L	Y[{ddWʿY>kڝaw\ʄ>w?o
-1i+ kta$[;KK =?'Seq6;4 aUMEZ,7 Mzi^R%Ɏf}F<W6,
Z7ſ0O+uqu2FTjxce
+5_f-*2+I]wWZ}޵/5oE֑q  p9_9|OSuk,lnfwl ?k:sMu[mney*"FE]U8Wĺ{q_:]H4D;by3gwvs:XTOIݫv}$_Uar+^/ßgn
smw.w*<eW`)VAQYZiI_{Nk毌_o~CHj@T~3b,n!Vw5`xbS^^?%?M42ZF''h{
+'> x^ibX FLƲn[q_oW77wY/@{}+k#Hդ<Vɲ>4ai.OkumV8-QjN3< :/lKavt{Y%~8V9We/&_ᾩ-/W[aL捼b=k_>`ԭJIZ|A۴m;mkY:?zi|/iz֬ݛeQ^bed!8>xҸj877kIit{߿C4iDHYxwQb%e)1_˯J(mm,vV p_6ym>>uss_?RI'D;VmVGؠBOiጣ,\GLzUثn wHOZF_ɍ֒_C'u3}: M6c/þ*ӡx+A>*~!d]ZG+aF` OrI 2
,h u K?"6I/:=E@?~AM-V`QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QMlc + Q# 
+|;^RW HHS_	K%H?DH#־Ϙ;@=uBrv\6_B5gR .U7c# >&Q!,Mצl;,`p;i߀dno(AQfc"Kz ;	o3ĊfK?Q~Ú㖗{7-NMS@&D	1[F1HKտ炾-7{o <MqC{
66E^aC3eC<{j֭h]-Y?WK_Fim|I#o緂䃑Ʈ:W>1V࡙`uhM.?j>,~
+PG|J4sJ[ŵԧIa9C=iFXF95gYYݣl?x3q?_eΙq&[B6:8%} h$Σo*|>> O ^+UK9[E.x}~ |"{_oRZ{a>MzGaᏁ>?~?^!U_SȐ]!Z9<1̠µ"2ߏz~|cľ!]j#K&n >9+w/ra39(F][t~M9/|"nKtC?)"OZ.>+!In5	%,7r'kYU_#ox?nO.L4`ԮeC}i$+CG줏s{t~t[J<5ji[Z;M=K=i+m; doR&>n6QZ2?fZ"i~~ӿ?#W.m,-fM_{[u]@%6ӁQ^#y)<7i~ ~cxrxk-ʪiJ*FF+GƃS7;mBA$2¨% &x_/etpsBR]OWm)?c_>>!wZG"'KTe"6nkf[` ~wZ\I&ȱNm7`〇9j.5jgt1.>˩3!ès5dycck[;2Zg p Z+_xg\o[NES Gc!Z# l3ZE}xKN WH{坕b-q¬j~P=I5ߴ~˨w1o0 z5eY}-:*Ì",rI_e`ui/rk^x7_<]GtJTM+x`k+J<5xb^FkFP߶p<1~tw؟k[nIt<d~T1UlYBJo[I5ueX|WSMˑGa_54?|RkCwǬZ-"1YKdcq`6x|_M1Jt֢3אRwҵW3En{1~=~'a9 0ِZ*{ݔpvST۶,csߤ0TKJ>
u?v#Ke+yoK3㔓mI<ÐGQ_6i?Ӡ٭q.vrE>
yoZ=j=VQos43ˌ6dr ˰HeԫKb3޾sEF$U駮kK^Y&X$Kܕ ~|> x8EUc{{tMnIy{ |0.kx}G:ie#Q̍N
+Osi/BF<PL8tUMTm;4)T1wR~̟>5kH5M*,Y\RďeUIC| _3W//>7q=U-B0"bA'$c~00\('*gawwv3]҄#Y
Xa՟' u'8KST	YD%̛zm=ۋMRF[}x]6)S1}¿(lкHU^8G'Lҭ.兌sc,bE&!]ÂJi 1[Vjl5[p?
}kF9ee7ϤcVxeI-֪N88 iyPHtrNglDum hh|hz Qc\#Jum?L Dd(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )	-5n݀Q ৒߰lw l䯦u
EU3y Rc
+G+{rW:^Lx]8r=SPcF5Q֧+I,Nko~Տo7pA\0b'~!cUxDѡ7sok8$)s~~n3T_a_GfTvx!SJZs9/_3gRk~Gw_OᏇ?~x-+qZz[;yd2Ho06	xk {YxN=k:yk1jvfm0TGSW+4[ZLsf?kB VM=W[*5*ʬk5s!Mh|e⏆:φG_όǇ-oO_K~d4diL@ٵ6^xOY~wX]X.}iQb()C3 Wذh8ӴÜdxy2gq}+8d؏*ZZq7O1Nv{ydE(+sg) ;;E<
|5k=2gn4C&"ՙ[>T_0i
+A9L,Rxi8#W8+xaa	ϖg'ub?y&Sֳ{]Ρx2.5sZRO4ز۷g<V[	e>c[<2t[(q,-S DٟPEO-BxvπZx EN9;hX0Ӕ[a|	^8}ļ]QEh_Xijڅ̅(%*F@vRGwzj^M|9iyysc{qu/$0tB,g}к1!$|ǯ!+:8+hd4U~9׾?85ڗYC T:lZ oM}z~p]bVX>Z ?_
 ;MOAubEEy\]1$I#1"4XA|7iG_x:h%ltaϷGRwX~'_%~v4 >	E
i{Wm\-^RDgO) 9y>,> NOZ4MB=GWfjsp}OɂǑֺ$@q&1 ԋ
+fA G:GMMMb__G毀~x_OCWV{w]'X9z>
~|M㋿xLa}hzƟu2eVYR+l`Np?\ZvCNO_z{hHd}ܳ4XHkY4^$?:i󻟓3l {Od  /5;&Zcu,7IPm=Da$Wj ;{oj_j='Şм-Xu$ڠ%IGucCFy	vJl7t?_:U~Ȝo<ܯ}2o_b	f i? fyl|Iksx=:؉n̤Xڑo"4r'wcxK>!~_-K?5<5krd"s"BYhqdMC4% b?:UO,DU#G~U2tqt>{|E?
+W>E<q+mHuox#v,EZȲdS2k_7	ZOxT=.[:hD'V1U|
Wri1I rZ|^?M8ȶ*xj9;뎳<+47չ-3i
+5./Zq$sokHѲ	JbJ|ؾ8^ǿg '<C^:W)ɐM9}!FV܎⧃Ch`aDn{nQ_'OjjjRJɮzҔ\}O_|$k^ -ci74BG\}1l?Ŕjvߏ$5l͢DLO/(em~0Z?HRr<=% v1\ҬX4|RNsp͐T3U:f;'KLaA#?33d fY?<k i+4V+
 'c< l~9'.y AQEfEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPHz=
&O Yg ~$ש__!  ;dq[?jeXG`:MW/0/ҸJQB) 7t\Nt2K Z n ۋw1 \E|9Aϭ}L|EkAc$y$Àx|tyB>Vp@a	zG4Y~gߊe,RK{D^j{r+VH ġ=j6
}n6l<~~iRFQvZ׆`AkB̆_qkvE<	]tb}de1~u
^ZrmsȵH̥05n+F?]pA1	-1N1Z1[+_kbWoVkPFPNKUo(>OZs߸-?`֔zn|8hXKT̽^7W|QO ؖj^"o8{
($?hrM{νscú XKl'XF8бU gk/Ƹ<G]& -<Eg#,@IgSz¥ĉF9`|v\?8LVꮒ}pw:Qy}	Xi$ԡ]fIFk2Tе.[B3\7/;3ZayGKOF̅eG78f<7_Md]ind@\FH#˓j/:2׮l|Ma;KiԙGG;³X~}+s,.M8SP/S찞ѩb-cHmjZ=PFČk5
;u#W멄ZL,Pv	9hKIyw}4]\j]I.>mll	M&ޣqPNNM|Kǖ~ޏC⎍5¹o-4bΣ+xD9'X-3 K^"ep
#R]Y9WX:X%Fy [z] o5D}n]wG +mPpXsҸO"5=GOEWN%8,gD(
|q!{-:Uι\&K&QTH$rac)18x4|J_}#i5:޳ntRB~k{lF@<_76{JuV6HׇXa>d?N<;xQ𮕡ͨjZՍ棦A-K5_:VIBAwvp3].w3Y[CYjܞ+ƺ{&%γ+		aT3V
+%vF96^~.|-:[J=WLIz
+ss#رĨ?:s_՞}03LW#,_*pvOmg^PՌ߳ #4eмKAhwz\蒠#.k.#Jr==~YkzEoZ0[\,h|4ˑRnQ4qFGm.*+ 5tXF, ,(*t}|x~
*v9EAUkſMG]q! 3[3L!^xf`+f~<̎FY@ɷn0NOZ:p?+i1
+}q_o_k@=
+Y+ >QA!'+j ӞHjG-_ƨ/Dxk8b>1 d.s yk? #ձ ҘO ?F?'^6?X`~EQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5u#t=(  j?c7kj6E` `%U ~ǌO+X'O!Ǹ^]ـ&BI#6Rjơxv'kn֬hFhBhKΖ\X\hi:6q
D$[P#s\>.F
'G 'ҪNKkRHdFJp:^7t$Mwqkf[/G|9<-eeO;jKmD=mZ
{V75o-4|}Ł,sFz*eb&鞀Tqxϖ2[y:iwMoLVvY瑷ׂ	#úo[4c^#>g#rkx_T}FʹK,8J' 5t౺3ȱNFwHO `gw qZ3LpI#; E힧Hk}I#Mt|9$:ﶰKH6s# x fW\i2<Ko]dVBA`yHgִ<ajuCEНmrB# W<5dc7}֥t䏫ߎi_H,'ep$::U>;𮉢ks_+)Jr33cĐI(cñ"鍼޹7a=ΥofIjś'?3zVE<$RJ8ƨZϥ
xOE.4-/R3GcKh6ykoJtGچgsi%GVO1 b*9@ϊ?>&_msSwwaQ\;k2B`f
R±hxuz-s
Pq+ 3eI%wmGo8AJr#?{_: wn"ZH(jP-[\{H eVyf"r|pT^\hz=isjqK$^lFdT8&HUq1'+ΦTQ6g4.-WN'ʎz\8ʸ. 1#^g,&8M)ofϣZx:tˋ{XK
@w_HP~$.4iZ/խ4}akZqoT:־tOZnaXyo-nV-Bcd6<+{pW/_~oZ?(Z{ymT3Cmd*:em8(֝|tQ־>
*_Ὴ7#|Q--'2c(2mY:@c'7hja
SjQ'OeyߺyܥQ謹^?VP]hhJnEڷR3+z`p 5  ex['
@c%R]: `r1r0H.Ƽ{0]Y:;x{Rd>䴚>]^[,LsF`|F3~|KiWfaMDM
+-2}u)ˇ
+wgm|-~>"֯"6mmG&1ISSe9g>tKZQ
+^j$kY̍
+@8^}Nzo-Kba8SZz\	4m2ti|g1ٟlCuƿV m
+MܚƯj_'qHu1&ʥ2^9K)i|1Aqusq5I52dPJ-Uv}־ό<i<u͝ƕgrזcIIgPb[3FU+WSm4~'dk7:~jr_hzg񶥥7#HQW!โ<+H("{h)0[x~[H	5%xͩ}y̠q5/~ q}ť&!MĪɸf%ʸ'~xcĳi{;
ؼ#Yݬ2$bqxzWfձYA~'ڧ|9U[M2Bd>	-׬45Y"ơy5a$^8 u:A\U6{"Yyϐ-;Jʹ`1O5%e\,]Iͻ~u]SzoyOnx
+ ӈG#W _^iZ]Mbd12Ż;P+d09W
+Y	x'ֲʱ;+_,??p7w z IҠJw?MĞ8#_     W^c 	'V ҨQ1&I>? @?}袊(((((((((((((((((((($4s cgo@l6Zj dZjs[ Y<,.Vϴו^3M{H
+y}+RA+}P,]皻go/4䲷ѥb6cgCup4}m	nOQ'5|Byϊ6YI-zn5B&;3y?d\9*|_x:ɯ_xPw}{?)9J˧ϊ~xVgitc1׏Joo𖮗M1Kpp1pk_nu|3k3/܃ҷ	JQ~_j@RV8G}tO4%4'd{,Ouf5DoYϘA5闾4]2:o2+9<oj&½^ݿ gw}:ɒG$FM+šM:<ԅ=#=	4j{_r7Iwuh[j灁xmEjvzRiA"4+  >)-5i
+I ā,6}ON5\$Ho*n`=xCҋPXwIGTE#[ziI{aW|;n1<+j/$_l(U˄ݸ {"7/XF5e`W~ p~84eҩԴU$zk3*OQNJҺt=Ғ&3_qv֬~0x{I|6,t?*I{ TC! W~>-|'
xo.E@W Lʇ">G'pѺjJfYZkkPG ,:tKOECᾏ/em	W++ɿgQ[3? 8ikX,ye(pY!ݍȊ8Pk>-tOn-IZ=R4rb%KJR EVYq27 h };r>ޕ:MӭN8;D_Ҹ*SG*os<3eYxQJa{f|	QF.+
k:d{ۆ&[y C._ 	~$}
+o9̱.{ ki~&i^g-W2a9s
VVUkb.ߖDrkNxO"ўh(oZP$x 2N3ohgeZx➙`ח7ww3x7Pic4iNsR&#NF:vHPQ1[
+aiR6-h )kZ
+h~(B{Z.ἰ%E23s^|;Ҽo+x^T֒3}w%"|lf#1#ƫx?]غމjE 4ئBExnhR['Pxg6T*L\5ݜppq7ҎFZ<MaiZOnmjSIe
+do%{mG5_޾-&%9*c< +eWJαo|6o:\CC9Y.9< O?_Ƒk 'O졫޳>Y'ɆV hk0>F'O p\)|att}RRm
׏lcj1H
+D0s+"+Qߌ煬/,~'{8x @ q_ѣ  aT#Gt[<	:qJ-	[MK}IBeI	=yO*䘉ԥN,)/s~yOS3 ߴ2_7;4j4@~޵ BOuNHu5qko"|$C)8'$b$~AtrOL ӓoբ ?&a5+n6hH'~)8Uki5wj >\|SѯUA8巽s1h .+) 1 hRR/5[Ym]R@,@pob_>B|φA~r{m/T l
ZU`oo8m*8'Ў9EXۥ_8%^M[G~WFpIsҫ$)[8^|ēڿ:G&Ouk?: T6 _x?z +?
dXu Q5y?}u=E@?~h((((((((((((((((((((Ma@Əb?dl`|2	 ȕۃS^ ;?߲˰Yjx'Wz++c=^`Ԛ
An$}vQ7X*Z"N#^.s[{k4Ʋȡ;z+Zd(g/rIcC⥷H4}fٯdmlהw/~Ų'w+KÌ	ʡRշ>&`ͥ:Y~G_DA\A,9@~)	[n%AWοɾAeG{ZMU5pާ~|.#u+sl#.iڒ°c]ϲdz8{ξ?lnlrN:'1w/5)*EkTZI7@a=9-g4՝8!V唨l	Pz>鿴	),鴄r\eOӟzD-k+RבA
IH~|Wؾ#uw0Ċ3JfwS2(/5|9uPv?*؋ⷀ"
xb33<$GaYGQ m"Ёhq+Jb,7V|DdLZyV>4𜪅5pߟZY|C Z/ă>A=?li"~fvy'5S[L} <3ѼO፪sɠZK|nA9 =ki{Nl0W<}?l mlX"vr1Q*2G6z"-0_Xk1Cka{_w6(5;Y̧zسQOx"~~	 `r~,N˳\2>`B
]]zW>Es4;aտn+ l]	"pI~x!ʞ糔))r};;7f n8\zFY
+&5߆V*FGBztI⁸HLC9=i~Us<{aRرc
 >"GJ#X"+ڶ<>9TzlV/ Ubc@ 9#GD|tZڹ
+0:?jhIќۈ$$W~H+gVbv`rd`0qj~Ԇ(Q>nu9=6A>h${I,>iw#O~j:䰲\i\  |_;H#5! B{ b JCw/<ֳ^f^DjqLO0x'J| *O/O,XyF Ķې	8OUb>'gHSӟ

*$7\4g*6ߟ\	pU1QOMe٥iRMɥ}OIA<V@3pjrwn,:w-+U|lxhWFrN J kp^
`s  =>*Nu8
+/
	u{ {( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( cii
^q p?m51_#^]#=gRo+
+0GMH_r@8=k{1vzp>jFF'q^]qח,x~^Ϟ?hAmtȲc?|mjM,RDPD潫 '0t&2?u|s
uIzH_! 36͎/;!k_,cV?(׃nxխr[Hq"e[#ӿ5i<I$Y+&3:nG1_=	l6eʇ:]-chfLdzWiz^4ÚdiR5Sp'nM^Vl#orIx^U[
}`סHLI.׏]l"CΞI<"~lqּ6ȭZT9q|q^EmV8eH }{	?Z)Ul	>񝹔KovΈp&]܎z+r$pė OxcӢUUmÎOWֵ vc һcIz5KZLRYgIWW#d 9^逊+]@JUu[tp+hw@ؒķQax᐀k7xv>_1$ߗ3үCimܗ}Wɩcf{~YqǥD-9A}J+hfF\JObM$OI<)A]%{"݈$2|8$!ֽW;eY\~q<Q
+jfU϶FA]kǞgnK)x[u(V
>W_nd9' *rDַ>#~cǾ}9ωyZ65uxl9{,}9't,gڋ#lIKfea_jh#$Bzӟ_-fRZ@]8?5[0iVԋX1fT	}ZgeYw_1GU!p Z125-NU|3rrwc᎓S2y	+4*G0K)>zH>/dH]ͻrzÊ/e 8s'xZpR^Uk|Q֭ZK9H
+ִ~Cng#=`+-`|})\zY\h͎t>V
+Mi-w~1x^}_޿)^uvyT.ޤYB+v?69' g|%F}.Fk_>4R_?k//ʬ~BN L=WX ҫfUQӀ R ڢ[	oz OwV~xC!Gޜ?j* T6Qig7q\~ G֊@QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE #zZF''V ffP>j'#%|}y
+3ݟ_'d ~$Z Ǥ΋ۣIMC}v9>^mBt#!\fxB^*Ɏ͟XJX<QotVkۍ]h>Wt&S/}⾏,.u}PYg<R|V290?X,w
ca'q<kO*<~Kч%谿 5`i&p kfǚ~pat#=6kNT Ʒ3=cO:NO]5iВD[nBAr}z=k|| <..$ cD>7K%<f[xgDV/c\ME|8Oڭåx.+σ.X/R\dr?+ԧRm#ƚwQf|\נfHNbZy8ٞSt-77 gx^i{<\K	 [2}ہ]<)-,sdh[Y=x8te-]CuT!Vk)wm۹0oQdUUXܜM{q<!@1rvFRۊt"ږ[E˒2 PN7Vr3ʴ~!op7V֑;K]d9ڣ+i;pj1Ԩ}k,.]'^2x9nAU8cH鴻vP O!H =PR 3^RzF"ͭw^
+e1_L̱5?<s\^ueos9$MG`x-oKW,BfJJt?c0l4YZܱ/>K~,.$i'eu$\?*B  EkhN瑞O$W'woR.qDY|9O=??¦J=_NpGHAl᭡tkkFo~QZ&eJH:3;ꙋFG㍮`Ԥ0\s1tŝu97ѾzןZbdUؗ'֓kl Ē3SJG4z<~$ңktW;# 	F=qHt6hgaǘԞǾyH,	gEvbGnRzKKo-ӯમB:cp3ާ],[DնUU'<gIqrŅw0kAnSD^$9oWIDTp:Ӟ9[gLHTOzRihKM?Odv/E=%Z=
+;W~@s0<_5^<
+&O=F8'8g f#[yfBЁN+jբjeԤs~(iLvXʷ_n5o%(InB۷ x֤ӵ3JL@c<oSbj̷"ͼ|~JYU+ :w(STq_ Pp8SNzTŋ7<fH_5% 	u8oFs )<o ˊ * 0ox8
+;
$ + Ny.*:h
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+kgԍdP G JX ?ԕ}}GIP?3__pkm z³-~XcvLr;
+_nf^z5$ޭc>]exuWMAܒGȏ | 	&/37̥g 8_E|eѵK
[G;u9+u
?[6r:zg'8q[#ikIOή&;. T-bAKHFb޾ ?5,6Oj[8I%+/wʤ\G+P+} hXҮPڨW'=
+
+]:^J6 ~䑏i4
+ \ qWCV	ZRÔcbCXx0-cV9 HZS
B|+ii/|i$pOtr}ҧbglu_k!r|6rT19v9'/0GLcu'h5)%j7%Dg}4Y&T͘LWhLm,Qk]|<^e"[m.x6g~i!&G. «oǏYm9XGˍi`8(QĆQ ;ĄұPZ-L9nnq=uTaXCjȃ@}+A5;,W
2a[5<Q-л \H|)^oȳne0q녌=+:v2ocZaa:[G{>d%n&D1RtXqymr<|XH=Fjd5bHFqOk=[;
fpnV5< ?ֶSW xbqʓZeo'!J@8z]@t6>UXb:[j"tLX>n>ռDr2y秡_e[.BA^@ޝ+tfmkQޮY:\tǥk&ey4Yo 9AU8EI4&CA ,à]*VDcBwɒ79'5]46wXJT8rۻ֨X#h!s$dUK#նG$]8`ҍ8<
+PY!"W}s^rnub;;YgPt? liY얷z.HY~+WV0?hؽ,|hc$0/< G\TcŢ8o&IO(cwֲbң(忹dG3F>] E+Ѵm6u'ֽHT-PZX?KK=7[fO/ыdTpk+d>4|B&^-ȅWx+xRB|Էi]=qk#o dKy<Jr13~ۓi' ?K1XTxq$.[*#ĐjiO p=j1݌w⿑%su;?gB񪿇8ώ|o ۚ +>'^ӏMG_ ΝJx O4-n@c=EQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE kt ;X1 '-~H\.~z 8_)Ŷ~ik:m=Dwcs<=+sj`)wr=Ɇ?\		$'޾V,iqȴFg?;`v54;md}VPY_.}
+2sȇulr_?>3!a35kA}wٷn?b#knLE⻵1$:{"$1[Z9.ebƎ$"e,"[<V'v1xWpǩeO>"xsyNwxCNou5֦N#Ӭ%H2GVj^%- 6%F8І-|Qcﷃ7hxhr{v-"0>eD]G|c椳TnEV}voE,M uQV[3t駪1HU߷
+މu%dʓ\	"
^"ֈ[IFqF ֥.Ҙ3HB"4K~קB6sUʿWLjw`J*=y/EJfkf~Ttv!wMJfx2dM3\>d8iGp7.NGB_آ7iAFqڙ$'̇˚,2io*o1Ӣ k-º%G$Z~ؼݎ&40LU@UON[0WEC֏hJd# 3<n/4Ko:,`xdtzpsSj
Qͬ;pVгu!p[Ws*0*,Ą)v><k85cI/Qk[sgptgն=0j6mfrp:rzGּ;{_:k˅/m_W%}AŨ-jAq U@׃]st=O +{0(HʹV|I[Yȉp}ڼXm,m,(A.	P<]= j)l2Hi2+zzԾ<K"c2t+ј~iikm'~C|rBϱq:*}catH+9 >ítH5e;,F3"<6uūz/2[K+n.9'yzMgTKi$9T^j*څx3$QBXzT~yVs#"z3 @ p'wQEhsT6wyn%#`~K7yZ- 3zU;-@OЩIEq>:T|weŵ1H,!~RGdswUԌE-ы&6ry6d Q1&/?8oD_qI1qOD'YO(fPGB8k0ഊD#ITp)'9M ~ʶ.VVG{ךa8*	s_Ɉ> Lul n{x O5V_?|_ 'oo ۚMQREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPM`OJu!8 qc ~O+;Z^'99ks@qsxv8K}w_cp ކi&RmU_Bsww%I7q08d8p.x\O5Ԥmd~_Y4T?Js @w-Q0'W*0k
3F2a1$U:vhRHvi{XKe	Q8umWHӍtwOFl,rv۔R8{qèLjs۠wA
+5m;+>ɩ@(*8tۛI9`|UU#n1k Q\z4}?!U+Y%!f=;Nwf#"_2_AmъY[۷qZ;m*mfrLHG?wW-gnub5ƋYߥt
+ZhVL-Hr	n-txҳѴf?B'y]pOUC4%X@7?S~Ѽ'΀W]
+鷩=2yxrpZc{
Ua<^~S=p*ԷgLne$aq.Y`ğLҲ[o"IyQhշȅ=tGGik:K:E9_2RvcQQRxsNkj:PLUsAbo"R>Cb9ʨM;WUht)%4FIDSJT/en^z]skt#$n#
+؏Z`\ZD] UV*5EE4 "ź}~%si~ {X0_A<WMXf\oufV}Bo-2zX}28<Slu"ѯ)_8y@O^mum:bϘQRF>ghZ=_{(͙D8&Żަ+ZǪj:5z]]U1@ xϥO-AX Yȱ#r>V&ن$+qWSaԷ1#\^Z'dQZ>٘ `g&iVM婇SJ[;lѡ1>>8\zz$`N Vr{
s_Xlf㘓+R8Sk |=ŢY9:eE]p26@y# M}b)jڃJ-,z,G\/5b,@ǧ}qSXk[Bv7;3sj>+aCo5YY##8 )8^q]L d}Jƚkn< \PHXt>"Κ-Z'̩4h==9EKķC')v9,*L|yn)yy%k\'Kp?
+v4"}RAyXuu#W_&$xdhX9H_kq_xZO-zkRky@$ҡfܥ=jGl0{]QoóWÁ ӿ+R?fco n'>!ӻ W`$GΞ6< v ?Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!N.DWx<w Gs:b;  
+x4?9+"-OOc9h2H!sҹıZ~>'e99?J%.g?DѶa	$ou$WRr
+ge2	7+M}/I͟xd$)2FB
+w98#8JH\ڗ~F1@cůi3ĎkBIq^76Җu8=Vl7fSY	 Y5%\,Aǹ⾺TMu4l9,[J×di'ݽ=zWCދ,b1>^:)Cv;sxV8uw': Q,^\`n\s靘Q뎵ѣ+6~:X!jBI= Cۃ pxq?4VgL7 ,OE1~㪈xIm{ٝbRL0S;onRý8 #jY~x(^ey'̖]رNs_y 7%𰏂;N4[ k`ᴵ3xZtq¸:ݵJ'!Wj !<6r^5EgŲS
1z	j[hg0&b}ykjyR	`'<O1Tmfi"\X;끀=*PE$gW:ף pQ'-aeMӘXu?uጘⴧQz}NM[,5;H=0]z3O^ho"Q$Ffϳ+b_Vy f JĞZ_xqT6~E?t 869]Yt0d[CkZ||,^gLWҺ-;5moygk`i9`!5<yK}Wp*0l;;?h23Z?`?.ʹ`r+jy:b^7:[	vomwca@s\]ie1rI8Ղ` |	,)0j]K4yʩ	
+ҽ8:qy]iֈŒH\H_zZlMaiug*ǉW/dp[$tr=k VI%CIo-ۇGEn^>|KH
w.a#7Fg9Ld> >G&Ko4
M.Hՙ+ۻʉV7Y7c c7r]Q}[hyιimͅu-F?60ss]\ڝf&Rj`YdG~6)o眪rnE{iEsm[K1EۏNVF.ɤ^YYg=j!vDfK|'*O~s]45)#U-ăqh}m|%q~/0 >Zɯo|IYiAԷLp[O
%x
d;_5qz_xU4 >"+v8C,p:y\֦$n?Z
+O9S_H>kŷ|Pjq ֿ'
o όk ۚ +_'?s m
! 	1 ۚmH:R ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( oO^)iچb
+7> Ŵy_|nc'<_WB~_c 49Ṻ?uBVޤbǽsW2Vn8\\?8dZ \4
.j2uwA%{_P~вм0TBN \a#.[I <<5UGV|k޲I-k]ݞO:Vw}w.(=+$Y]YZ9rT}yMDss1Vc־got%֧ӟ<Z-4VD>i'Wы4<h<_|8')PmUT\cWHp7wP+Ja0f~?O^>o
+_xfY3O."6eVUw#	Hx'
+~ߴoۻMw5|Y-vukvx!/"r8U"q#w __WOx;ƿoIuw?Esc,ncUwkno g
~G5~I
F[_%I(lUJ5+rzT);^_k	!'tx/M&#n|)nlQ<Cn0uRW?G/ Vڣ?WJS|6|(</[j&5/NdF,s*G巉^I*-weQݣt}i[#gƪ9e[F?(ܟ^5c\w'Y@ Vɫ&½hmpNpZkk:ukg-llfH|dMUc_? ÛN	7]'X,2pI2iy [2y{\uS6zTQeUf!ѳ h_Zӵ+] 7
O-}Ԁo(sϓ*RQvGv&] ?Y~!x쿶s&?lagu˅^
mcw#Ʋƒm0i?B*ň?hoT ٚSxiiqڿurF%Uwd /' R^[aeB(sܚ'ԫﱎaJ4=u5<@+ZQZ"V>Q^'ӎ3֭ƴɨJSč^h4unzm~ɧ_ܫNfG@x8W779kgrK+;&۽\@"7ϟ
8OuH4Mf%ӚYF6;zWak|F>~Wz~)П[ӚŻ<.J[d ca={SU7(~[  *SVLLGw~, a=P	uOChuM[4&x$2A_ k?7
k'ĺ­3ƾ2Ѽ
[_iv[[H2Df+k)E||W7_ψźn;KԘwkiVHL#}MϑfjFi(Bk^V]vTԞ9^*{{-3&q1?J'(2GE{&KqoADQ'8OZW'lRo>CM=ͪjvR6otRxZk0ܭ(R$bzGlzsXD
+uoՓtUiLEreI_g(ũ߲ݤNmϞ:ǃ}+ V|@M0Om̘\n^$go\x+1.q{߷>&4LDтѮ-s _xE Ϙ<cf +PdW?,OEiEo' m7GM`Gw  4H+~dWhç9WBrjE~4j=}ChhF@09(((((((((((((((((((('>kv 	sW\wi<g59W2mFa_ѿn_ى µ9 +bu+9=u7gV瓍,pzic¾:4M|$wdln0=M|ύ%Y~T 澄RM#Ï!`	 RM.b@ЖOҿNjt/3sg/jѯqxFMk.BO_k`Ҵl,"I4-IEhk62~ŶieE;T)>#$12K'vrEw**&/VvsLQߩ+ e|5S;-OƚVW6qŦ0)J/Q_3rI+RQ؋u >/4GKAFXM?{e;#	 'I²G?ws '|+>#>K7KaXIP!\5,Yߴ' fy Z=n4
7RX-R9nf5Q2J ZH ?V? ~_|M\~$m6VZIuo)V8/Y#%VCj\b18lGQ4vբOV}
+?|9R̞#ffn@KTQ%GHaUjfcH/ȤaV.N~x'	x?:퍫~u?[\\C[h^..(Gۤkp?5j_>~!s\unH- j"fm 32}GJT81zߛ</M7y)}4s1\BX^9L~^;T4D76^F'wۀ=+' e? h~!|R$m;0Y$J@Q+7DEz8bwG;Zw1k6Rx:ҔRtKv`~Q*+FOm7?(?KGп'F,IA c}k_DB1d5󟣬  m5K+Z#iZ7W,EΈq5:4Rf)<Պ.?`o؃>wǿF{}ue6[Q[{hn&UcWևC^j-  <g *a=_ <<<J=ċ+x0bTF0~Ay%6D5븥HXo`0[FH5E7<xQOS4?]iq
:7BIsf^&db|O 4>!j?xFI5MЮtW.nEn?,z6^db0GgcSʹ~v#Vwv/f	yfu^_eW*,j[),(,C4IcIVMFyr0;zrGc_I*7cRѯm. }WQx?upPm z5m¿T	xD|?7Ԗm?f+,hG.QC1刯 I5mrV
.v~ɟeY
+}gptzZWPLHn/Y!5U2)mZØB%r೿[
gTZizM֞Id}PMxV9W2XP>hMCgo@ 7rk0X͈m
+$Ѝ	Yԭ<_:?luA{.wAyiqVCt=F7Q c-؟gz3s5us{7R3+:Gbg'm1e	헱M6t??c` w^i"-hşr<qP\C.6<#wM5̧̎Vwc展!+G}	gdè^;Ϩ^Eٰs9)e#=Ӵ_wsY$=[Q\vψQ}u54@	%IǍ;Eu?W't$c;|x0+Hl:
z#kp+1y)F@JY??ڝ |RWX%dD tN)ÀMWcjl~ze-cοi5hk?j?/O_]6| ;.-UG^ 1 NxO_5Ҏ߉ڶRYX`c- O˴ԵQH((((((((((((((((((((#HN+z6?aVv_n
+|9cFۘ?*eokxc=WOQI ́O_A%9+$<T7[UQ.L0b+]j<9lݴBWЗIʞ+&f%2~ASTk.Ԫ˞gj
+i) QI~*JӅ?JfsבY
'8Z$KGtmYLL4co]v/6s{>CycXLx=QM;yx
+VGP3Goң HrN}15XqP;\۵zPvy~XQN$1㞧V0KZQ5JۙOUw`qߎ>"9吒lG)+w bp tw%s= 
+}GWZ,H`T_
+UN.ͻj]SQ>ũڌ6-g,T
+h0+'D8mX7WGLs#mt檓ĕ,~⥖E'[HЛv..~b`V-ߟ_(to o#n	iGN{OLqUG껓;t\M_#	pg:m\7>ZH1TxNKui 0cg+㊃ 8 Z쯸2vRDM#;<j~YҤiY)#'>7Txb	.'QM&ypk~+<ZH'$F>gB
+#'ѹ,ךQ#*8Wϯ\Y[F?q)3LxL۵c^]+aץQac^ONk23HUbۋ;f8RkSZWϣ.0F䯙
+>{F֓n
"=|IfAH?topWϭOóZgtv% +kZ=̡ˌ	d  cұnK[q8'?feOՓݗ0礵#1P ,yRw9!AG$ʞI  1C  W6Hلf_?-^Dğ]'n5o=!c(z+mQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@#zR= 1c
.@$t[w,%+s: R)wo HV~l2L
+}˳>o{Ǻ>!Vp%uHbY6n 0ΰfs]N6;a[x*d$V]|G {FVsF%l#1 
p{f'#q E'<䓷SYR3r9̀rk6v9eނv0/t[^=82?X$sU9N|,5}a,d!,I8û
*GS֬>
q 	liBg
++u"_jt֖w	q$96G?8 #ޒ\,Vm}&arQԪzTg8hf''*0
+ܒMK!9v5U,9T ؤhM+ ]d֭;-^ *`q Bv1E},RCe=#}u-ҵ):9uQYdB.}Ni]^^iޗq3{Ў
eW=I}wYyy{ٖ O!GaXT
+`G'8z֎WЬo[˂BK- ;SO֡H]YګV*/I9_o
\uzisR0(䎸ם|9]xM^I=ARC
]O%J1d;Cmb9ۓ\1  (BjΊ;1U9G2 n}
u}OCd5	
6od0w>m)m擩[j~W5?f\__ٔ)6`'> =k.䷒K+caf3Ce#$q
Ǔy[dzU)/zؖf^1PdlJnPHH\ zӘ=Vf%lPp{TnN	'N-8Ҡs`h}jsRq<z)l
OaN>lo&i<?kL7&XZx:XR g
 `?~ׇZ_c)˟}6}_}  dߵ__A?|i+]<G˄۰Gnif	u2g(_Glj((((((((((((((((((((((Mz#  &j V{_~Ǻ~aPxV?f$l+@j9# z`
~ľ(#~'=g|=L4ɞu>S;y嶜k)*"[ \~ſP
>ѿh:fHzgtL^É
+&ι tA䭮g̶_۲JrkT^VLvOZ./0vx26ѵDd}g ; ϐt (]X=s˕I8_i Z&sY 5F5
+P%M`E\5{O-ՏUmĶ
Z?Pl?S_3^*˸ \ ࡑq
zڟ:9gfۉ8CG$~]M  F v#V.+26
+L 83I1fz2yWV l?_'xT~ *SU?ԁmL:|Q`8&>~v J ,$ š}<Y7! )_~tJ9ʋ+ǠX2
	5V6K
+ZCCr 2?S{x(@*Lw<'kg Rø	{ c?ऎ[} vt `3zgq! ؏)c ~gy񮣜c)(_v]G?ʎtlB&WqUI_C	 !#'=O5&(9 |j9Ts ?K`@@l?׏(ԃ
_L52?( A>-N?%xVz۔o*k	_5{
+	7߄O[s&֎?%53ڷ tXzs^6*vO<Wkmȿ nP$# JO4͜&K%bn IHki
Z6u&Zw~{+)MAzxoX23qs\&Q݂^&GlJ÷|+gHW?y"\v5وٟ%w-Z?tm;_Ԭ.R-Ǘh3S@'ʷ(bG#^?+i?5 A/+GaaA
G5-4EO	|3{E.aw	`(RzM >taoO  -#j޹~C^+դo$F @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@=@4`@	KE ݫ&E 4(3KZ(0{6(FIS=&u GؾQ@
*m(G"`OQz
+Z(0=&)Pmh*
- i:
+Z(0=JZ( ( ( ( ( ( ( ( ( ( ( ( ( (
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/samsung/galaxy_tab_2.jpg 2.3.1.src/images/samsung/galaxy_tab_2.jpg
--- 2.2rc2a.cp.src/images/samsung/galaxy_tab_2.jpg	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/samsung/galaxy_tab_2.jpg	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,100 @@
+ JFIF  H H   Exif  MM *           J       R(       1       Zi       n       H      H   Acorn version 2.5.1                   C 			
+	
+ C "            	
+    } !1AQa"q2#BR$3br	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
+   w !1AQaq"2B	#3Rbr
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ފ ( ( ($yy(Bu4րEPE{E&A)h ( 3߭ QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QYzkY>܄DQw$-!hmeF
+=I5OpuCf<3
+3%澱ݯwAg?<I;Lw߰O.<3d=	f? T?xu}'`]6yҨTz >(6	:`CX=x Y-r}M7 }hXĽ?Tk o%#:)5oc!Џʀ6<G:gF|Q.yx~d# ^ 
d[_>! ֥Q?XmSyT^/Qʀ75 nu\ b-`sϭU{:@#x\ lk5&>mgY<&)/PWM(ʏ\폍u-/&֬nn ^y&q{mf
!裨QS?5k}c j''RՀ1 5xY ;`qTWž(3>v{|Q 9@~Q  sGP9AS [:}Q 4\_"?ݏ+ P2IqUȃDFo?!Ũd?Xn*3c<ʟ"v}*~2}Tm~cj n_4~UVMapNVD>v}-/9(>	M~<\"9~ntvU ZH=O;>hKۨ d~>&þ, -@-T𷣩E~8y<rS+mOFխnu;PRb:JJ)?`!U>ص|InGf+ITTk׫kp( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=5:5q̵MNI?ԟ@}kN&b,l |
+YgFs)Os@;,IosޘʹRUirF(>\yZyGX 199-Q e?S
ǹG>)FIemB xI4;iA@
ݚΒ;O1 ΓXE%9ީI1z) IZʷPrUN3ڸBHy&=vAg.篭4g9bj3r؊sM<jrÂyb~ oREBD7q֣n3@{?jtKf>jµy]3R\)W O4dgnjAU):6>Zn }kO߮lr+Hc4~|KԼ-->fs=[bH/OB~hڭiƟ &V\_Ϧj	cM[!2Ǔ GṇXVSXKQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W	m3ķpe\ *ܗ$λ_;N Ĩ>m  LzAެ⫿4?!AFq[+E9%F>P.9뚬YIu-3_߶ fkK)tk_|H	[MvI7 )K)-H
+ɯ__Z%]	d>udTl34] Gc5~#x@A/gQeL#I j.BtyE~	S {9+GZ,j+2:ӏH= p	nyZ~]2O\zP|'8q(`V{֧9NN7*cr@N7_b1B\k#5?yr$n }GP 43psP2O =,2S7ޢǭVeo''.Ns@#Fc=)9犀PSw*8yTF8jt`+ɠ.ea<T%N3Zs~U.9B+x2s=tIbGw͜S͵9_߰.Iyҿ0(ҏ4Hן 䬫|%Gs2(C`( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (:~ a_5?`1F C-y_wo@I\*\<MgΈN TO0S*+}s\/P]^ZʷQzOCG Ruơ\3y[9~vxB^h6Z* 32#1\8_F ]fo_x@|A1ӧa7+pFkž5ݴ.M|!Rzp!ZOc$5߄_R*'sK?giZr[CUz2f گo'V~ktե};uyq=p
I?msڞ
˦|3K0y;fn&\i'&~̞d	~4[zFyny7gR35br6W\|S3q|Cmf}&-B F=뜈!
+b{e)
8y?3LRMg~X1P
+75 Y+-'ß?+j<wopqp"H4=$zERĘP\99g p2ONWqϙ]y.vUhۭW㩫OUzʖsOJ"O9FI5JL޵iu1(gJ"i	,+I|)+֦\g`z88-p  S:y$椨O,(#>sV* 4]l	5a=[s@+sUfyX# (j&N 0rk._ZqY=t\îsĊ\n]apdMxd cĞ+
 Gx-%e[.tQErQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@oFlt	[uƦ7͏]J o
) m Lrj^qUq gqXS=k~pOzÜr>d;h_l5-.kW~V#x<X<A O="~.mEogﮘ$ ͷJa&yН?
+C|B>w[ŖFiiYhmt-E }JFF1S`cg9"HH;WS*'&MФ3e?Z/|zUztT9Z	\w_tI AI׳r4GlSXdp56QQ{L9QP"9$UFM DTHBjbfs4Y2z nzG3Wd/R1 gJI?*..A=ǵPst(Oj5x]<5j@s(?z# C8u~~i>! C?Bh6
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(8Zi em  (kzfp^C=~fEjүH <&yvXֱܸ%~8?GV%r1U ?BJq@CP*8P6Z)
]~A=ꄧZ-	$V|W;rOO>rhq Bx ҼG'eIJ3(qN:U!8dj Lw!f<=#"<ڡc?9L	<G?QPyjr@᳂yH P8={TzP4UGmzUI: gY<.Nx=kh ϛ9sQr=k<9~9aja~+w g C8_߰C[JʷT=Q\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP1mV #H`9;or1TjNU.0z)OYڟŘs (댚Vd*ր
+R6S7Pm÷^jzCQ@fpOi;sU9玴ט|ܜr3Z2#+6`W<V!&1˚I־'{(:'$⡠2'ڣbAS19b88$IbF*>%5=hp	jԌqڢn	h9<LFCOfPbj\U j	1gL8=EfYe	Rs\H]$
sZAlu5`y}ks _JC_C ^ o~QElQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE q3 } N8 Ї\\ɠSqިCWfHMʚ 9\,knSƔ~4BLTb\9@@=@5VL8VMU#'dUYoJ ) qgNFM]͕<h"{%or+6v$ ,j䇎c@Qb嘟֫5!945]'u]7&B{@ݜT 3Ԛ a8,s)88j"1dlxȨ8549GCל c1ҫ9=㑎{U7'N
 V\ǭf?+BV'vHgLNZ*3szu NInkN/J`yIݓOlW#  %~rj痯ѿGAZ z EW!QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QEN a(W'<5_cH hԣ&=jg tY~V,zԿp,c ϓ,jyI_4 ~SPTp=j 3Ss><9q@&nk"v<-iČZǙ[
+oR_] zVqZAUZu$ʦ1<X#~'5;t<P-p*HNj2(.	#Pb:N BPxUqhFn:.z*CsLnzq*֠#悙TTg%+%5B^y >)9g޹K^ Z2Zy֮>~?	  hcfFaoks.(Cp( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<8?)ɣ#u\N2}+|7?gH8>rs8M_HɪM T;O<V,ԣ*k| gH5ZA@IuNp<TrƢva@\\IoW*." 8;N ֹix[Rao%ݬd#0l9xlf2Ś疏/}vPNc =<qZW)-Jec`yb޺<aK;=Cz\6W7W),*ƥHEqTm~:zt='W5vjF[c.)M*IB
Hr޲J>Rծx#ʠ!h>,~#.l4h#y`2efݵ@e5GV|OA:?]I/@+q c4#/WG{huh! wW޷M5yo{/\2Gg__zifk>Ҵ2)+:ÓRT)wCY-|QӤF4Bv ϙ Ow=ׇmz։s[2JOm0=ZvYRBÈmW˜/x?SnlQ d$8?JH(5	"0 x'%Dk@ VBn?jn|1<z%Wڼ.]lH!FקB|IB8ͮy5ӳcj=I&	ijCxú-/Ό`Gc@iYut/u>OYXӅ°S'ֺ k_W- ڎڐʝ>\WiEm=G~.."hb5
+8TlE[xǶHKPY48ug%lM6.Tm3du`Ѵ<#3۞Gcf=54e@z\qPԚDrMRqޭ9rR9< 9#8+Z!$w5t 3'ٰrs\x=y? W"[פ?1XcRko N ^Ǭ|%s2(CP( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (O
 =r{xx[ \'ǽ \tى9$'Aր*ʑX l}Ec\h*R{j*|{='8 '$yO_j UPB*䭌J˙$
+OBk2G\c=j͓͓ZFۘZ؎8IW1A_W}{~bGYiXc2EDNOzsc'e119''ZSƣn AzJ;T@11L8\}	玢"b	5]d	z MDNjVG u@܌**ԜɜMndxRZ.s2J}+z{zP;utz ׬_1X8?s}b яYVKmQ\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPc
+Q?[3,w盛z?3rI-͜f9*橸h3kArrH4݌w988檞rI$fdԒgjך )8519Wn˘$4ԉ|G\of?:nG#q+K<38Ϲ'Չ9cMh6@n#iԎ9}_ޘ~SQdF{I<Tmw8[$
L58y'sP3ӊ ]zUj\~NCWXdUW(.nsިДr*ΐ{]E͗CO_s=gj ҿG `э#] Xc.猊I Ǭ#UQ\fEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPs_U RW7A#޺OMInc zp}S|瓓@eX\fe*Ż8'8VsjY	-=xd5Nf&9cYӸeIlzչ2}k=ۖ5},a'vWOZ絉
+,<W+7
+O4139H#9ip59b9b٦Ony"ց9&91Rg@=\Ss lFiI犬Ĝ3SXMW' =xA0jv֠~vdp:$u3ҁYVąt/9kQ[;~4皰#vI#A -Xe\tH?a ˼<䬫|%EW!QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE8zj D\NO |&**J!<ހ-KT/'ƀ*Ɍ63\q}+rrXd湻OA=*⦐]jy Va5vC}.b@nUɞIN{w2dG<U#u]dg[u U<ɦ<R8(<s֣#?Z~A9h^3Q62}jC$`fКH&8Do}䓊@9U%V\*^>r>f d
+3U*ĄG'Wd {|5rCgTf$V2suO{P<<VpzM~?~%~m;ֿH a5 |%Ej~QElQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE p~7 Y_
+'z`PKz5g(-땃 Zw=jI5jVHTdl;IzߕoyzO e~o׭Y@e=zdhLu)'qTٔNF?QfL#R|=bZM̸뎝k_Ut ?RkrQ@|cޘIg{)<Q{+kډzq`x5FI'&#~1PCR9j'l'=Nhp=j2F1S9wS}@,jR>
+9
+όj\s'?1洃ݳ\U	}gJ~)͜Z[Pnja~ Ǽ7?IA 䬫|%~EjQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE p6 `8 (xr:ƺ
 J?돈=3GJz{95tNs]a}k 3PdZMY<t5Fc U-Z˔]J̕9'RVS
Sn<zx
+MRzNbM2qQn9$~t,N[9&l`3T\T$iN0q&~nFq)	Q9 y8Fөx FuQS	X A*JEB  Dy<5]&bO99yP9sޥb	5Y9	~`F3T`gY z'~:qZAuYssϛ)y9Dv5HA	LW85S_ RW斬s ׯ7? om IYVظn~QEjQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE q>69L ^dc:k N/Đ94rN>Q5b\!ێs\Xk~尧7vr}h=EYv#ۆm2vE9sֳ}@2,5#p{fn$.McOv#vk%$H9$}iOl*8Y8b*Csҡld 5S9(ӞpqQ94H'qҀ#s{ҳc6#5マij@uVzԯׯ5r4d,G95]ɩzN
+HT?T_82jx@WgK'y YL
+2pI5'Jޓ@.{Nk?OAj?+3W}G~c B
К(
(((((((((((((((((((((# >858W	g^cp &=q@5M$V85Uju˶ڹ˦\V}s޹ˣ|g~fN1əU=Le<c=Upwd	 ̯!y=k}3]YIسNrsO qQ;nZ5u=)=MD}MHǨ梠.F=xOcr*&=M!50ɩB
5zăTms@T%9P#AAzbs<1j"I<"Y=jßYIjh
+7<:F$?
+!UWxr:j*MP&(9s99tZ#<P/)x{ćy6 35cW1u Qi䬫|%s(CP( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Ŷ%j79ף=4C Q(?j8Idcހ.ɟ©L{	gLedkf,A[s=kl1=.LD~`G_,Ee*h+H݇NW3VNı&vlF~ X<scjjoD޲	'$ƣb@$R@;NzeW~z󚈜94`NyTEP3#*W<@wIg Q1r8	'UP!G
BILy `:ӏ$j9#
+Wz
~5IbOj# SU)Gɓ֩lyN3O}zg˞s@Es?7tu&H[ yq_z;  60i_W~#?YVK=Q\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE ٫̣l;rrk|s :>%-cƀ-@~rg+
e@2M g\1$]>VyNMeN$%l;Uٛ=p+:FƷF%y9.cO!9'ҨNCsIa^>߾8AnfbyU5@59={؞֡$95Xi[A&0zdǃL,ryNy#QhG 3~y=jM!pb?5FzMH@f#$͞3Q7^Nz c8ꬬ{O#c&N;eWU]&15RCMni0yIթ$G946W9ֹHH59kwsߥ pȔI׉=V FWְrD>/<yvR
Њ(
B(((((((((((((((((((((#_ J^U<n5;Imkbl'@&Ҳ'ɭK*%9
+S޹%q]
aI5]{O͕'PvLI5Edլ_c"z5
+љ{!!Gn@g?QS<TM mc@h*>d2M
+ȐP@NMD"s,?_PDo&+[>|^~VF=B2>{/DUʀ0g$ނOu|~agp]XX~U\QL,m;K\+Yɬ4ڿg\V;3ϗ-0s@pR A҃-0&~Ꮚiٞ!_,%ٖQ\RF-|r&N#5]d,82xc>I%,7뎵*Wg8 T{eϧsj֗1n-c mUSOP }zR1RIcr
 !<dL0h,yT74
9YOJ$R9zlB*S٪ns樮w'UFn^9YV?5#éF!kO'
=?՜ H9𿉘gg +W 		_&?Y )+:	P+( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |{  /6 ב͐^fidI? \pIxVT͟~5rVynހ(1 jC9ֺ;6@J֪1FR}>V5fV5+`kTfU;VH~5#$E`!'q448=}&#+1DH 	 T'+8Y3@7VsWCYBn%,JlV.'{V@Үj!vq]9>]怹x37ko4qkH[#>Rxn%C[t>P HՍT ߯AUr:#<
G+KT9s=St?;_nmzN)L'+cqҡld3 d ?<jxR[OxwG_R] ɸtor=O5
+LhI$B-֛9&OZ Bq֡f䞴`}Vf+hBU+AQ3qI5@E!ީ1GҬHN*XRNs}>f$W=:V>+eW19j#43ojPR63J<{W!% '?tn~EjQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE p?+Ol^&3 3^JD-#^>vtfBN8^*ܝ2zt>3o+N+q?t湙}j1	ԊΙ"vВmFVC`E]o2s֨90"'ߊАjVQPIX'#+q$=Awyb@'?czTLs@$wRA4lGaU9 $M@ xZ@r3)[&+C&4q 8?J!9HgT8kс xNqR>偪EJǞj{2pZ#fec@l!\5]6\ pÍu~~ ;ħ/X%X/ħc zί\7?B(5
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(8 #m ?'kݾ# F C
'f;'Yq[9Y8P[ix }}띙͓[7NHby5>sZE]}MfH'ڭNvsY9$Vr8<*
c,َі>W|3:ߎ▷=f;9Vo/gmlѫJfYNE2=s>qq|k
/|ZEo5%5{yXMF19 ߉5{{=S3-uNF0$uQ4?za50ˍny=_?uT(tu(<?5 89񆔰!<).d$sQn5O~(msĐ+(=խsix$ C]|Du],mWK`q3>w) )c@9;IqEivK6
P:Lr+6t5m]t# G&7Q-=Ihj=C%aq$~y[ze'Wk]i4eqoa t=@EOXWxW|cVؖrNAnƫ_Csujal7ެ\% cI0;`NHjgBx5^YQY!ݷi9AԬc[K[)ߒ)a=Bi?J5}1¸Ԭlc2?J͕][ؐ#i  tV;d´gTvi8?0Vx]eC+)   䏼psҫߊc$gWc +u$#=jԭqֳ U95MןIrgrډ7:Je ~c~ ~J%W_x .C zʷTVMQ\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPG8?ul:O?!k !&R bɐpj̘sDMO&ۙ9c~Nz5s!,y>եs+6G>[ՉιTO5cUf=W^Ik
קyss-Eձile|}PxFs2q^,EW/dW/xŒ:c\iYjP!2ȼè?>Wڟ?%0"x."\A W3P# hُxOEtKMg9lcJl>xTѣYC}w	aB%}
&IpOA֓>:WxG7OS@]<6oaYLt91z/0FOӤZ.q"^"昹$Е'h֯wm}=J_
+I*nB"QO'xˬh<Aטm<Y՝ш9`9G8؁דTBYlZBy&$m|Ox1kD?	qgcxl=ė*?g"7ˎ5X8AU@Teʌt6.Ş~#upc3nE?`{].).l|5PqF̄V0yfwW3rp *2I=yT׃M6&𶨱<&y?PZjMV,Zmubzc5,GLy֡/'$c?fiׁf[tk&7
+wӰH|?NogV~r8WcԞjrryJGuRBncU H!PFQGEaNyۡYXdsUsSLyNsГ@˞D횞gy,HSAV)\rd\7'jocp:p' e =~CkRae=s_Ox e ڲ
К(
B(((((((((((((((((((((;tLZA 'o^x~	g#E2m ٫YOw<}F?ZD_<g&gpwzUN4妆mܩv +k`2	zջ 
srqbIld'<y%%T @'5O~uK@s$2I*#3yM Js9&>	uw%$jԚ<>	sP5@"y.}Xَ	ATǮj#1a˂*# :$]ݎ>`MP3	I5LprEBf@UBOQ0݃G\;gBFy9ğ F}haߓUdn<4dÌ3621U'EIhQLkԤsZ $7c_OFĭ! HrH
~ ;|?c20}XBIT^w?C袊7
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(9hx"  m_?_?jQP
sA<e>s5/\c1GZ{>a,[mraڪ,+*iI?G4x$&$jё^sו5z틜kE##4q1$VcJ3:<exj@G恢/0`iMnNAh܉R:PFA~)'<^ٹD&|d`uO?J֬sڿOkK!4sPOCV
j&$VQg S=j&?O^5MnչӎO>iϭ[{f96z@PFӟΠ2$ֲQW TiU3y*Y19h>qP45uvU@^NM $֓ڹUXcy#&s޳~pH9JC7kG\ݸ?dB@bz(*!so~!0jɬ29H lO_?~oƝ7K )_if+odmǵJ6V6VpmikQ Ɗ0` q%]KTQErQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@`zG4{^QҮlAG kz ǿ<]她0GA{4쳢E=7J!=F ڼW_˨xxi:˜+ZLX 
hw3p|V3`R*Gk c[Gbr@݅&7셮m}E \Fxi99)zNNI pGzGIU_M?|i#>R̃Fl8V̇˚Y?d Yc
7$)j_G1Xi?)*pg#ME zSʿB|N+۴U[V|GvO5]Ñxtu4PR+Y2& zT'[G+ҋq*ң׭wm.y|aU?i >O( K Qu9Y6QnOλ32#|(?u ~̿.}܏EpgtPmBqc]?i' 7Q 1'b
+?2 ]ÕT4 ?{~rcֻs0~'b	\ Oe ڋK tԼÕ#h𨎍 Ȯkc$ut)j{{"0gB49e޽#?l⯃^ߴc>6: i/m˟W}!HOֽh  g)~M%|% c8.m>?D44f,k?h~Gm ٩? hYc 9(r'O\Vl4 YA׽5DoA͏ͦ~ۮZNlz7{~F.ϔ5Ӵ's#Ty|;+O6j1I8` /2iz3_~ n>&~8ۨFw|A~E_ö3m¾t
zU#Lд[dYT@GVrP<{x7?'Vj
޳xFfEQ¨ {W3mjQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE 9( ފ( (ϯF>- QE QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/samsung/galaxy_tab_3.jpg 2.3.1.src/images/samsung/galaxy_tab_3.jpg
--- 2.2rc2a.cp.src/images/samsung/galaxy_tab_3.jpg	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/samsung/galaxy_tab_3.jpg	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,272 @@
+ JFIF  H H   Exif  MM *           J       R(       1       Zi       n       H      H   Acorn version 2.5.1                   C 			
+	
+ C "            	
+    } !1AQa"q2#BR$3br	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
+   w !1AQaq"2B	#3Rbr
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,R)dLhSwѿ@yV5,}I+(cHx0D:+Ħ?g{k>=ՂOX,}s_B>'shMtU䍤73ʄy82e$][o@Z_>RA<AAےH3('M||_N
e IA ~ y|%8Y'J6Zf:[OBp@ر5< }Gi|=}ڨe btV&C/i~ϣT
+ SmO@ h?Pp F/yf_(x;:ɔz4 W&e߶K %_Kmk (sq3
+xE	mӯxv?
M:TGg>	f[?? -/͏L{?5~644xMĬltxPNO|gmeW7Bwf+ޝZ~wh8h?9Kf?m߁ GӯZxO?H62RT`>=Ӯ噠FpibTeйzɧWp B!  \4 n_,0 FO";Ph8H1 
+砰Zl4i)e,2,0=
+=LXjs& |~:  21m7 kд_
+P4MW@d仸*P'x?0bFy@@X&D?mޟ }_wh;)/|ggN]ҮCu$+ѫoQT
+  ˙n83ௌO_<oNnl*n-r=ʞ en_B+uSNu+hԦ5?żXʯ}YjQE 
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+3E5X|OhZ|Yh̈́u}j)ome
+H*(I W w@8y g_Pb״=3DSۉYOPH-D~!<s
+k?u<uuILs3g&=Vɸ!.TQ{
+ .7 d95( V8w Kf_
+/cW)֮5Wξ6nv1֮*V<߷IITcv>g5_@
+cde)gXOyqʺ^&{%Ӿ
w+k7M:Rv"r2gq'

tj|񿈟T )͕ԧ||7a eg5?S=HKۧՠӴ}&~m1ݽΧek
+xkME8(r'sP<6͇5 >tL4𮳯-/Q:X#%@ I>gO} nھ=D>(  Ƹ+]IVQ.8e)8G@OO◌zTZ/eTKRFRD{1s|z̮QhvfG:'K|Ai:sD_PHp+ϗ'fz!gk'~.?]s]Vtvmq	8P废Ơ9*lta%s_ֿ@b*'ǯ[źt`<7[;ıo:]B+7$cу
+c_׷6	$xHЂ	hO9"f/_SCQ
J"W
+nBA++ֲ9s/A1[}BOU3cy)?|:oKn}gPښXK䓒IXIY5'r9!NsO :W7٥GsԿs7r_I/_=vfbdSoG8@k/:_85/yGxJG}f!}=ǒwdZ(C0.+j1Ƴ57ay۽[,2@b:|,>xNԴ[Z=AG{_) -cyX^[>7Bd
+X9\;r3+Of~xKX=ޱoYQՌtX$;F@ J4[v'~7nc|_&(+HoI ?j?~G W4=CpgZᤖL*f}p=q\F0!
zC	2|K?M_JѦ鴳$bV2)ʑ=_1SG<-_x 	KV[-$bXpgoT8c,KZP**J]ω
+4Vbd/S!N9k3?+uk_|Xs)fFUm󙃹,q!@<.|sGï˭|4}WΝa'6fYTTHF)ajaʅu(bi)F^2>";[	}WE~?f'V-$0ҵ%@c>d3`~E	ss-Χ~ Seīc
 ~YaS;⍾+>PT"%/mwK'>5J袊C
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+W|/5x4gRA^[K:D&>mI!|UAx_'Pt}َ{@nu
*FDPYJ'b{g%2dѾ&iiM5w2s3_
")©;cubŏ3Ex^(T3ʅQֽ+>tR?IS  xEҼW[ o]ߌk?\/WIb  h]O9 
﹫EeK_3dQݵ;Uh.6Mbut +^Z) OǟU^"yƏ<̶᳴q +M_E/$,~e
+q$(<> ~6rw S VD7a511vG[D'xZ Q29k;Ga~?cb:oct75j΅7:|%95KQ e$xs?gE f^OJR:y^6x{>e Zoe"0һg$g/SGDh#mikjҩ%L9ڹn+-[<M|,f!xm8[!,.TM2,}q^YQWhZw]34֣ɅֶR7k?4% տh_iǣF(}6DP\OO'~Ϟ5yOĚ>[g5ƌ!I3ߌ2ƖIKO0[Pzm +7Ɲ[_)/|Oi
+IwJ
c=+dphsQO{69+e	:Dj^?_ʾv$rs_p~kB9<ȔH^i5b c|Rt).\g# -_ ^yWm5 x|O_ÿ
Ȃ9kS0 J$y6]ѿ$<BT(®e];yٴ;qvzo/WHjfGI8lҿ ˨ +eU}a_+ov·}q,[޽ĩv3(# FFjιP+5>WIjz΍߳׷#L]orG'VF]t[yi9mQy^
y-q7jy1/ޑGv8< |cᯇ#sKiipR	2@  I$ $+>Rj^6smh[CP'Ǜnwp>eZ c~<9p̈́)QN0yptۥMLpӏ5Fs{uŐ'߀Ǆ|A5z\C}j䄞fT%Hʓ\Nn|7qrN\czlv\$3_U~ Gixw^74YPtm+LEӭ|d%ݞY٘    >&ᗂ>k1u?Դ-BgnnȘ]BHve|!PjjoYzhg_4|u%ngi:.~{[Y%k?=lK2Ǵe݉ s9 	|[ө$or5[6dQPT0s PL>=/Ś3x{pڕiÛy7l1#p+ݡxNw͇Z* =48fl1u[wM_Zqck2ۊ#<yYh[$c~4=^z+pWB
+ #VJogk:Mږ18y['rI\'510h7^y.2928<AA8-K~ùMA7 * K U էWK{F>!# %n+Zc袊 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 	5 N nωz$}7 4ASRծZCkk0{R2FxOwR Cػx.ZLi<_&p |jW68̩E}+x G߷[7\Z6$BpxNہ/GZ3xCᏄa>6񞝥$M/ƿڃ?g'(eԺt麅A<Hdjn|oW**nRό\ZJ]|ϡ,<_
+^"oUi}d4ma%G9An@5Ig!|3ѧu>6ʪ)2!b.IPzmO>3?e3Ƒ,itmeVX![<pT\y/
+OWu:8$NX|7 [YYJQeJ-Q͜fk|/MYۇ<|q}^?L" iDDg<pv;_NK7~gƪg`UB'r5?7m~5ӨK22́^DjOGONqzc~$ö"QF=rNsmګW:|Sپei
+ôaB2`!szW |? ?j|Qz4%dQP͝6HksuW'vh.pp$*;YK
Ae'GD+׶+mHMX-ͧ]m<
+? ixǋt+Ng}.-XtK
+\ H}|eαl^Wr&pO5=7B-pBc![	,EXoG_<0Xl(9IɷJE.3W*\I{~gXd HcK^a7'<k׏|eW?	SxIm%n|ˉnFDjXBq_pjgόZ޲Ӎ̈́)˸,x=rG8~о"S[EZi.2@Cr_s|NMl/*^Nv>/~'
+<Դ iV"ɬc!W|(؟PQc޿mV$TQW N,,&IA?9|>1I"B 1	? +~ F|q ؝5 qS4_?}8<ٜyy f
d)8Z؆1j hxZO9/~-xI	O밈M̩lY8WےWǋ/Ea:wu4Y\ڟ!!ףH؞+r˚J+j<~[ۛwR>Z?S+M5}bU%Ŵk 3kom}N	Ḷnx^/!D~siqi-sMXSL֭n#%7 9mK9mӳ;ܷ4Q;msCYsq]՟-.mk`<l~|WV_h<[,v+eb4P^c #Almc,ʈh-ê!U/'oUs˟e}}%l..aKDUAǵg&J= |8~Ԟ,֍o96c<EA~}kg	]OBYmcWPzkxgOmef1[v<A4ȍf:*c}G-~ʗ?t]IY_is)@R䯩ag+|=_3K xU|Eix/ ՞;;:Ơ0{xS,6SЄke}u>6FԒivSitadN@~ï}Px+ͥ)v9m`z%4kf(,tp#}ts?:xVYrUGr\< >y|CU:QFQ~z-C又^Go K_{1'}=Kӗ6y&>ԽwMӸlú)??AE*#  _ Xρ -l! J+u+[3dwQ)a:>|>((((((((((((((((((((((( kߊ3|:K4I~T{~5/E tۧ,V%oI1>A%+{:V&iZRrH=jέ%ǝ#>'E.]Qx}_㯄[6+dVQ>|+DKp	<vk a <mouoխ-ީw*BFwi 3ۘɮVŶ|<'sɵ<i]
٤.P.v
+CO^^
n?MnbxdI>A9	5Tq4Q3UUjM]8H NH./_'OHOm'KI~mUG2i[MzG~xN;ۯB Ɇ1/8 m=QBԁ־$nd7~Ɖq%-uJeC]@ Gnђ/0a_4^߉.(SujuViO&ĎFۢZa'# \ZEHm;n$9 <~pppyϽ=^|-yk6O5]qِ}z<g?_oἲ:Gі55P,@XTg!A+
+31cijegxQ6JQWݤmm;X6?>Y
TV~[([`h?Hz(U^ľPL4ykU@8'#y +@f+ٶ]9z{[+9Y`:$f1<
+Z 
+qQҥ?>:P MzGۨ+eQo,P?%o9
+jI7-R٭
+,
+5|<d
+).9~ SIczc.C>!D$ 0~XyJ5/xmu>b%kIoZiv7쭠@]ϖG$@kn mߌ_ Git?R'87o Aq⿲+
+j|jh3PO/#veٚD$P@%_Hd*cMO9COCfqfE\
wnemFI G#zkeR"b2/?^&ܗwޟ -)'M̳$h:*pR{5iͭ[E̖2G	 ξRc2W\ioD Ҭu @i Fo# bH_/ߎFqj7ο +7K<- }ǆ͠i~Gĵ-o	g#Ě.my f
:"K1\ƻwG4Ʃ/]ou#q%8f~\1ڬ	 q<1iDP\Y$DR)Rwq@k?!'->'|V'PUax&1	I;ҿto
+<pԥ~faƜ+Sȴ¿xoQk:}j1ٽݤ۵,ilN(<t8 [':^ܱX$pۥǃ%dTAĀ>+C|X?
+Aq5զ6Ae,J+ؓϧCBT#M
ŵ:K+$ d+sG>'JnN36-*ҍnyAĿY_wwWZƢDN#0|a_eދo¾8J cܬgQ%滍^3{gumk=:}YY
+x33ly&GAe'REƗI%
Ź#U$O&6
Iapigk?Mϟ[,R^ڤx4KwşDXtˣhҀ̭pі*J؜H5o"fuM)mxPjpY(BqG[^f)];K]NNgzs\lxL Nnem?.ơBd*\kΆM9c{޾R4~)oi՟Yum j!Ӵ?5m*BeZr)c ;7ō[NqZk,WV(w:}#~' _|B']GE AtLX`~44>/xώ'kRjj[c=K&5
+NtJ2Mdig>^-{=Yd7í|sU-GE&O<]w\li7P./ A=giK
KǋM[fGXV1!H>`da_?we⋍#Z2ɢ骅`?|Wdψqupc%
T]j.tRQ4N|?%>~kWJhrAw'ĜWi~<Mk)1Ӡj(Gzwj-gq>RM~ ! or ^~	tQ
+?<?οOQE QE QE QE QE QE QE QE QE㩠MQz Z)7Γz y: uh ( ( ( ( ( ( ( ( ( ( c)<
+ i|XiUҾ|3b;Ck1؏iߊ.VPK
_IS " eW_k0/J4>^ϦhG$7,?5|=/Y_Hv_-i>ە?:ڝ6F5j$oDw^;>#A	le&,M}-oEr$Z~⩸\f%5w:5Ovww']  7K]/uqn O⿩Z|
iB1^]~ TMQ)Żo}hbeDpn<_ //R̞֝!#K.͌gS>ѵ}A'i+">e2;<t+5zPzKɶ-mSm(<Z	0*X{s>Eګ> tOx{N6\:ơ}#
ޙPP pIׂ |M~}^o%[ͧ4r&H̉:v5simB!pq<q8;Qd	"#־?O/,b׏YF"g9'c>1K(PiIPnM+\ֲc~ aRStW^˚QRNIu/3nͥ~xL߉<=xɾ4]Z,@n{W|:Kg~"hHX#a)$}s]sX_;LNM$ZRhc"d;ٹ |(k7*I,2$FH%x<bO8
*nUJJ*GFiw]6g?MFO,/+ c"Hii؄A𗌃C>rZDiCo$,I;>'mI :֚"ZFP#&5do5T瓱Ϣ.?l-a/[[n]VR<E|oKc`č~qn{9֨vM=.5+T|vԏ?7Ԍw~7j>D"{3Nt m?Kُ   /9)?b˳mT(kBuNφFAw߅Ζ]B~UU:'<VnW9(k'eo>tB0I{)m`;?-_?7RWO +s ~zk%x\/YmHyZ2Oi/(Ɵi"UK(G@z$O[[jl|̜~ O@~.|9rۯM~CCslܩ ɗ5sMy?/.O cO؏w%kxIҴ W'h̋Q<3Nx;,/+@].^]C'mN<ȟH;7<?g; ZjQG'";Si 4vd@ch^	+iψ>#-<OjZ\8XُH5!~"cyt$nv}nqfpL5<z^;Z.Sm\j\"YUP% $
+ᧃ|K/xYW.mjZmnMƫ)H'EX5;>	~sx^yLloL]COF cھ)=OƯohƕV_LzGw{jI4 WʛHVgs_WG(9ۏ5zz/Ù~cW&vviwuዽ*Mmhg8>A  <Y7NuO
o)&cd hG|d3^t+>MM,l\Egg|>Hi3_ L >xC&ş
,u
[N	Q]-\Ż$+@\Ώ9څiƛW:\ֺm3+{m׈ f/O@ռEucg	Q\FS#xŶ$~prLY|s5٧炾 >#B-7(o:"LrcnW	8M#o u⸼,71ju!6M9S_A0v*髽o>k=VzZEc$c(Go^+MsAuXAPTֿ=iPwh:4+7 a+4h~3vY>'.,4}$l[;au¼:c9p31R8t5I5&&7de|,;U#%)=#JB<|Q=@C6ݮ 蠶#_`E
K\+B/|)wi(9BI^	~>5|][B|/bP]nؕgi8 h )c?~zωh-.#Qfcb0;WǜG9
R9J|?vG||(].?_%e ^+c]3lJ(tˆs__S>(BuY&
ƒnocֿ؆a|&yPgW_t Ti[ ~>5m?E:^#<b;	"ay,*<fAO$dWI?W/g^{^+?mkQ޵;+g͓l|3,s4- ,.dudψoxY?ß|\<iJ`Ԭ60Ll?iMoPyt}_dWAi	&xKV,,
+a19,bI$M6\E { n ۈEG{k~-
+01DgsƸno)6 LH3 ?=!x5ȮR:|ܠ;*xc $mf_f|BTXyvxAۏ
+&z zzN@?y.q9rW;מ^,B[
RW:>|  cO?ٿU?eO)~6-/'|~S
+{ -W!}jltOW
+ix}5
xe2ግG\tR,`~Ϳt!\ LWj;߷nc\ϏT $c"z\V&9~x皵Iuv{ !\շ&_ fj
+ PۗDl 
|xoްj.LOWCgP(߬6zaE	 g@okG,Vcך?} ֣١s3[(M ?B}Sҟk E7^?gQ~=k&F<5Mw K  ~G \#u L?AM埅_+{ 9z/|KՌfwSo(ͻ ?ی~ O?oGwE-~z^;z/7~BE.9િu|ߎڭ9QBѷѰ7KaIh>_,v	k6}Ҩ9(*9[9O["[3ZIup+;Jԙ߳W/kG῍agJUdQ{+Ǚmq	#{A>yo?n+b7w ~)M[ȳOoW<+o,{ He9 8ٚqhQ@Q@Q@Q@Q@Q@Q@Q@x>ߌo;
xkRs#l"}Y¨". >&f|&m_oI}OoZH	oz-ρ?	#iZɨ%os4f]?[9,z[o-a[mA?yGW{_5dg1]sr aZO9p8Қo? gp3#K^ SZڤ)Z	F(9' .3hz:g{ ifaO-c@7bp=kU Add-6T6+O$F,["DECgW^r hԎAfaҿЯse8Ib;^d_9p1g"\&to It+[φmIG52G H{T_>
i߳4_gx5
WM&♟{NKpinrEӕVpN+T5m߉$4^cs}wxd>]0DYݛ
w$o+]ɭj [j&HM˿MႬPm؀K濃x.!x\#c 	r
+?G'KII+hD 
+[Z.<#o36p6>Aa]$úk3<I-kowE6*DgeyP'(1~_I[cvLѤ̴r~LFr1y>+Ѽq׌cx*9)+ݫҙYi@\w=M~!3|+UJ%ѻ&~'3Nl6+0(M9SRR݊&?r ǉ W4
:=Tj&k<M$OΑXP_o5 i)!}kmDIk仅v$yJ|+
+#~|C)njP-Ov)il1Uq@O|otPu?~E1u)3 -,VnC/	帹{suwok A୿M
kO|!.*P_o
"35'M7|1%|R
xN5kD,N?98Wo15=`g,=Ok	7NUپe2Egl>_ʴ:u
+^Y:vm_?jkpGΡM%9%wYw? ϊ? ?|3̯ iZ>59X<=f{W&hu-{GͺH].^y?m&7^.-Ǻ\^Jя`J= 	O	w`_u8ZGoRrrg fA 	g1xy-6t~l VZ ݘ?1x0B?/|h>{rm_Vcm/ּ
+}vm_Yx7 FQF+coU?͓ʿ-kSiI~y$?j~2ڽ~; ~>;lO~gмAi<`{G-sN'1pJAk'E_xkǿ>,ڤY?ˋytMgy dSv.YzW-t68FTU'P+xo~w*_{GCZ^~>qj ElK+xye/Yc$dgvVrG3TAw6Х+@H$g_
Br6G![xKN%I>'WO3
+ʥ[U%>K&<>h)Z$|(ּE__i:<j
.7KMQ-9Vr~Z&{_i]\[klK;KjKI#HO酷T(X 01?P<;_kZt6{EHf#MkN.xJq5qʵwvVɕXxVU9O/j+L~Ś}2 x20vwlbZ]׏w:GuՒ]HlmBPsdd`7 _b՘%*A ,Jm*~l}Z>2Լ5TҗĤ)YQl4\xM|4Yn\ftt5e+5ݯSک&5Kku~qCY^\wE_f$oݙC* ag[kKBϊ4Oph f:ei`t/m:4ꎁTFHĜmaڿAnMFToo/bElmu,$ߙF8?4MGKdٸ=$=\ކ+GJ^RWmuOW:lzT>ֽ7Yxzo
[VW$..3[@0X26P <cxxJX,Qp<``<myʂs(+D8oQ0kL|> iF N?)̱xb%Qi/':РInӿf^:OZ=_&ico+ W;a5fS<8{E.@?WY17ԚOGn>
U&Ҳv_qy  \e?q_Z;nX=敤x;ݭno]G2J	+[
+. V!M?-ƈϰ*GY
+~ѿq߈)w,."c,_('c|G| ۿR	/^&~g<}?uapV8XN  Jى>6Ok?&L'<m[[yџo-c^,鿳  朷|	(-rqmeg?ck(kmG*ץMK9
+OȵCtI=\J$X|8x' O	q" vɯ|38e$ֽ/)\pi'# ?5zlP "S w4oݾ$#XffVy.;az2k1ǯxd3{zn?wx	1U͂lV*Q~}=?ozmb-e^ Ee(c
y8=xN񒿱/
+~?<kjx:*>i/.Iˁ]o[ r+_V7-79|gqE?mW
+Hn}6l~rWQ[{nG\C_ogoűou']09=8bG_ W:uڅ,m< ^Yex:JyfgNQٿsdচE߱1歚 }WT{Aepu Y=%fЮ/-牙dGBAWor<%c'{Wb5XjM_UXԝ߳wW} WL m eMKrAZv3cP2o>	Ҩ**9rTŊϾ)n"4\ǆ?>
|lgĚK?Ao?_oMic򎷾@>(|EK.
-q+i$ֽ?tC  'YaMf\&w1SXv>+Wy)gWu};_5kG>+Oؓ_o< a-z"Fer>hek b;F%|&l334MN~kXO8+CH.QXQ@Q@Q@Q@Q@Q@Q@Q@~R<v5ګyqu]lw*iF{5~I?lIps>h6cuqqZҒHRhy%IU6@|=#i:&:''M2}}.~塯osgm>N̹=رWh72GyxP̹[13G
+0kcl⦓n1rrI.fs(1xL>UFW)(jܹS{AVדí. SӪnس؜*Xk//o[ѧwQkQ` 9ӕC~"Vfydڥr7m6 O~x'Z3Ɨ,wX_pᘩT3\G|ڶ|A{kOS'ŜIm8S8Ҥ\v]Op
֯M4|{ #|_	>4~:ZuΓugx5Q]%:+Eo7>3֝V:mP4o{K*:L  :=} mT^/՞tl|Ŷk&o{Źan~k?Q~9U񊖺ޏE.HtgPӴky;y]YUG=Z[˻+ۥ77W^ӵ?m$|ؿ
PzͿ<3h{9qG̚,%UW%ZgQ8CN0Vﭶd\ܕg׶|:0^_\.qf|/ͪ G֢WsZH2{㎕^<O=@4$h,=G<W/k
Z+Wfgǂxl}ԚKmzxtm%P.(Gr{~Te ؟
+W;/<5ºLq:0Ǵ {W?
͘GvV=u/xy|m
+4.&;t _n*:NrZ?}eq'XYB% ş&m6yh 3_q~lT`_!bs Ѕ<EY# U>(x f?S)oG^=׉WpHcXSW N4N~?+` w9?
+ bS[} }BH3\/Wۣm =m! /d#_Ts?|zW2y6o_8DPL0}m}ِHDFK pH5JQ #81x)4-xQ3D:#=N}R^uase>3as[]GKɺH9~|A;==UWBF0Fq_<;VF e}q|&[imyW<02eldk>inG2[F"01&sּbݴvzvY#G+{gS?4In	^vʜzWc8xzOZ em~w}zO%|oaqƋ
sl!/<@#'=+Cw
+|RrIk,OQ 㞕_|A5f㋦x+;	$AR%s a޷.<}XhvUy~XfaF]
+PT'5Cl6ps78BXxwV7w>xJR@= $Nx㷅kY-խ$iJHT6nn^/hz"I|~JYYM;H2^OcRŠi 	u(,IoEQb*T}1Q++?[Wu[ZC*TaSS×-Y\բ+#x {{B(-Qrpkм} oՕ-B,b	-RT
+)Pn5-WĞ(<GnqydKh$^j G=wf7L𾽫ǉ*¶Q2<\?S+a*8T?.c|daVOBV}r;MLv%W=D2<ۖQ
ʹJҙV=8V6=7M[izi۱8ð7og
+C;Ş*rGw뵉K}g/U+e4)䚲Vme~܊<EV[x?ՠ0H?6}X)?m'Þ(֡v:6"pE`?_UsxJ?ȿ6~˧G?w\ ey'  nk!m"	kZGڊN
| ]f O7 Aq_ ]u`miWD%aQۂH JN=uvI tnú?Z?:|E[ 㶾ԠI#@UgPxp _&s^ b\/4' fʻ+"!x};NoTV[q]擧hV_c¹4ؚ0˴r<y' 
hVCw}I
0H⾿VGM Ï #~Ο .NY",q>oIXFHǯ5
+ 	ZgvIj1?X=eS=jbi`sɮn8,F2M;=Gҟ	-.5/Ȝ q;򯿴igNQoʾD[cRr*vIؤ4/K|aM~ARb$  Sp\} jZզVݲ{ktI6ΤE+uּ}cN\";s%u+(٭>p8OVo^u*6#7|׷iܸ۞A=kŤۤi١s$,W^յģPYIJ'#Oj&a>Wk*E
+
z{0-F>ks?~_㮋_]ŧx!Џwר_w?^sQխn%H `zx+W,ϑ y
+# jZocMP2E}өZ{yyz
O4>EZkuw? 6\)n	_|9_
ŕX>PI_<2#yø^q(KYe9^aiYiOm)Ҽ[W\c5iQ.YY9wӱ>~j3kO~G<=98++q1}ڤZnqۋ7~j-S-o
&T 
YxZIТA=Ǔ4QK<a:B.=[
+v8kPOy`?mN=9:Z~~s_Cq IYgd*ةe6r3vbׇ66 ߵ~?#__
x:Y78T0l<]ݫ&s )iWAEVQ@Q@Q@Q@Q@Q@Q@Q@i_|
/khzw޶qx^g?/NWٜ]77zėg3 QXω2|>2ivWRZk~/}?/$y
%~$<6,(p証( Ӈ]L3'_h9*c[灪jG _xCRF/ H~s^kP*"êk s>-~L
+o|ky[ԍW:."!
+Ř1}) 6w?e]OQ""EO 	I}zRBM=.xuu ඿c.JGeK($JAq,7EEm;OԼ??tc-ݵz>'EF@q0bAWw?J(>므n:10/ * Qz1&QM.66'
V L7o/>u
am念Xl\6.NF2sSizWm5{ c?jzf
0..=̹ª02x~z\7Vd8s˱J?س0Eo{xHෞKiG+*GsjHABK	t
W|_n7fmBY7$mU||;jWv#]7#2Cb39lg}~ e-ZyEj
.+!`@BٗӇs3$9Ƌ,:##'gI $h]7A'5<=↱TA8wVs{*4cy>ӚDхD?ؚ	0ɮb=mn;1 cvyxݸrRZ(ʢO\}*eF`0x{~ oxK	!%H|!Ojg^\mg+τ|^5WZ~.?rF] Q9W  }2HCgN4;כ\05g$۱3!mǀk>]kOVמ ֬t}FA؅Ǒ
+ 4{]O{yr:s<9~GDΉv?H4]'B@6VY clqE;u)c.nA=O54 onMfӂ<&=_TQܩl~bj;tk֡qQ8`	bBJj`g?w|E ZâR-i8!u=+x;F>4>GQ$;@~j8)8Og
~*P[dceV ǠIF_jw*z`W?j_kR4aTQw?a߲Kw|?6M{7dNi9}}/gx;١"m|7` Ɍ~?bt$̲ko4)hHڿʭ[~ xvcMYkfY|:1lmƽpP`}+mNے۞GJ$tǱ0wv7]WօO$.F?x>&:Ƽ_돎uSo%GmpDAd!~?5ⶡ~kv!c۳ x̉e8$7>»3
+G\/%8^D8kFǨ/ֶîBcv3ӥԗS^s|ZV$^".p;g6_c	<KK.}5ZJ5ض܌3KIk}1ҟ4'k?h]S/CaᶛZxr=s"vP,ğcNm
+"!cċo)Zڴ 9Oy>.Xqֹh}q֔RB`e~L??g4]w>X{;t
+U1܃޿͂wۓ ښ/'7߇zŝ'32/P+r͟S_!<	wm_vm?J,ibpvIkc3
9 ~o J /Λ _/4[_
ۯ& H.+&@lo۠41 	9Haߞq 1jnd iPg|-hω|3ZN%X<+_ 'R7G^=8bR \tYr3^aR6}zJ\@$We\ɤ|.a^ԭTrb@zoH^i</xr_y|!m KKHb`.5s*o'~-l4+|>&1n3\n;W>)|y h~Ϟ*_9{qA׆tK+ئ-;IdKx hEmAk:_iek9-u/Cllt<WV̅$E<:b
+x|w֋w C:tZrOoC? Mi#x[!m|W9D^+[Ɍ.yV>oc՗!Xr[= B m
+~:Egxo!\Ny  C_! o :/NMnU4IY̊q"c8<W8޽;E`2fe]Cgm
+wLzW5Uh-6XFz_txEKx5>OӠl?n,c7?u@9<9^qW^*s+
 ;bI֡Mw;	Q\QNKrGu~緭~u/ |'Ӿ&Z|
+|)?XcZ7qxwQi-J a~	4_v˫9|VV
{yf{s*Wv3e|\]z;vgCZk۵BC2˚_lIˣ
+3$	ioj:=ż	JJNpw7H){yS3jgE,3؍1R	G8
+2HIUݣ{9TrRëm+z|	V|>uȭܹx^6G~CbF_xk_i4kf1	l8hnS_?Qɯ)קS|J?2`+q5*ri?0eH@?|li>\3N^G
_̚geI3mRrv~C
+ ..0Uk,:5	 +3:>伓?BqJRIG\jJAn_ߙ<yNuyTt
os?Fv>Wh_
ɨD5@YPW$
N$
+_'Uz g襯6u(	+4Ay7*č7"?g$ gg-U~S::((((((((hڬ}h |U{HotXBZ@V$#/jnS37f(GrҿBo(ak+Z.[BO&. H/_g/|]XgmLEi)n~da']4/^tsaj*RUat@vB 3]?ા<X~:˩	W
+d&pN|
+䏌~-~!|P o/<]x/\f4a`P|ą0ߴaOz?i?WZYiyn>X_ĀNE8jqm5-{'ks>]Z~w|=5\UUǙ8I>I{ > 5~Z~3(;.|G&+*p\W?ࣟ3nYյm"fG
3\vh#Ծ͸A<r-̘a~?G|GJO/oa0]*vWb 3ex6v}x],:yv5-
&+zh1e5;ɾ맛c*JTԥ9YGK?n
+X c#o62ckt Sz!Kd63[j<#|\Y]Gtm-~H¤Q;3_	λ
/A|>(=CPo🄭nT
\_O|S
+a⯄>9 d/|MolQI;%M0E1RN+(slS\l+薈?+ˡEΤmvWOT> ߲NHVeE=-0(yjy 0ƺo  [ b $<{TE/jBHD|F(1
+I~lit?/ĺ7m#t!hR;+_*J^=*\>|ӵ*em۫vʹooF@9̮Woa*1Nsn[+[Mnݯ$p?O)P̲JYrO}i$3 /"~Ͽ7/'#'K)'clA8k ;dԯ]i;\-VHi!\< (O
+;TCWixzOO4% GtB;0?|4ux??|N6/x+]<!toBBl3nTvC=?#|§(O%G^(ʢyslidw{O?oؿ╿g[Fh-}jmP`02+o~1JԾ1|ZsY5_xU%ñf?
+f/hOExsF>xCXy[h\|y<`D>`F>`*ϊXtd՟2cϻI&={ǈ~-x^ReLM n?)'4ܸ{\̄g!1F!?Eqmrʿ
ey~6$KO-L8$6?s6?wW ۹6 S߈#v|+qɯu)q ї?xrÆO5ƝT'ܾW$k-WQ_`z|p,]G~?'+]R-ZQjn:FL-NX.HA=ka Es?3-ƛז^⿢sDcN-X>?ZJ0=C70}+b2#/$c^YN@YiɌ"@EvvUb]R'|M|  O oFIڡEtz()Y漉<{[JْJ\ʅ 
rճN~rkX=sx"m[!#~g k~"@X-Iഠf&h"6PWAeqHL׏%}+˕Z71ۣ-K
+2GOG=kXҠMr$a}klHTPaǵi/h<g?JXv){ΕL\x$u6_(?,&0W=#
=pf\Mr2vNoʽ%$-cSNo[ oOVKM֜vrܶ;l
+_)k֚I݌	$#&nN:v-n|
.Q˥G_ /Wn+Ac]o7% Z?f ~ B|Sp	
>r{th=OW~^*
+f+[}oڽh=+sso=FL O_ZŪ~+Q&IHEB-Κ?c(u
6$"4VSr۔) K]%v#@Wp>z>{*P<G̎(A'5RoHUPq1[1a(';FN}Oz=k\-.U嘪mf付YrcV¾?nlȯ/	W?
+IeIOaR6gXՇk'қ_m"z ?_EF`+;[OYA 69 
yU%{;RH߇?xş<lfB2 VyW\#5}T&? tc@~˾7ͷqxOOpwk"~N>aԁ~	M[NKYNd޼o?g~_tڶNf
YĽ$='݁9@/)ncO=_?qg"}?g-GwNp^ipFcI W ^ όfWte׼P	7[ Dg	}ȯ /|j{?
Z4KMTK-`$hmʫFb"_x]mI@I!wcrN48,/Pg {M[*Ӿ6z/Wꖭ%چh]A!8#<d?Do72k <[)'P:Uq2YȦTW~:WCezS^[[emmhGw`|e+'_3MgkŬjĥ@6¥	y&K/ѩʭx*Wm'ui/- @Oh+۹ྐྵ|x;P l
+  kwş
+u+_?Ʌ帶;A(#9! 9~ KG?
+$5_
V8gP뱛_?F|G~&ƀO-kI-$:	u0;֒mCX<~[&ZQw]S?bh.|)77|Qg^KDePAn@,zו R~%W¿P,A)+;D@Cs)a1ⶩm}3]Y[Zʂh']OpEx ߽IK=U/Sξ.9TnV|n@ݓ_6x-.#$^ ɁirBkuɜ3se)ŵ{L38-$r?kGIew#2"FCϨڔ}IUx/4]q2Rgs'`k#Y ~V99e(|W,hIUqBɏs_~j~܇hC_-,>7ƙCƟm<W>5q_ˋ[l9_?>؏mW?iQ{}Q_%	`t }ZڶΙEQE QE QE QE QE QE QE U
SPҴOQ'W8XE,O  k[kV@p}oA?ݦ$[	d{ZNY|A k' ?j:w+|m%#7Iҭ_GjV
u}x:KOx[F+c+ t>ܡ{G993y ?uA韱G+YM\V_=:H;dV/[e~+ f=wbVyvsd+\l E<W}i>TQDװ\7 9qxRhX !ɐQzjjRMY|Z_pI>LeevۣvgX~ɾ[O~5·uz-<Cw$o@0Wo2*18+4%O
+&M#|ሮ
*
R
;ZO,Y)YI;76?^Q,tcLb7D^Hs@\ڽv? VƝ',HUAДjeW:.&Tbk?c ?4:/_2|]x	$P)@F_"~ݟM n?~
 m 75晦?ⳲG;Y$763w)>e,?J~$\?^AǓr*Ԟ$fiIM%vޯm=L 1#,*w'ʬ|L l|c|_xWo?WuIm2B4h[!#7|U%s|Zue[yne
/&I
+q$'|R!%R	z?Z5@{$$;Az؊/ٸ-&O3FiԌuVߙkW_$g|qo]~!h>3֯|Ui 	IhJ"XB2?_+?O~ⶹ<-ڿ:)49()f$9mTkԣGZπ4F't9A\ίmS|-iPŀ;eX2\
F-_{w{Yq>ax^"iE>EEI(蕏
+O[/+X'n4]KՠdO?N275"rɞ2}ɯ꿶'9X/Y'j7G`??~kN}OJ,Ey֓>.wkO}_[.GeG5mZ%er:(yX~8J T'u
T鑉ssr
̛ ˏpOw_<3t1sy;鈢sٯӮ`,MZR5~ V4IwsΫ 86 o?s1j_9
+ia|2_ޫL@~inY F=JmGS<?MM&Ax-Z}?+Oɍ԰/ȝG
RK!5%BKH[3O+-^]Z#8%b8L#PNY}H')f.u0qZTi~%lkkrFAFc]v!?S2b% ~5I>̱
+䨒I?oһ|A-(t=^Xkᰟ~c7o"i޷v}ڵgv^]Wi4{ke+q>=2]٨<H
D۷Q. 8}ZYyQv=YZ{WvL4Gנg$f
^w~H Z[sT7`zCZ8B#,s=XT$=&'1=}j7Wle*>^Aa};ciî:(u
+9 
+]=YO	opI>& \@'M.A9,ҴOO8!MC;h럼FOҧǿefC`&s^9' ^2Yezo5Y|=^y"[Ep|;mZ[o*VS[BJ\
+╹'?*$<႒ C
Ԕwqs_| JuO(U'8E~{2 ?W_Es_Z M52ࠟ<a x~=Iٟw=U|wgïZhDrJ& fj(lQ}fb| }_z)a1`-8٤ ńJՋL|mwBury tW|Nen]H8WL`~ipS\L|VIbj\Oŵb$M}Ao&OQ^EѸ|<x$cs'kl)a d+ˣi7gSm%G~$:f"x;?ak=NG~+OOti	jDĞe/Rֽ<қ%43-b9=%zO/ؙF#5 <
Al|3T&`19`:g1=~iOaEqQ`	q_OEkf=JY.L>;T#'jj BO;_F)KMX)Jju{<3-*Zs,yP60˶JGio.:;̱Bp彆rk4hZ-^Gme*YOQ[>VKόQ4ӧO=WowmƠRxf<IrsI|tv$ZJIm,biJ]^A00I_qO־
+C5֧q(w.fOS#=+I5=?I
Fd2\JQrYnU2{g}6 sW[s^]!3?ߏ~u :?e^ŏx['}\1A˕I@S#̔
+wOhhy=>3++~W9ݨs%k㏉:ky:Mjq2 !/cWOkWTw+{
P9asq E~|oqqy'<
w>۟G,vW>)Ya06"T
+̣gViU溵c~!8Hэ.Mo%<W֕JGH
˩v^U]0;XT{ÕXIr	"<9u꽚 i, ^)KNVpK>-ھc=& "q^.` 9o1`.-cYfe1+Gh&eޥ튷fQR|O? 8?OI	=A oW8y~ݱ
kg? xڻyi~[|GX
+>
d@NszW6KE-aj
j(,( ( ( ( ( ( ( + 1/?gmȎž9mn0y{&٦koWN5ǏGX.VM3瀬l$E}ʺ3^L}K`}'Gk!\} ɯ< @| C <)[xbj~F8bOB#t>w|a66k8Q~ t?
(4|<`$6_eU?ds<֋| 1 PZ9I
zanO
q 7\A]q_B9 ?
6RZ#Xc|k`@ۘ6rxvv⛿~+>Gb5[3A ҕmψV]ďًRqXh?' ?MKokâ[UaKjr#fȒ7#vrkx*TVN& :Ƽ'A8Ktj?[Y\|+o-zKדEh݆(@ LנdͨX^ 0I$.7
Oo |qlogŠ[Tts.9?f`ޯcs?Wů~՟umCYn<gyŬ25DD`uTv9pbᆡ)I}>gGxKcP6_-X0	&|1潉5
+hQؓw,z7F~͚4>#xcl?f<weőCC\( `E~x$?h74/ i[2Sޝy⋫.[i&hY	3lR;ςX:Qtj[?	+Bg~et]^}XI%?q$('>ecbaҽ'_	Aۉ+Cr@q`s5<}:U-5̓p2dlaqSUē>[BRROk_4qYIܒ)R*֝lo5#t$Y#|nHv߉:PGxK:/Gmn򜟤u5r4P?^|7{i~*_i*-x0jJxZ-
u_ *ߍ?5]ng|C_kn,]Ip2WgAoO6HN撻>??l eճwHGʿfedW+=}\ ߊD$ѭ4{yLƿI1k\~kJ[
nY}
+p
+KKiqU2⿆8kP/ PAC SҾ_"KӋB:n3
+۫I+msK9^CSy/M.6-/NGVZ1˱Q!Y7(~g!=?\WxKcqyZ9|Uc( ܷ&J<_T7=9uBaA3 |λ7z$&hW쩤iln/#࿀.u:)Exp+ BRpo`?߱<=_WZG֖ޅ}mA$D:3Py9cOy<{wϦ"NZoaR+t1(]M^i 
*Pk?`\-{M̈A,p5>53²9#iu9|UKaƫճkkdi쥁9/ p2=z7앪'4.|Sg!Ko1Πb $7zad3 `i\v4j3QSR3@{c]\9+[4 qBsԀ=־?cߏ>
1񝶕.=ֻkh$e˂Ϊƿ" =-m<10XmìeQ?3 ֺ_ISmg\ f3HCKi+psT-Ivhad  O=z37@Mja c wEyFv[*>?z91W	*n4XH&83@ͼa>`3_
JpH1ݭρioW4nie#WŒ7_n/9~gaeG7 E'"{U1Akfv QAYk
+a;__Ʋryk%4'q潣
+m ~֙|Y6WgOcIw{\/'ǭpjk̗p1Wσ&)/ f^bŻ;VxC)Rp{ǚ+ }kʹQ%s.ќA^fUѻd:C+ּ;q庰<chGI1^VhjSϭ|2 #o%h$R`V17637^2{7y}9zRhjsΗ	
挟AK4x_Ú÷FxxzA(e@X}_O\Y)+ _ WkZ^⟈#\ӞwK}.gr!9~:pQ[|⣌'k^g9]h-ƑCңi/WHKs\tǾ {W
W]=m㹴07FAV ZkPr4KP[h 1T FB?ztWNKt{O://^OI#;(P2	@_Arox7n6u=ex{K`HSG+.~$OFKjXY  V
+zu+<<|{c͕
]NK/e?<ܞ^ZC-c}.+EOy~@M\`pVcɯSNOF=+*|y$cx[$kmEg9WTiA+筲&s79hZo_s$<5 r#WO_/JP夙[\YݏQ^Qꓶ9PS%zW/h#A"N3ּWe);M |Gr&6vW|Ui<t129G9TS>$֧S<^o"[ )l}gURtKDIemǶp*n $'[+[
+ei1hzS[zgPcn0FNr+.`c^?~
j۶tnw) 3g#8⿺hSdQ~~S%+( ( ( ( ( ( ( dl|WRbk?>?դӤ<i~jn_]u|^?  c_ڇr
|vnVADd̲t9i.#dbygKOִgQB+
+{*sx:SFBKrgL# ?[@K.0l76 1D uoO /_L|!ִSEu _%QZ6ޣ%O `O1 G~֚[W>,i*{_DVDs88ǨaQN[#]ycK|^!X5KK'TVfx˝!` ? iW}¿eSTo{TdH\:$L"eP` ͏_.'g N6d6)ly֗Z"ǴҠ?*i-giH2&vNM|xjS-ݧSiq\j>|\[VN v=',me7;i-|j[9lܾnO]M~D~?5xCּ=n-bԴG|VƧ>cw?@߈_/  j<ѭt)zu&Rd}cW|PW!PzD%mh UXl+
\׾np5{,
L)q7.dK+T_ )xC8:4צּMBmQofq20	VC'g8t 5? [>	ǆnnEʷW\o;'хcKO	E;~t|EZêZك"Y&H]|(sHC  |>g>  >/{'4sxcF1$|>kb֧*VURk]~G'*̰~iK[]~5xnշ/=_b(F+uy8G/&k?:,r+K.0n]	@smKsi	t%pny9{|5𕮟÷	,Q=:t/F kWTWOK OXbs)ӷ4 QѾ9O:fyⶉqqt4b#x~L:?JַZ·k-ѶMGl¿w'(bY";8;kxw5~(K^kM2ԅϛu_Z)FR^e\E&:Zt?ϦR#Q@q_YɶSïj"4"i+ و<_1{~}6S_T{yRu9.anOs۞3 |{Ixe ۡ8㪿_ gճ_)3{ZOr'|?ʾ}MLv;5Ck  B> ЮkGIH- G@ Юh$ěC1l5{kO 4r $ǵ{Ļsq=k|kc^jvw6)rT@Tkvqz<⫮gcyԶj͒!3t|>p+GL]挟d̅LE-}쳜o/85u-0
$Wq9Tޏ&{gs'~~/|CR;CѓTynD>V$dUڏ񧈯-|sHcLޛJnm<-UV_?Ѡ 癿h5_iޱ.ϺІ{vKܬ[~ NRk?zjyC䮽iwO\+"ӷq'ŃpSF՜ly_%:\H໼OW?w௄^,Cd>ӯ-tH'}/ڞ
^@
#?πvr]g	xxcÞ7mQTGm:XQ.ccn^;؇\VM"oQH!YW%g 3&y3/oc|/ 0]ˋcz0y7]ıK|p6s_f6\0@>er+٢< Ed&I}ĹoI<0\(x_/Hmk<6s ż:`Uq֘)y%fXrK)Wb^65x6Kla%|D lܤpG_KWZ夺V'kϳݬq'90.M~|~
+Qw_ޑ[cЅ%e@2:d澀<{?hV]kPOֲbRe!`*|<]/ڈBXSK_>"l q'C9ZBY
&>2qf3z=k	1?ޘ k/~#x>X>kg#HֿG3<5*RRϙa*I?_6~j\ItL 1ٴ8?/l{2?'8~!GxYTܩpz?CĬD+c*RR\g~pB?Ty_Q/ن^\h3*
+Y)|J   4  GYkrZ	Ik{c'n# 0 
+[TJ-+|A&$7}?\mƉ0ELE~?(8>,`fTԁ}๚[[AqaϡV>q\/K@M
ZyUz}Cfq躔^cizMK{	VŴwFr>O:?^Gaо(Q%mȆ/w2);=Y#oj,' TjU5
V<GmNJZvCN/  AVnt]b)\w}^|#
404MH
W*S,çZ f.%Q0Etٕݤ
'zkM
+nw4Cƚh> -~۫
+?%@l"($Rk|G&->pM!-mGp '5Pj)(ňHB#MkА2Zt[_ x7N(/o/e,蠀>.ΪTTvNW!h}?˿\xNT]:vLZ\ y6E;FlWZlR:0^ 	ь{/Amq,FMՊ;hy3,қrg}=mOkSsw{;Z#uUxrF9¿fgUfu/[)<ţO!Vk>:m-P|}ɄA ׫~ϟſ<$n&Zkf0S~1ɱ PSV4~[YeL^/e4ݛ&wT˼yJفA	PHfm+ۯZsw<\61uC"IyFm@[/\b]N>nMHʒFp'XW^=UEiŶ(J\׉o͚Iimݟ"
+[kbg`CݓO}V5!'](=N=Gj^Z0x{5n"wp%
+:nɯcq1ܦ_ĹM|N>̪<cn/="{V %c`racip|,!?fe#dW?;BݶIL+߳~ /6?B۳bO1W6'6<ϔe:Ncv޸u}l< zڳb޽sF!_[0a<olG5֗p=yxݹ3 a|]lyhQK\xܒ<ŭ;mz	S@UR.0s@Q@Q@Q@Q@O~[$N
Z->k*ƣc;_O>.`G*s+n_G
wy;M.յu!/,k1vݙf;	hH\}sָmV71_KxtwSϊ4
Gþ ,N
+2}uo7Vi}3#|2ֲMjDUާ鶚m\ij`;9{寄q\\G,7x8׎mxvga\So?5?efk3[=4}BXxL<0y#5Kp +δԬSY9utWH\ܳI$y)ruj2iIIkpq#R[K۾aWEu1u+yIޜʹܝ$hxdUA}?U#yr-{?nCAk ڏJ> TEf"ZTmoL)*BORx5JP?
+

+	Gnz X/}{~߷~O~?5ǆ4鴭[+kQco,I [xYr3*Y85++u#|DkBN1]z-w,dbb=?vWǆΣ	ck"'-PBWo-%ە]gR}ZGb?&+j)ڼV[¢QGIH:Re_q5M+'na4kޞ-%#w)W>]36+-aM6FD:C	F?*ʈN4\M$s54s]|x^7x[Zej:nj]XL9cnPȎA ^q(á֪m2"ȥn[w'¹.AqWkY.ƽ17mx9s]H±!m#Ѓ^yo\B!$BɀyvP\eRaɢbw<vIpw6:"f'/eUj:3Zt18mSGewuuӰ
+[ p  `p08MIz{XhK7qS*HsYM#͈g)P-6n0H#N2q	r TWWpAkd22:Fz2\EoTM8/#呼pS;H8$uqҐi_5+y5,sT%<
+w`C3qHrD>a]gg4xÚ5+{w#PKAcސX t<%P}ĖI6}w.8ExOU]v;>r+~F#_3ྩOpu8	V}Ո] H]N_q7컬EO/5W?`"![e@ͼiZ^/v;L"ĹQCs^poAVr}kZ5MA٘¢娮jҾ<_-e߀j-l/nwOD֯ԁ<T$8j}_]N⤏m_|bzZx{M<36}3@|p<zh[PRrĥx]g9qUdD[wuTƒh׮bJ߶K߆0Io^3ġhX	;Q[,I-:<19=+eF4f5Ppxxz'=ME<	vlOpTt['_ OIdР#9_=H O9Ϲ /?! j'	5gsm2SF<l#r_
+9Z-]~M6Ȕ}Dg?+m9m?SY?ʤjWq9&BPQ[`Ճews߶	k<Hvm ,"vUb< j,Qg[b8UrF48w	MF'M
+cKi\e v_JVQ$ᵤD dB{|$V$Ң<?j?<WTw-VfbrN$9Nᶕ|A-20?|h3*&ϥsC5;eSj|B%u&9 ׋|G֭o&iɹG%eV'<_42H,IW4[2ӒYdq^jB?}g~VO'.MzhZoe#ӯs>^Z:7 c濖51 `?\e>iz+`i^'> GN;@QNJ1ob}S_tz$n5wvD6=<gp83>sW#+ã7Z.
+IK=?Nr~\NF5/e  ,Iy3(ƽ7÷ד:[M>hk4O}$ݚ*/U ( ( ( ( F8|E⿊ J"r'ao@<]q-u,%#־&-Wq kρ~3~!4?_LITvkj%8V@=)pN[th~W~g,ft4nWr 
+qedԮ& rZ5%վѨ>u?xI`vU޵2yx޹?hy?JT&525د40D9w?`Sn"lXXοYgy[p5?Ҽ[[;` zOW?Qsڥ9|;yvݼO-(k-O#OdrJ5 '23a+G ڷ٭gp.
+~uB?~~4O8l&}T&^9w=xnS ߌ!/AMMzh%VG&{Z yj,uy}9 e:V]jـh9VAkOٿR:Η[+8 ~5_~ƿ
+588٨sk|е#?z=m^
~&WŦdz H$L _fGPpE0LCaP)#=ۡi Z|2σ9m̖ve/i_2
j f 㖧oe'㸈`oߑͱ3-ʂJ-$8H%c)?iVQj">~	<'k11vMEx?+jd
*8Y乛HTIՋxr
t tWƟmi
.ඝ}cl8_?i]RY<m8L6ũ,}KY=}|*E 7|-A$kq5(6W=OVK\t<P/͠2Om~O&'9Hǧ KNv
+%~P? ~dyO!?na 2AV_3u?M:	&-a
@ kۿ|~# aTq[ |[!HnN>/  m]OEܤJbm /P NFO/@q@ {>k :x>ǢTƿ+~1-j9)մg)}'pnz =e 7W^/[Y W9pE>r1T]
+w,c?~߿t iۍԷvC=̮
L_J/8F:Y'O$:E׮	W  ࣚ.<]LQNׯ:\A^isk f_2>9-ϬYq2?{#삲C4/6}`$a$~ۨۧx3lO[ڢ)ff!Li=Mկ ŨIݟbP8S~\s;NR3-WF״MZMoH̆x0A5߀ 
+5x<1k>
R
DnH7W   ~kxςn?7 ҍp_N~ٿ/?>O 
xB5.;bTrFz Ck$_t^iŎFEue$)$emCi#8*5 "pkȵ_7:$Q< _GHلWw?VN,/=_U_wa  #%  Z?٫  ĬK
v᫉G 
+.avЏ~nfր?|T
+7 X
"A/%?+=q}a\~qNP/<g|jjG#j8mT5~?fsW_O766ځw5E I8ޅ	ɒtM2^{ -y v
iO:*yO\Uw?߯	It=8F	,{oր?_ -L(v| ?o ,+&@M :&`=gqM'T+ QiL	5l'0s8Iڿk $15
f1U^ *5뚂 S.\zW/?>=qri\`x	`POJź?5Ud'E<㲱UO|_^Mқ-O\s]E#5{dZ ?ڿ|Eeoퟋ%$@ӷ (ڒ9 lc#/|M`Ik;Y?C>ACGܖJl/)d<;
>gvֶq[D
+aT¿V~0ew
6Đ3Kuڥ:{lj
+|)㉤8^P !ῇe=W
+RazD6ƸTt cZi[)5*RQE QE QE QE QE evo5;<dW$`:O}UmB; t? xkiǰ<l ,Uh (C A־ \ÐiZ2"Lz UU2DϵW׽pz#`{We gWDuNHWO5#
+HGUJǗ$@5s$xsErbV79nMr3ib
+_u1xFsi/1=Ű FF+uO⍮𾲝w-?Q'ÏArIQ/?/9 
+}75n6|bK4nm"Ls^g|:\j~.mx0D!n4CD8"ӌglb~`AӁ@-N	5HN>*헄4Hd]*O]iVV~7Bִ+}3RđK cq?J+3-mX@ a}k;O*#?fKټ;4b,u86AOQ@~qԶ/ld
2O_lAf 9?jwGƱ$Ҫ*ԓ@2cnRw
+#  _1uo/>
+U l;W (|#xhЬWan'oJi9{ɾ<1.$bo ^Y %丙cUԱ^/ۣ⠺O[*iV~m¯u</MϏ(HJ}Big?JڤiVe# t~}{ou^,e ~$WO8I$g_ƾ6E{8~Bna$j>|Y4:EHW,p20:)޿w <ggO:OLȯoȢbq{ی^^4WFdE$ܘSό V(,z  Ƒ2H,v5זsea=+]c
"럴W9}`cҿ/Bo]G$7M{pzoJvzE~|hZF?7tXOsrc%Gnˌ!cɪ>I9}WS{ې{
+s#O
cM[j˝+HU*CBkl:W~
E}]bJs)XHa0w=zk|y\xw@pmg5@XR A94GYaOi
[5ծp_6rH鍄T>~
+M׃Z1dhk|Kծŷ>NxԒT5ÌU2=A?xTI%x=m68!c+޸_!lMc> /:恡]
Jm>sw!SIwk#2y
+~#ҳ5?CA ?D/R,,G88w^+),:o6
jkR[hO13u⶧OC';4n ]_ټ{
oKhYc N#x57
,j? y
+$t[-Đ +[>ҡVXf  =Ga:53GӾ(|V[wxVٯ3bA?{ 7QS_Zu$W
|˟6мsd)dcvF  ~jzu9?k
+0zq0+-mzwM[S߇Av&JCNk=;:O_hlf6Vr^cQpOD%XĐ	q\Rg~ ~ ux^ya;Z;$v%$M}7M?ʖ0#_ gO_ǆd_dTd|ù+o	 |[8H^ѣJVf<qzسOik \-U~޶.`0ߏrگr37⟂&0_Fgp>W?6wYAe7Һol0jVx !LyOOE(x	"Z;A}SGiA*h9@VRe{F
+6_ nkR[MG c!l\B>_a8 Ծ"As"5ҥE1e	}O
+y}0gI0W }¿x.dHS|~_
+)|_6ڌŮPOlIƴ-xnOU¶M Y_Wώmޯit$>H/WP6p}7vGo
+w36O} TN	 {5Y8!Tq0}OyWoY0ʽº^}ʤQdӊ_D w<Y^4βſTޜ_ENVk2І/&ķҡᮚy6PץS^ @GpmOLʐu})Y2>^.Ο	-P ĺ# \-g;_9X]":|'֩IGEbA:Rfԟr;7Hd rHk)z~ZtWH%.ÞVel>ƽ0+#)Om"u?i*C_
eƗexN+n2ޝ"Dv?ٯ هB7-&ٙtJA`F'¿S@mC  F+IcUOQ@Q@Q@Q@Q@Q@Q@xgK
ߞmlu-<M>.?F(j6#IC~ 
+_y>5@<ֲt?uC\ws^a tkI"xh3[/x~_zP}7Sd`4L^^wx]uQo=Ζu\E%6D^AC&f\MGg?7zzaWڵİIcq#gqιeE
+5vkcú
+Q#Qwt`
+yǴ=:Z	cp>By-
{Yᘳ

<+ˏ0W@.7tV0d2|9~9j _4ãUGʶ~e'ƽg$񥶹iNFuF8bׇWWzn"rJvB& sͷkZa
fk[ku/``w/e$uF;3Ҩ:qZ'6$'B#9ry-p7_~s$dz~aCKt	9x*zgU"1Y<w51cbdVSW>y\ڞ-~_	n'7?GVRᔾI/M>J*ez
~Ǯi;DnvHiyW~(Լ	MX E|bҦ
k߇GN|9avk>i%VgpH0 iȱG$@U^u2[?\s@ʀ?.߲>
.ccO].WC1!co- i;G]wܗ:nd Q+'
+c MXVnKruzt9˯|4mhoq"~l?5|$|HW=X'־e?vgS|0!7okH7'3\'xJ	Z-c`JWI=>{v*AIhIpn t-NĲE&v.mn(lt }{z|X>Yt#uozyk4?n@! hoQ>
\S=aP}+ /m7Dg
H]O\ej ww#G*k5(I ,8^ï|:w4iƁ8@$^Ewx]im	,2I#k	) |O|E
+xFuŐ 
+<c6}+ 뷚#|/u,|+4.#dG_/9eoom[l_Xkus?~kaxݵX[o#!¢ĊAWoRHloVnw=嶬d3eJD.u!? JQyܘGoFDᕐuxy_U9I/V-:?l⩍գ_<	=ћTf];L.񌃲A*% rp@&FP ?vznim|5a.:LNGM?͸ۈ9 >u(k$+Bj _.Aq7Ҝ(lV#2@b|oG:ºރ_s_{%c=AJy,f^[^FB<6lo606t^մWh rĵƱ=@ZL12mv݄.x9d׾P׬b{u{M5d?.K#H9#sm8 fǚ?|qWRmi&Dn"-UHt.~V$⿤xc:*o|U<TWI6uH|k$}7VUqYo,A9<{ixwm-<G~/2Ŋ	gVK]⿊+
׀>h[Y7e[2,-;&ŅeY$A1!q!P1N+jT	ԹM lx cJ<:PmkdJ#GyJwpLʨ̉@8HlOψ?hyg+|eiH9%$j>\g#5w[N.:#	I7!GId<M@H
KFw0EICk_1H߅, ];o^m<k6y=%5@O̊Is7W⯇1Ȑ%?5^o4(5z+>G7|:K$I3odNhI_<FK(#^|cIu!{o7>6b1ၘ6JOOZ#t_i_~6Vy<?};FoUFp;qQԼ5&gax+EfZZ7#w/$vhzxI |*[x[@)o/&|!@͜JZjs&>N /-tx$}Jgn~:־;]#LY/kojM !,~vPr1>
R 7[_Y&VYS0 ;*k	5x^ѬϲUWKLȅlppp)v+:CoTv?
l1,Tr'fotYyr㝯=/_nhƃj*  ~Zk]:R."iCdzOp}y}7wc5hbb?~m__??P_w.Tc
޵w
+~ku " )~((Vlf2{K
`\xYc_m-4u+RH͙¯CEU?\uj64v"W?	? koeBt'mb&$z\0<9Nu?}c>4Is}o h8$ο1>15ύO/^^aC
Hlܡi#,|z47?	{O p:%	ֿN>t?b?>(վjR`4z͓Ċ\^oK߲Zi^ {}2<c->7߷7E&ozZe[Ӯz x 8"XzOs+EƅoKk3&P3{wmgso*:_دeg'Qҭ乀cж?V(V+?|~k	ӵ~ԃcnJtqrή)Eޓa$@㷨[]kY挖{r7)_?8٭~)|;G;Uyga'O_qϲZ|O>޶jv}wsºV&sZU6o"Z$=zHW!N?ٯI >7%?lA?d[?}c.EeʑY0aAc'xӔ8esRI=GjF.J];j(HYFũ_ceJm׮:exq&B"m(0bovgJƭmOGs?Ak{ÚvZ#?w.]9Ҁ kh:p]V 5wv3C	\_UV?oN?mu.D6
+(aEPEPEPEPEPEPEPX^%V|e|SݦHH6VO7VuxrVe	-L{eXqW.j2۾vJ?ʀgz:Cג:m$ed>Ym&2zb 51W]L;5_m3B%
(
gC7ڭYnUd%&VO~oB%K<W'Qخ{E|=+d,D/KȰ(-!F]yF+p~8 ∷ӔErRS{.Q5 b]{~^<` [iAN$~ddw-$QiVN,Oq_x?Zp@%H/?vQMtLl#)F#OKJ=Dh*\㚻}-FІgZE3h}cŴ%dx :'O2)#""lVP=;: %N?~*jZյxU*ua3*H>~ǩj
+5z
xdk6H;Ϥ<w1x~KéIb.!k%L +'<	>#h([س[[>I!zWXN(7Onocżct`
+f|1i}^r?>\|oy|'gBvE>g+5<Zm t_;s{$
"?H[4%ne} '#=t2p
zuy+yv7x.>{{"W tpONk]?⧀Ep5[Χ̇엑[XJnQ]ͦ~L͡+;rTC_w?RO:G!D,?ѤQ?eު3(kuPM"e_:!-Wxi!I<>#,13{ |ֻi/cߩ~uGNпlٕsx^M:1A__	?j%/fCkp:N&=$l p3_!{PVk0 +O	xI@~ht*z̲<66RHO9gt 2OuzoOز eAO־ xT4P#`޼z-_
+1"+x"0[e9 tge<IIG;ؓbGſEyAJ
9Ok_M̌J93^1h iдmKQ^0!viFzX %o>.g([MZ_.N	(=OZCPS>4
KF&<2̡9뽷	r<L|]~9jONu5
:H%Z	3)@-D/kNO9bO"
xw".UWC"<ulay)[U9ª6ku/Z3s/tZǉȸ2)/Q"Sq4ɢj%__c	La8ha2J`9S7ӥN4i+F)$$w8~/1fCEEk93KxWgJtq":A'-֫oc߃fA#K.Qܳ0}i2kÿ{[x-Z~w$L"KmX(Gs~Sľ,/	x涎&c:%@|ˑ^m/K~?|}9#W*Fy?*9Z7+xo_ǷԖPGҪ˕
+
+9<Jzc%~̺ʹmqu|YUϝ+QTކ֑߅,?dvPb5ASErrGW}jZ|rg?Ś&[ >RCpU|]ݼ;`Vr-rmW8_1rRk.4OGFIlTtU`tܹKK0 +v<F٤Ѵ;pdYS;d `k<3xWK=ѡ\EmiJ= ך|UK֕|TCE\]cûM#KEm?R֥]
+jX_0L14)$MkG5
+|,c\o"N=3L~[0D><ހ:jOVw`rml]8xd&y2H`3qg~0BI4?վ.;$kL'8;b6c^fY~
8r~_L^}\
+XƩ)CO	5.]~+Ѭh~;H4F	RnH]@8`{WZ~%o񉌫u&bv#04k&>P
zλ t_\KۈxvY}@%ڟ,˵'9_>1^xb]7xu+i4|:7e&峅x
܊O v1B%]%+M`m'i$g"ᯅ#a`WIAu0b  _|$w<CׂY?I9\|)?6X 8<-{_<ą%Sj2B !1A'ߊ.xoS-ԏW'd%p
+мaV$K5u4(kK~! +,x=<eBXYxҡli//_v
 ^ 4|Lav:miv u!$w=8o)a\f>84}?	~I! _|+2@'g%N0|N7 ķM&,c?nbӴ]
Rݍs>qc)-4ď/O~
+\S[<;SH= o _W~a?>6u,*p[9|emeEs_/	eZ3<Upɦ_kvQ]8,13,d t@pxul_cyk(ءN`'E~13}<	#3A\S{#	9hNC!E}:Ck/ٗU{cwN]ʹ9%?_~S_R$J`lZvktSR+juL (.p|5uM9XR9Gn\_xX?
+`??؞.cD*v⿪faܟVq6vGXF)rCK%tXNIr8YYhrqV8iLH'68z& +vT W[YD7I15&*v~ak=¶<[˃  e ʾLK}.Mqt	 (QE QE QE QE QE QE QE Ph<Wv YfgP|5kp>	@e*}W1$%X 5#dvhRY4,Dluwiqƕ y\[f0Qj> ~aQN2_lv{f[hDs# ܜe}jr^G'r">
+v2*@*~#suVu-.BJS+[B#MpOosQ0H6I\^R[[
+3<09t$zOVZbԤ\<5.%JNIO!QiLW u:INk	{OV:]"|A_1+%d
+2=*8._{\&xS¸vY~=bJ0 5ltm9f`Q	CA מc$f=u],ǿZ_xqua2U~n
+6zm{o0U gO
+xZLSPo¾ܯ>;yǯ͞!|NQhF?QWh6la,!a-]41i4䲼+:1Zz؉V|K=N1\^=OBQ-x>ބW?eK;x~j|A_Tݿ6rl+i읫쿬ىgMbdv +_|$35G{s]\;O⍮}oSe/= {U#G;YG6Tk!xZ~!o%m[J-eξJ8W?/ CUvsŖ:T}K	.iR/ho
+f.{LH?Grk躪imCg_yM_.x؄ȣo]睾ac{O-b=⇂<Q
VO;V.S/FoK(t-ϓ|K?Zik!, }m>\;RIcnU(0[5<M>1B:V?{!̗[I$y}Zif)z¿|g?Pl%h<7VS@áIR=A2a
+F?
+xD?;".:bCPb|91r O.V6$LVh%Zhe}mOk+ ueu315ȟ <l~Q|te4"u=ئWǭ~0~ӖzOOnXTSi5#4n'Q_J	rXP>,CmCY߈`pj}̖0<2Ɖe1zV"8?{ ΑYo>)_f)Ğ]_ʰLآB ,Wp~< f
+|	 .IY,/6#3<; X E߄a!~+o>Pqob0>ٟ ^ًs㿃s?8Kb:[lc#J ه	~xYOE<W7X3K&]ܺ5Z{\]KcidEo*@+|XYB 
+>!;.":6Ҩ=7*}X$O]\j^$wDԮ8OHQyad1ޚj*_f_x;vs8'bVP?y-ˌ?'b97V G%׿.	R;
K͖iqku3)<s4ko|o/<1֯$U8[hX0b@@	[ ][=Rf&0ؿȉm7׊mZ<y}_}7Uyjzj+Gqoo>F7(9e w?|ioşƟIp2("QP^؏K,O1vv*mmvjBw~+t{qE,xQlFQ6/>>sӵ_oA&,m!ǘL(p%JuW
+]/eY4-ΕqA:Vk<£!.;E6?hh>)x\vzLE
+sGtVQ )j?Vgn0FYG3 ed;(7S)\O]Nk[#E|V_6n$#DDT+ P9%?{癟ǟ7\Xňw;!-JZ6_"7JY+o8T>|Ǉ5' ';Z־md1&V=qcIjߌ:ޥoQq	UG(W=AA֭Hv9v/5>.~)|HVWI-pd(r ~Uj[c
W"Ծ
#ѴZơg,Z!ACº3񮍪|Q0}%"!򳴁玕B>7\\#pu8Qp gM+ǐ־	q'Ǆtiu@
*BұIdQd;rpN~__؋ᎫO :6c2MG5 
 Ͽ->煾8qouBs-41BBrM|Ll_ŏ?ek=[Ѿ;z5NM'UjA B ?i-<Ip?pmP ]n[+z}埇o/b:万v<;S|-N𦣦Mf'6_Pz<wpWV#wʰ+"oBw\oSxlqOm(Izӆx[H"pG#ԓGu xFe$vAvvGyp;_~]OZ`M+d{;MV<?E-EHռD0A;sS
+5ϊpXf.t{SKmNRB +s	1uXw!mS)[ٲbH3# u m4T&)Uxfi|s.Yڳg˅<mx*؝ZY n͏nk{KoE8y9UZOweAUj񷉴ٛW 'VW|Z}#h|;tĳ_f[,m`	[si=ϡ>
C|C.:_V\iWV7cwP+.
+?nق&tҌ9n3SXvs' ;ǖ$Zq9U
+L{eo澄NQ~EPEPEPEPEPEPEPEPEPnu~7#t5r΂HB3k˟@
K<"R2{U{
+TpKYIʲ[cUo8V@%^JOd+Z:YYMdӉU+VOخǙTaJo+I5ԃ=2dnմ#6٬qL{%Ԯ|ܩ9 dZLCUYW爅nAksx#'鶗3qʜ%gvcG#$vO
+B"FƉi8ꥇlfM"UCqx1ml.D#N-hqc.4kַ9=zYwH-c#C]&5̂h# Ȑ4>neN=JtQ}_ö;Zx*vpF+[^3ƽ.q$yq\8KSM62HAحI.;5PעiM(ԁ\JVZ Z+-R6?P:mT&]IgčE]73MG*1\
#[>0:Za1L4pvk.'4#x~EuK+5]Y-tv?CHӀ= /
+Z-m[BF0ȮF9>OWZw3v)@O+sPt?LKMG~܆XEv5=xk5UmOynCE|_Y̍>"
 /pgqCYsL2qOٷ\?^_VfSɒU^_(T>о6|<n O[uQwf}DШuxHC{`A˚u-q<cC7Gt߇bocj=l9Y]n*v#>y[Ǿ{/hԠKVHS>KeV-υ~h̞|K渷Oް X޿?Ii~)Y>$'_cǈwr	]|{*h؟[*sĴ/h0yqi:Nٗ:fo: \e^K{ɯ76)QDɶ/} w|	㿅 o
+|Mo~xZYxċYOPk
+hg7*{`EzT3:s ho,Q6fؖ3Ey~I5pmbWƶ了fcjjvVqc^џtJk/w`FQjpgi]Xt?.{O ~D2^h's _PڣkCH˦*v/ ?㻩Ə~n]#ğoe!RUniBt@Pkw|?i 5]ɺ:;yGJVz>?(w~O˪GZn?Ak=
e|S %䀉,TP{djAWUm>]O </~|k}5D&~|[q|L'Iq] fƌubv8`r0yp^!?'䷸(;y ލ8vYex5k_>xH>wlc_ƾo=f/|̫I؝Q^A㾙a7Kp]5l{U`8N|,״ _
+.<O}m!m"<wNH"<[_ibYo0l<N#r2;
`#᷂chŦff=ēK/׃~xŚwǯ(|49[y2վz_HjZ^hVZ??h"9#)Cݢ
 溩"G#T3*I~j_8/	񷌆d9e@p{&{\I9g+|x%JmCSc~w㲎2F+N  O hk߂&~|1IiDj:Y}r;HD'f/]o>7Mk>*8B4v4 Q_:
lo`m6q's el$hɭk]w
][ɐi65W0KndTVUԆpkIf|Eebɟ71h_*xv- A<(hj?8W[}S46Фk6H\NIo,}aB߽LH _6=cĐXYogW0 (}r:cx7n|;w\3D,=p	-i\|߆ |!%
+
Σ 舃u&KIů:Ǌ6ǁ,erdm(VI8ùPAs\ xS]dO*: -P+0~^?|~a6XtxFW·Y7Oj<P7KrD[dg-
vG%?ug^x~-	LW/u;IV6*lDs!ܒ \k~$>-{DCg'ܴq) ,Ř[
	ii6j27{tAA-E!#@ /e[kjGMhmR#zaHF[Z-n8k;-/6p[]7+K[@]MFGk>7 9d {T3X\͙B`Шqfѱe@	R[mΝ'7V&|j{c\^ ֶ_ؓدYZ} >(((((((((Z= kUWO6Q h+;)"	$󃑑[FzsUA?Ji\.I=1UI-d:VC9m9˺Ni-8`jhS\F="b<IiHH`cx9R=(1Cdf\	kV_ul-AII`UZ0-~EXIgy S 
r?2@an<P,й$JdI#6Lur).bk͵ߘcEcuQ9Ú۱؊ ֪GVn:
+M	,y4OZi瀵{bQ}(?٧(rukbQ}(\<i'uC5.bP2?4 puAp*̓{Ѱ{߅BK
Ӯ;	^g_O3MkfFHޑVnE ~+ YhA\>x'ǖ7_%kn+qG׆<H`Jkuk~bYrrB Ӹ?fxo_~+ÎI?	G?[Ȅv_'c	|A5^,,l@ƥ`O%Ui<SZMqЩ^% pG2@r+HLVuKm
+ikj|u1o$yn""HF~b~_o7<M%u^pA57 Pd+_'cߕbCc~ϛ'֞ې	:^uhq"#~Q~VPk}gᮮ5j'SQuӄힳZֳ1Z_>?g|Ax r%͕	'G^<[I;>*{Xg9 iDM_2dr⎈m4 _ǝ$
w)6w
M~|
?d/Ҿ$AFeѵo&r6{W5!!v㩫Z
* zj0vu">	j3[2SzЏqU,L3<_ŷ_?_'Fx~OE-qq~| xv+M?%{a%GéΫf6.۸Gs`$TU>>}LO^~9#Qi$F<٥?Q?iOٛӛPfk+ՏQ?ݖ]~5wJK	#R\/●*E>M7]:B
vq Wpp 1~Y?|$9=2ͭo7fߚwm^+Z)
̈["G $j:ǀ5ㆃ$«" <.ގg=+h>G^KK9ܩkM.tG'ݰl+^iT4oĖn$$u2 ^!|ցിyu	s{]KX|}?u 
+ŏۯIokRӴx8dF<FOMi\_N5
䛍3*,\uqu߃Khzm׈oedlbɨ@Tcl9RE{_ ~xv~IѠ{"0$i0	29G?Bx7@F5`7׾$	nn$نU8hܥǛx' ZzVix㍹4#Ѿ8z{d#2Aw_t&T>!u-fF{<w$5 eaOGL1׺=?5$~:ߏ5+f?gWt"8W`մ<WCk-6k%ga4N $J?>	_ -tM6ڦ3㯰|2Oo^<9b 1_N;W4]xɫ h:ޡheuGJa UF
+45?7o{m5"`A{SdnVrw4l	Q& Xt-RX$WG'W/L0zSP ( ( ( ( ( ( ( ( *)G*߅KM~T
+sL(II;"Օ."Pܰޤ#E,!<@2;"nHE*j& gy}})Iկ/>[uh*y'>$կ,8枪sȤnSZ|JxՕSqOd:\GhAéy\aOz̿E 9((((((M[FAX]FG.qw+$,`)y}/A?-gSV]i3mʟWn`.n]}~\Z[]CѰVWxෆ5$f7? PGĿ^e. 
+iZD|hC2Pz5Tχ<[|T^<#O]JU/E0ȄWg?g_NKڭy?WkY'+`uv,~ڴ&|F^,o*Ab㯞)~ş~_A;±/^͵>"RӣaWG:쿧wĒxYSǄgKWf{HvJZw?'̉F96dymSdrt[IswG~>p<sWOjlo"V' nG`K𷋣Ho_0 dNլj#7k jE֮ψ-HkmVG-t)s	YARi?Z_)m;{#W	xmGt&?u>)x 
|UC-UǡRAkHnH9'+*^/*=KMoK<S L>hϓ2? se?9-1HO#ipH}7	.{
+-Pp-~2|J?MJn<+?Z[ǳdW:Oo|OvCiio
+:$Q {
+\[lEųm8WG«yD8݊,N9$9=$?|⯈~ռ]=/)͙o6Atr5Oa{ܚSZ|3Sop-n/5?5ėm0Ǆ9vrk=KOuie+FũIt 7&ՆRYL>9 ;KVwo;;>,mŶbr-lmW%qr7;3jgQ"q6ÇJ߂b9ܗA)֭p0  
+eZ?]oE+M4_$$UlciP?\
+3m[ZgMe bBF G"~&32DT=rG߰-5}bt!9O+>4K_oO%
+=ɮFtֺVg(8\(0=jTLMZ2h'4ܮJInfJo;`f:/R4B14}OP9Y)D\{5^94d/5u~Q -Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@:sF94PJ֐OB 3~}
+GҦǧ jc
+wЌ<7jOLSp}
 Cw<'ý8uj
+re`R(#1R>ԛ҂Iu5Au QE QE QE QE QE QE QE QE 4 Ep"oy!a/A5n66"#lt?YiVKI`uVB^tV^4{=r>mg0Ymï? go m^o0$*d,$Mk|
ty\]i@{+{84>;[x?I9)U x+⎓O oE>+>!Ovdo$ J
j 
+J8b93j#>W2GugNiW ;~ڝԒ% xOAvo jZ4яfxI"if9,lO'b?z0bO?uY\9,?f/oiLsA<`߇ n!o6:XU]9i@oNY.*|?n^3
ĿER3fYELfٚkd<O8d)E}i6֑oTjGfU-ޫiC]Cqu<ŦvI$l13O}I񯏵_vam=T:oοU<X:c\62('߆_oAkA2!>?D>^b2+xn׊͇= _E
QoEP0 6Iܣk t~u%
a09p}
1=Hi	aa|QUڍځjrn*mڕP(HՊi@yh?:
+cNjz ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( n=(4(p*ݕOoym-:E x/x[qJls7Pr~G_#(uhH00 |kjeV uE;H/4B/aR6Gҿ'N]6̝( u7HI<?uOį
|'Hm\ }{u!InE0Pz *:Ab:T
+E)	aZ,#^SMutߛ^{(z@=:ՊB!CړaQO}}Sj6j z}uFEI@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/samsung/galaxy_tab_4.jpg 2.3.1.src/images/samsung/galaxy_tab_4.jpg
--- 2.2rc2a.cp.src/images/samsung/galaxy_tab_4.jpg	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/samsung/galaxy_tab_4.jpg	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,278 @@
+ JFIF  H H   Exif  MM *           J       R(       1       Zi       n       H      H   Acorn version 2.5.1                   C 			
+	
+ C "            	
+    } !1AQa"q2#BR$3br	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
+   w !1AQaq"2B	#3Rbr
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? ( ( ( ( ( ( ( ( ( ( (.EPEPEPEPE$J-̿ GR}0E0ȣ׊v@# -Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W_o0~P|ewOi9kNU1[[ i_jqhZ+ ^ot7 9UVBlya_xf?d?>,˷LӰ5Fk<C ؗ f٫D']0 ~# $o|
+v}`Q mր?'OֿvOcLLk Wo~֞<TK;\}v@ _${h	 ɯ'
+vտl gpW&JğR_ۋ__w-jrkQetk+8GifT&Z3[>3|'{# u hx}>9'5[Kb;~Mr~C~|'q7eMd#&  O @ a	+7 l_ًKP9KYI_K_3rϻx
?O%[?d5|3=,5v=?D mH#d(V`o$Α:?]{i~.sſ5: Ә +=<6 Enmԍ[ X2?RƯ ?~P?>~#JZ7+?  cC++_je?PȯjiRwV_ m #'Kǈ"?μU j{#߲O%I <Z {[tM|kll
+5m{6 ᆑX為}/ U
+O 7LRmdֿ[9 զ;8vVd%g. ?P,ghi`"R  ET~: n
+g'5~)4 xf5?yZ/fIUg4½JL_2*\j41ZŤ|
n-#-Ǐ05=G<T&M>?>^&ѣhn{[dʰYHc| L3\hq\ -/_Ӄ*h;oMK4-1dGh^^C7Fr"GST>/3R(aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE8_~Z  R~+fߋ!e_Ym+McQXӰR$ kHF?F~ <OZIV vZۧE01bX ߷γkC+Zizܷ	|
yqO
+,3@qz9=GE99}h	#%F)V=9@
+I>}((% w%??<C  Fjzyk]+NP]H3a+ 	Utψ
+uMݮݖ$ eύ	&hOOo[J~ ].Xu1- ʰ~|1 s?Em#OOxOۨ-.IKu,q#F+3SU8ӷ}~Ǟ7/<a
+C.&J=Ɛe
s2ǖ)'$U#1Tݥk_ L]'EPd6p{to9-9T.3r lz׃D͗`K'r.o#?cMs|G+/?
+ھgs5nwoj-C"vnxd-7%xJTl
Hɋk 2sǱGdDbKb\>3wcx?>ߌtO]Ҵ-*Zh!EkuU`T#LԟWUI)/iW"{58<v6t
+ jO!|'G߈4f;8Q/"!.Qe ђhU)5# ڧ'w~di-Z[*pV[is
+#[9݊m+E!XNa 4hD%rY6*,@.[<k
+M:I?xiCzJ+ 7\R\c]1?Z3퐇ITGWc=[\W$;V7!\riA);'ڎ/ZܮWkLYrzքSw<梟<WzZ[̿u81>dp}C#_݇ ak7bĞ.)xIlD"W袿{2OQߵUlN$
|4mSD
+'I{+ 
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+EŏuFu}cb?P+zj{ayh vX
+h/>7
RVs,rdy&GcYyp,NM{o&]1,+ۘ^&M9&	a|Aeu}2"  ͤs3_p#czK# 3Z1w1x7 ohrƔ>iKoׇbqiu5:~M(+ Jم<MpquOmrXCI⡓2d |Sï\ܯxI_	ߠ ?S_Z7>'2iyBsUAs#Zg_[+Xum.3.^&}O1 |jo^0v;`=\
+ox?7te0ؐtd<rd_~8M>2)O&ތ~-ubg7?d ;Jz|?eknfYLuZlHM<?ɘF?P?Ũ ĺo;+xK<$TI8?"gKk>5ѵ*)g>U<*9@$xvs]6Sӯ[LmK.!,ʺ0XG ^W~0_Z٬k5mͼpB(V=bM9,
/>
+ȶ?|ac@[K&u9%*ȬwQ"HLt_f	 Y<|C h:si5sөY*i*}?G</imx/</?mEHbPuJg< Q{߶7Oh<)z,-5v=idelwd5Y刏hO%gI,U]-Ͷ'k=/h8|[]hKGO(}cq*X
+˵5]?QvK÷ZtdnҍXc&S%$RMn>#~ҟ~&xZMU:֛&`HZip
+8\c_2Gꁆݤl(0qm\.T~㧈Qj9FGĜXƤ]MoʝG;j?9N<.<Mq aIEżY&sYTz?a~1j~3[	zGJEp(eKH%^5o<_z qE{u}$ry
u]\_jM6xV\wLd>;_4z275hnFH*+	.0;ȡ|yq/ErH-L=iP]׍H)fu۳_o-6l"ͣ>ԋNПJ2J6s1.QܜOZ?O㞂d _xoW
<vfEV`QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE  9 ?Z}1t'jo>JgŚvޛDZ3~a8|+ 4bߌc`}MW6L1׾5A!,.2s޼
+NƽFvpʨcszcja7f=Sb"N/\N?Rn޸o1c<n+ 9:ޫ>]}ğX?ք瞵v;| 
{~fGyU $Ae!i$'*"Qҧ''37? UZ_~LhQq<WȲ%[V&㊆mQS7VG	-0'u t*=5mmcK	8ϡ#ݿV_⇋n h+3::B\a8Z:E+&6zʌ[v>D=^V_N k|'c-<'m>ܼZD3,BF	ekMV=&M_W}M	6Q]8i27GmGR
~-?kD G,ut_jS[KuUDRyR۲@A
+
qrb0y禝ikuz]o2iz|kc~(.O4
T#Gr3\6770YJ8&IXUU_e~ߵo¯N⯅Zͧ;6
+K_ޘ2HdA<\iz&-)QBLFQ+#`5ycӥQ=5輿Qtc_3/42C<MLQԫ#<ct>|k'~uoxo",2` @u?>#k_~&⧈7[׵5{x]Pp I=i>Oxo_U4oiR+2|Qёeeb={jwR<Zf{:ڟ|Ga;[^XBbUꌧUHAk uo=Ƴ
bW"%]QxU
+  V!Wn
QӏV1^<Szt/F0OZӏ'A<ap1k4#>kAV`sXMJX_[f}gf1	k~>n:ޱaӸ xw=}ˎ<~χs졸 tQz*x6C_tW>+O㩼/ Kܾ%3}aOHd{Xld DRSS8V`QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE չ끚}2A9 < V2(jW@vqaap?=vz
+ _>^uhZq?
+ֽ*zx9FGkĎ#8s,7b 'H %>_ݲꏵ4zUķ$Ƶ#[*?_N[<gWf+ƙ[ҎCWߌϷzg>*yK=9]cMSmƞd]W+/|,O{G EӗPSՕ{}jx5XB dTi⛄-" ֽy|O{U_isư'Sص 9e,5 2A #Wg{5r_o}<xÍ]Nmޖc-Mk)^A;{xϼ|z#L<H\` kQĀ=+)`$4'9"HzդX.>d V+]#*j8#? ZXK.k۲ܱ	<qMO*M6FǮ*jq(qMyV˖i_Vpc$OS %dTk8g5KgW] ~yo:	#k{u
+$d";Kt[;0s_HliTO^홀59 e`~dW٣SSN$z%f(`QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE tV?vt*ŭG
+<dq,_' f Ft
Ka_/>>RO ;W
mιz+~!׉5 r|]}})V0rޙ<gu?Sح^FTDwr@
+I'״/?|Dʺ':n-sq\6!4p=ȧ5r~$i? <_x>𝦱[iYėS<@4Q9$A>5WC*ӭ*ꣽI4"Nuw?ҳm7eGNCw+%DD	?0.˽>[[y^	qE$2pA
x d̈́
+n?+b_~:J?Rk羈 Is<^7ӠAJ.~Uk5C5Vd:XV$g!@,__ OxG
=F[;;:Q\ۋXZ"GB3_|S):t G<Wo	h\|I7]í1eMV-^@^0y(UW.|;pjQWۿo7";YtA],5h[#,KYH+<+K&0yL
gY nKo7/=YIM*So|6/]rNxZ
Sl]_P<.˩W^\_ͱcƧ*Mr^y\y˰#WlNKY܃9Bu/FP1YdpZMUP"_Y~u/ڇ-޽ cZɻ0ɓg_%wcѡJUJъm%Zs~?<G_T_aV, CZÒj^t.'e
<gGpk#
+Ꮛv;8uYn?xC\}ݎ3"qdp#fk¼kC3lrjݚ{~Nl5&[i,ѸG9 `|5<u/~Кց ZjWh.ҙo ӓW?|)^|2F-W[s
>By>G}~I 
+I	xT*ڳK~0٥*B)oug]?Iw/fU%֛Kӭd G+G $g6xX  /tzS9&]D4jWx5o7ï'Mf],0TQ#K,eFA UC|ïzw}HN"Wia(0WkgtNs|M4K>5lUiE'̵[ٳQb#7zYmM}oKQ	<R2ݷВG5xwp	wi7;Ыɏgֽƿ:tѭ5X`TYǗg62=+/ךdQ¥X5-^	8	&7hj4jFSz]-Wgů5N;L8g3^sDOWĞ$Ι;i"__=^wEΛ[/X`~cY<n[|TW?$dY;KB8)'U$r#ڶ#|r6 ֯c9ݟ*>hw#z` q_Qܒ~_g#s0}κ;sھ>"
+ kcg &jg٥ts7$ŷ<fJKAkGxޥ3qk\屐6_ ZKL8
7ʀ
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+('TKбg57W۾)NWv,k={Skp8{k@r8yH![QHg^|oxFӽޡM<$-Loӧ9B\w{
|M8կ5MOk |'k5x#^|#԰^/׿W^+/t/ž(j}Mtz4HXJyrXWfaZ*>g>QĊL|@-.xz	6|Mt\k| ~?|G嘏K@=s޿A>gW-䴹-͆e4~]ō-o2e]lZ[\]H[DsTj'YxF6+?^Xcȕ8#; d#$A!#qrT\wUExKH7uik3~h?e+_vwW7z侂bkЫb0 7koz'Y!'Iskqac6̚D88Va$$n~5:
ޠ/xKĞ"j֯oujHގG5쯇38שV";׉.UI/-z@Nx#޿/
+W7|
31ΙJơka᫻B@W[o_?g?hx>OxǟZ@}k3mkw_n7fKh$MvaI48ÄA!O&b[=0Ld٭S><CJU#/h}qw b}M>M;G|G1K+&?yҿ^8FggzZErM32+$
+ 
ci_}zïSu{#{Jd)	޻_Wxč+vvh.-ZPCxVxq::%*GKnGKa
+A{mnqXgb ~k|51ծ|֦I̒X1y	] WB[^K]>Z$Й!m#13!w)ĺe޹
+
Lotz#U)#	*))+w>.q0|熍˩&[?4S9AӨzoK᝿Ɵj^񎭭hZ<z^lu-#N __zX%yco89|u|+}v<Eae-%ZZgsp,$e:9\$@k
+_ozԺ,~$a$r,<Yg$Ƌ̟s~J)-}gd^}KU'MMdO/CLH"x[̒q8z⻯|:eCċE֦b7+f쁯V"5XmZ;_Lr2@ʞpNszG%-?i<ug]Rgo+0.:2ђù)G6MQpT)==N2v{џb|W~Mes5f6z=Þ7tIآI+*7ǵz>~#IA[k D*Ɣ</VSsWc<y߇7¿?@5֥-şحt&9	0;ol BI.o?ѧJ^kWmJ 6mql"{
+|VW}OM[y쿴4{IV&;
++sVҴ
am}_ƿuo?O-|oxC_tmc\<$CNk8SK
kMKv?Sڋí.<5xQId	)|k\|CE4HMFF/ӊ?osiaz#wR"("|y$w)x+w)u
F}*Bo-3gGE
+ QCy1Z-n]OF
+Y~?>\cNf;\sW_is8C0խn, O=GN~/-qֿHa3软]5S.9'k}N#p?D\܂O͊VuBiX`H@b?[?[K}_
&vMam*%?ֺ:_ٷ]_~?<J$4K>e-kڪ@( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +گ6qGO/nmʣ Y+:󟋟> 2֊zLF|,ET߅aNJQXkD./~Cigip<r9,X5 i,!J]<W <QɤxZN/:u=
+cC- [O3r4_ʩ⽞"FCK^%SA^FzVk qssGo P*ٸ.|t>g׉*>~D51PN:5C
+g5|-C58G
+U0RR?(
+|
+	,0մ/}#S?iݏH^v/[^3
+msoe"4wS!tA4UV"lDprqV'?(|8g2mk3[!Fpµi[~~ۿs ~*Ki
ei*&9ebI&<*4LWw >#I_*gM{Ȏ{{&"*vT @+r,:ƵA_,.GԖ~,<զeIt0|-|l~k@YӴˍA-+Nt.s3ظ׿hV j א@%R)'#<N
mGh3Vv3 3TEg/3STi%nx 	ա\K[I.%HuϏ9'&zѸVݧ=9<][6ǨOœ(NI9="8zt}|u|7\gv=׼H;-YRPy##ӥu>
_sHKaC{RL smmE5
˱ŷmZW(qv>U:5)3.þ{:~
+?Lcxq.m9Ic .51g+$'?
+<uہᬺQN	#gJ}Mn/
+i]X=k	iwױXKk@Β[=-@ۊ exGMxA$LrLF2=Wxr*ձ-F6I/VGxQ(Ӣi[!uψ-<^^N+Ӵ3Hn$9f>-+t[S,,l-(!#c 9 	'CFJMjIOF pqֿΜeܖ[Z5T_%+7ݯ'r\%MN7n;mPn#t_ |gr%՝`^[q_Mk0uٍC:	ּ}JվǨiEWX뾧ccR9[s xIaң$y`r#,[Q6md Wꇍ#kSu/WԤi[O7ҽ ^7cn3_5o`O>i˙{WK+
fTr2m~
+hRw?2i}*kȉPqШI5P|W_H|,G\ilʠC |k*6xϤ:'6VӒ@G.
+^{.ފEхs|sƯ/Nzڿ"ڏ bxx	M;ފ.c +ܐ:W 	7<K]sM\LwPHi
+yU\6j?㦧-.x` B4?N@ap2P'~fui0_jZ/V~#=;c▊gĿM:WG,}o|H,;X[d'dvhAy7R˒-_ˈ87SݫQE}9EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP ~)w`BR1SŞZaD\/4`?_P|3wb״-`eخUF# xᇈm<'-B}+RH0UaSЫ)k7ɣ}~ o([FkS4\:Y O
+?~T]ǌmEI`WF|xXdfoRMJ*>FAgJzl゗?e914I'XQ{Ri+m7_NƏ|>1;xE֧]c[,`'@Bg،濬!xOv=Ǆ{xQ:  (-`spxWUgǚn_dݟ\K՗ו$m.~bSFm'|ƌN.qe:Nāɏx Sx'Z-UܽU8  ~|! ࠟlƶm/E|;jz2:E33 2yf5B k) |X gwӤm>YTa|wpx%s1cT7я$8V|ETSt)s[4]t?1;WkW
iW=g֭m3^8]r8J5ْ@D6鸨/,&eJy$i.|22 hƯn[~sk7<m'_"<jsLca~Yd\3,V\g)(-y?G܃qp˕c`_g~BY<x	YmO%Ŗk	og3[E\;4~_8xC[{i|J
Ow$%ǈ4t٭	qj+2s*J<rԁ7c
P| W
+|*|wFŭk zf'e=l,KW_|=| 2}j7MakG2,B *Pgn }<g̩qeH.fէfUk_I"x#yZj1^yʒn)WKsmY^wS<9zƗ+Hekm^zƻoZӋLr7cM'Cu4KbHq,np:OS,_biB{w9BVW\i?،6#(EIJ2ѫΦN[M7Zr}>>I,b  |ax
+ _-
8]9ɯrƿ<+O@͝.l"9CQq"ಟ>U)MN\\A5\^g"4|  70 m Wj>_9)9&StB1qլhh `fU<UA&<<qr1zi#gM>4oz揢]j~onu$v8_?!akNsRj7nѩ|}qQs$Wqz4w='x|W
J属9,} (ݟJ;᷁|eaY6D>{j׊.yM:{ѯATÁ d{b>)
?~.h<PROKm.'
+8O=p+ <d,U+9ݯiڻm+ߡ}"?"yxs:PWNm>^^T?L.4q]6ўނ@]o]6#q\FZ,ʎ.N[v]OL'ݤ8꿝}Q1Ԟ;<q|@G/-IeJ$]ĂێkS	Uq|,yY(U wB&\ޭU?=Ko<}_[ⴊ;Aqwm	 ܀+'uWSO\izo!WhX,dH
+$sW_ks߃4tp ]WPVv`D0 8*pG[[ZtIbeg 6# c濇|5'Č9zW.+%wx\G_ZtKHu_?Sk(Ŝϡ⿊;6֤Hy
+'G#9FA'O2)<#QN?~ɧa~
k8tk:^*H_
+r}r?hy=v>I_)9_&w~VڗHE($ē_чkCl\{Y b,?3͡*15V:m4q	#OE',ƴ660R_
>6` rqZ}KԬ/naʅ	}k㿉WMwfWu$k2i,RQo쐀O1}AZS'tjժh~-mQ_aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX_#GwAݬib-'qǟ؟bb"f<-~ ~џgGjcėқ=II6s{+O>4:Mfk)h#?`﹏s_%yWkOgvAX>XEqGb]mo~Xx3GD5^''/o'oWkD+wl߽W Q_QW\ᮝsh(N
Yӝu/)asO%w;r薩uC̱#%?־ mߋ__,!x'W#׼7<DGyk)90*pG C/$KX~v_όOisD׫Ӭ걼{`0
qrSt(N #9>&	ե)|[Y;4TG
+˪|K4KD$-5/im=¯KZ
11@|][wh
sF/|%h" ԵgU _%@8/;+ #V 
hʶx!Rw<? g|22|u>2isl43[$1Qz0#*fٽ,^֩Wn֏2> <OxzUQ-)rI]9=kݔ+g7xgcLAVRz~j]w1h$xX"`H_<?
+<YT;>! >\h&u4eJ ȱ)ib2S_+g8,M9foNZ8	vxI9ab}H.e./-ס;MI>
+O^<uM7ěS@2\Ry9b$Td&x?O7%cEN}bg%} "Bf<&Fi tCQ'MVKLZ$gˣ"F9jx'M?.x_xM^H+P4Heg3)6=nrF5')>[{5mr~'xPnR͢E3j	gv
+RI
+돌仲c6KpRJP8$#ק|X_<м7}zN+TVHP5xS?/tO/_t
CO𝧄[K}E,U&r&eX/L,֡Q]9-tx	FxV=jSvemhp~ %Ѯ^y1A?UQTSOwu	
8q_Dj=%1c[ [an`-N"beK q|7OҴeZzƞjغ1b
̋"3c8<TdSgه phʞ?=TNi)D'|BśHw3FU HdǮF
s/񆿦SFO fWAsWd3#jszEo//K3JG/u==^#
+ t
4osᎉ
WZ9ez^fWWHmܠJ~[ae8ޢi;KM~CQb%	JM^6Z|=No~uHf6d30)7(=HkkG~GNuyb!c)%w3WלּO^|i?ͧ~cx&",ۅqNU66sM3߶-HΑ5ܶ?CUhie,GIPѶ W#7ztaOA~KN^ZS
o]u_Yo=;M[Iܯg+!e'
}3k?^87~CM^My2z3s pY8"m[ºߏij?!x;_U-ěj"D**  z{?3kxI|?H@w\5Oj
7J/Nw>^giΜWZ |GiW|)G[}YXn.~m!T xZi|܁؀9[x?~ :3V"դc$Q1=я'{Xğ~:x1^xfH(<s c{x^H\ESŒ  lBGp 9 
+n	q[O
R6zuI5OiڬV@td!odZ͋pafq+H4Tp (1+j4tocw >5x:Y>d}"~aIHVewf"fcYt *i8㕹pJD? @3 @ֿ_"<Ǟx?)j&"9o-؍
R 1z0,!{,M 3?po)_ʿ5/)
Y $&p$qa~<~K-M1 Excޙj~_ckFWs9oZ"}}xh*uj-ܭ/',bj:)7_-Q_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@#z}l7FURI&ƕ~1~?K϶xK³e2n
+oě{+` ByM֝>+e^].%Ԯ2{0<-Znl#7δ2*iᢴW
+y1 ~~<9#Zˏ
+ )/;>H× Ck?ߴe|w,E,>o22_{HWHy--_ҿVL)ԗbUQVNck?*h g]GOngN:qU wTխ5+i6W
+ܐ0#֤mV>]:+9O"⾩_d/O	dX8bvjOy]X`jrUj+gnwm¬@FV^?w5+}kBeDwEphHϽ}3g@f`WSg̻-:WSk*<Nyif9qyk~MFgmsj`q^mb'=:Vݵ־'GjTxX|Ի1vՀn:1ۢcgJ`}
+1Wy
F#zmAa3Y2mEatչ+͞ĚopMj
/ȊYdHKTP2I=+*,\+%K*|au-@$J>iwciw5qm+23|cJ(4<WM%`D&lG6"bV"~$x\PߍDZM{.,e2M3j
eSP/O_UC}}dײ?2*u#
+KZ/'6^Y7?fRXN?Ҹx>0GѮyAylѫ\6@ss\?W[u7Jɒt,2W˰*H9#JWxYeug$mB+yP?E7>򚴥&nӿ}(,VޜϴS߇^MwH]Rrdmm!!]sp9Bؙ<RDyLqPA褲:綩4_^.4 Ci67r]e)+@YJ7(m_?W,ubKGnMkx"XD=M6cd`"+Eb)Օ~ꤺ$~WL蹔VӅW7ݲ!53J$!x=*熴k-_MK:eȒ6ș־wmTm\3f[h<e	d=ʪ^@C࿉<;w<Yw+1rWx؈9$qҖC){:xZJ-{Omvu2yZrr5m;jʬ rjx~L/K/IivfIoDN 'JOntJY## $dHgPxay<JY-Oq6Es@B1OZk[~?~|k
+ 7 B@_G_O:7SX2 yn$'=_Ita{o IGd  d|` nȮq.$Ur+q |K9Gx͡ t^+hI争Yf=135\ 죓F|5r-.(oug#"b,5+_O` gNI=.{I[y!}I$I85_}KUjZ''G{j륾M&& 2u_wf;P<\ ѬqkT( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( CW~Wt4kV8">	_HW|ZaWO4 h4ː<
w`
+Ϊn.ۚQiM9ms~Z0If'l~#_h,ѳ*Ҿn~_	|_gqxڝΑw3ppFymnI,SRz<*Qh=ϖ?o [^oo~c'.WEl n__oО"x3;s+!:~ee fq_4J1?OׄKPVT$ݙ?O 5~x=CwͨK}X,2e~]rx?S[
[E}holjTG5[e4)cqgbM`1Z' .tղ%V!yBO_
8VM(Em33r8R]ݣ[]0+n^x\մfOW-YeyBO`& :mXi hih]HVSѥӴ?9rYaiCt }"EVhǕoϩxyBTjTZO- ꛋH"rnlnj?Ɠ[FW8n;X\p}W֡Ċ>]X:q2u?ԴB{Md&gIΔs{~ʔ*f
+h~/_B^9v qxmxb{)%#B >=F*-Cs }BW4I3W
ӧ:}Zj@қ@0@n9sL1e!}Jf'~><6>]xUҼ	^h%:ݼ\\,%#e|p0>.Wτf%j~"k%2!eǗ($$7bqӭ~kďx[<K r^HV3O=,,	 tpijVws%x̞j9*[H짍N$djJ4\l;7}7~ח	Q4%oS>6"]@mUWK[SNy#:~m%MDn$d Y&Xgsa[ƂpƕQKePc@$Ic>h:>6k]ZFkuoV[!IgTżoQ,eNmFQMnm_Npj^iJJnmk<' K6*}g_"$M) >jUBs?	ZIVbJˆXIQr+`&
~[xS><K|>ncmMc&&d<ϖ1WZ"I];Q*͵%\v<~U]+%ԝ	;ۙ]=tGZ~b cMcF:3V$vڂ¥W
?w0Ns_c"ytfÿ5K/_YEr7:y#O^Go׉k:א-a\ {gWm3\]yu.	ga
uˆYS0er:`},|<':Z>fZO>kZߎ[KUnF̹*S{o%aψI_Ξ=t/ekf\|#s_5- 
+Nkko յ+T?ڠ2ZN 1٧⍯|{?D\q0|1HٶI#s.e9vaF>
ӋNMV>w:RsMz&GGWρEg!7x)J98?z)R> ko/e;8W(*_οu_*Ɨ.5]Ȱ" &?c5 hw^!skΟ.h= I_Q*VxUNOT{[վcm?fNXl恕zzd~u=[I ~.n4D?jτZQ̄erE^{$sm	74-}V#0l62>ՍL
6ɦNq8~s0 eVVl0f;ǽ^KIw^?/7P̟E!BG䟚ӵ]!G#k q!Qꗎ7n+6Ot26zWT:~G?Pu2RϤ["yAJn(Iaa__4	x[C̒iHI+ף2axK`O#6}>U5B WxMOu3VB'C袊x( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<(Excnh,
ESG͍Ll z:':$\ۺs! '/  \4{M'*Y\1>~>q&¯ھMQLΉ,=C ~GsYVڼ;UJ~£QYܒ:|9c
弇鉉 ٫ׇY$PNW&ͬ=V߂".~+Z9G7JW	dU&MiOÿJΓ+s" Ek>xN-0œrDzq_p)/J|5jik;Y.rz)~&+mSĿtn6P[]_3K?|fF~VQpGu
+6m{?<Qt*Z%wgkwwZY[OR{QrZG'o3lW*<QzyCHelTIѤ}kм; 5*{%r0O־Y wŻO?7QK<<ղ:~3SG/	e\̥EK  >OZE7?~{Wx'Y:o3G7i[݄*M6+6W aaMkw!{ݧV6";w\}_ 
?bه᝭4TUJHcZϱIJ6/_Y"S-6 .PO:ď6Gp8
8_~S:WogTi.ƶVM6r+$lt+mNmbѴ,V"G@  U
pGLg~U}A`'Fk uи_.UdKB(sy>ே%)|OnJ(3rH" Tie& \Oq-ēK0Ih1k   aR(eǩ_ϿVJNN/[+էO<[ᦓ.tY.ԓ'}˿ ֹm_
++8 0fc@8Do*ɼWI0~kCVy
2M7+;N}t:dHm?	| > ~.B!K{(fV4a&?&mx^*13??݉$* `c6@: |1&6&]SLg xs]x|4,Sk [T/s!  g"ot6;Pm\|1n3zտ?O]]~|O=>D]3S
G8%3.3m@'FyZxBjJ~DM:)<   /D Ǌ6V.]
#> ra?PjGCQŷW0)'o7qۯzO<'u!qڎ*<	Uiۉ*~2OI~HrpV`כO?!| ?P/ڠۓ^ 'O"_\Jio&a(ݯ[=0zʸou|7
+	(N!qRs<:|ovltm3x6Aozǯ=?߆|2 x2f~WEh.$׿4Ovt3i".G=k? ZOnPZv+ۣX4}yi;SVtr~;rs[I}N8[Ĺj})W7_>/i62o
+32.?c^UBMrǜk 	 miBZ P 5tqӎri:Q殞UOԟйD-]ϧN$.1_~
+ƫ+żxP`־J>*b=.EQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QEhq9kv Rxs)GՖ=&$+-ǘO3ֿl== ۫ƿ~ #hMG2[h#^3,O 8
Fq.>բ۵U :5a{v#qWgƋg_&"ꁰz q 5
<)xH{>4r9#(Ow}?q!k~
+B[^ ntB"%FGGFkx&2չg^!R¸'w  s.W?fɐ?ֻ~x\;:NHL *M/Y4#Vۏ5zGOJ:M!LSiuY_OOj6Z;;ZJm:1g6?~	ou%Gl>ޗ3g,tbIIA#Q QZ`p8_XTNGOjcE +`0Ig,[ГkH.Nu4l ck\?U^7g*PpٕD+ԍ_VnV9g
+'z,|H=ZYk>q1 .}5[xZ]FA<uR'%^'n5:?+ڝM,׼翽3?1nUW7/>kBI"ǎ.)dfvcq #J}RO+/ C
  V ub
e}5CQAǘ>#A2b?p_" #Jy% |PwQh<8ֱ/?ਞ1Q8 0p9=y82Tƙ=Y⡓f[,5/bG0q]%T 4R 7(e0-Uw
/bRBwz_Ϝ_|FnT"cU&jdgoMw{sZC8f/L4>xƲgU ࡟etdu
+ʃGM/K/!UW_u\8K[r\TR|SԦwIM36iOvL< Kk3Ǡ|9c#{T񼰾['{X 3ƭnz㈛54<^pa0ǽta<U8*/1 3"Oۗ5Է E
+}2N=H\hNC[E`OR+.x6T<g|Йazz'
i{`G꤭WY {d|A9 qr_ߊ-|AM#UYdliI15>$,xщ9H=/o$un7&H~Q,8K:4y]_̏SqjӒj'F~C9ȪK `#
߭ mO7C[Q۴
ng&ɟѶѓv_  jN hV;Fap1_{4pD
^?Jڎ1I" #[1*Had~!|ym k* oq[_+rKi7#*
c`/͋EWaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPM1JĀMqma!dY\|v<3)I%v	6Ɵ+5Iq?n&vlie·
+$W3/G|i_Ş%K6\4r~rǦNH   
+: aڦBVf%+#e"_ED
+v+o4
p,j
+3ڸ7"_?=>]ڼ~|2c"u* Tɤxmf	oz{J.#p WZG"Ksy
??>
+E$޽'?Wj8S>Ҡ^"dp}lMV_3q9Eg85y**8 W?O dۤ爡wdY4)5ٮ$mW`&5g=C?+aiNFGepQ 2YFݭ)~g79SrZ]a)"AI>]&OoqfOg*yyL,嵏GQʀ.nk>)PV-H>=0,8J~]^ms5Y/ (U%?ZKsW{xc0O>T/ޓݙqy8VY1$N+([ ||UT\!G m`<恁xO
s;;\Kx]^Nbma']) 9ҷ>hYK}Ͼ+ӥYb0\mz}MXТV?7I\V8?^#%#MY .-t`LζK
+ݩO3{+>'NjFԵ 
FsHQqwko\.vޠoCd?
+5z}է'љ_ʗ1ՙ5ˠ^$rZ&!tk]_[8p<UὼO28ΰo3*.Tv$cԴ*\/8ָ{8D	&n
+1Hr:H-.B#pWMx_O$w	*VE"u @>i>#dM>R|v"U0C<H5N$?Drq [ƣ9eIKW #xSq2 '8Vn4M+^^BK>s=ΞKUT]DUl> {qNz>kG);A/ks/9Ϗ($'ÿsCI_]$MI<,
+=kvKOI2eS
~oMyld'$ɦ~vOV
+*mZ[ۼZOXnjP5idʂzp; TIPK+gcH$ gkB_w"$d`t?Z (&dei?j Sojeo"y
H6R?+ +{:v?'p5}#%j{JU;69Q_Ͽfu_$7Wuk&+SӮ1^6 HW5_EWEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^kkO!|9q_hҹط<E
+(<F1M; O?<eaW:53q!0>W0q+'ԢGCm-cمS1={%ڶcxk_vGo~֕'O4Iyq
_?i_-}-HLhW_>|D/qyq&%,Oioʊ;_<=jj(Vc>Zs|]X{}w^ ^QZlUz9FOEc-E Fs޹#\!RG>TU!:72I2pm?W_ؼ-nηS ) :d9C#2\_m7SڿG2˫h 7~|gr*GOaMM^=Y.Z$7ɓ$N:wG2V|Ie='=+O$e(|WYu~r~ݿsƞ)dTO
+-l?JuǋYUcՖKblQs\Ӑ]^3d*=񚼺01	D '+ѥn3~S&}-D\,pxkG_ڹHX\ɨ3- Z$KE2Ο*9vW
Tnґr	sBGKeklET>F~ȓVGfiV7'!wc5A,L
+8UFqR5l	8zrMͩI{)|]ZW$
ǧLt|S -d,KA\̨#8$n9-
+ɒX$+˞6'Vqٻ7uoXIy#(+J]]+۫G\+͒9_5Q,OUzn9ln	ڸs([jK7|`j5䎟d
15pIk@!Kݐ0rkQ嶳,9LG|ZO.uǴ/ι8Zy
+4qE#W{TTǜ{s-̬ Do@y!QLjf XaP9L`Q1/dHۤrϭ@ޠwI&Q	&.m;Igb9=WШ\ڜ;RHHKhs!zW 5Y<Z{7˂`k߮u-H,@gs_<5nI]i2Uӓ_O%LRK;UVU#߫s򢜤!i+?D}1 _~ӟ>&>{J WBRY,22 y;E'Gu0Z
F*WR~Ra!$g~?QT'fK·27eyiKZFmlQ{b s|%oJ/Un\0kH}+7,_Nj|k}s2Ul(B((((((((((((((((((((((oFҼEj5v+Jl	{ 㦣4٤GԞ2-;t`'n:޵W  s឵⮄5msܨ;.`~ȽB2 _=Yqyvp<:/tŏxvp}kSu8̗0Y N+ >8~ZƟ}ŖQu?v .[l-7<錒Z *JKu$zW\=!N'f1Lw?O5)q\ґ#ҿrS?[ۋ^?i2$wյEeQLz?N6_zLoi96;#^fSz <̝,=h+I~CNTWQfz;V0AIN XOS?!^gܴcRf9_,?ָ-l~uܫFbmW{'?*i4
JU5X5OӬ"}؀gN+icㅧj0l=K)hNX  :(bg'8+`c_qG}*!G5i:18TS!A#uu1 TykB}O>$tl;{qo	oV~oBr^|VEfOlOit]\Qm!PȄc_ƨ`Edt,KlLcKߪ 38R
+0}p[<}*#%/, T3jWG}_PC}"Ebs-~uՒt.'hr=ZU_-`ל~o,]> 
+~l~5[jObܘӞO[mNb	,lrK1~URysFmyXmp&0쪇W\E k8+9
+XC=d98
i$1+ n,XG8	$ۘcu8ox҄"&#$\IB;/TTGP݄q~A8?#Nnݝcq
m!8n0tݨq'#soq ak ³"Nc20PJ{'!9H8QխcK!S=acjw=ܤ˳`c@?Z_:٘|~E<dk<$N'E)`\ >ő~Tl8'8Ӛ85lM{9RaǤ #84h<E^gIIͶ\7,
ރl~32q<;hTdX ?
+ 3}!iw'NqkG٧7I3u#GfyӼ?UѺgKXvVZm	mco[*F* U?:P ǵ-~ed~e(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+B3KE r^8?~$x[[O7z
m}B%3ف5. Jۯcz/ƿƹ$xB2]JrKz"1<	2W 6~?пLBՇْ'.VQֱwLf5hPJ{Fm縌I?"k_!ֵ?w0 ^{v9^S YQAsQmn2[lҾ@o\+1du]JrFB)lQN~|{BRn+ #b;Cl(?cA^Q>[#BDrrSPINաڿV5mʚbu\󨗢=~I
+]o<li:UM
Ǘh9on3O)-µÁrŏ/IdeN6p|NSg,^_OICFrim)Q/˼(#H֬K52Ēs}+V
I~u 'ӎG0-R Psz\SmYIǧ$5}+]2='I22ZD"5<Uso&巆@>gyJ$[曆Ŋ|__tz<ְGL69+㼚:ggj6!}y& <!%.~'[7P<:ےY3ՂY\iKhދRխܻ]rRmXǻP\m0رHQ[ջZWxtO<V] ExwsAX% V_ZYk-#G_hZpg+=i	} ?_ҵJo*:%vsWGkxQ"#$K_(d']M{txkWC"8NJ죚`Suh1n>^eqjr[$VK{)8=p	돰A#Yo>xt˘$̎0#3&Fxb[;zVu8uSd,lG1ys+0ZFYˮϠ=)[-d,x/8z{ÚEޱs[Lbdّz|w#Hd0Ŧ]JZI1,Dy.QR*[NOc-_ 38@F~⋋{k\`c:PΟm
xaBSҩzt]mƩ2:<ǵH10yѯEG-l?2RsJ =d?4,ɻnnxcCq/4=9qaIY+5Jp$rֿ?
 +9VRPnZ! 1Oi^  b(V% &B4QEzQE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE ' ?߷HAXf1[+O*MADo)uLzt?OǪW~$skͮ6^k'X'6 ɁθYp+KC㑕x+tҲi/#:<W\WH.,S9,![6̭t_	|q\םY	 ?KDyذؾWU|<;o?xX"g$Rrc޽m>
+x&]K] -<h1I;Z_,NEi$[Ǔ~ //!7(<<f'·Zݧ<7ّT9\Ws\&֧C)'(z e?ho
+x~J($kx416o#qnfP9|#~
_a;o^XkV|ko.e%@"~ٿ>x6*׼5+]BAH98  J e_ڻ<8y h.=;}QDFϙV<$Zp*N<wRJ^pe8pբJڽZOmɬsn
Xb?k`xw6+)Փb_#[x^xKvwztȫ3xKqyP#zvq8=d*T)-Hgz/C炾|_5/!XtI&xy_t
V<:¿Kګ8S[־)%ޓ.hxѤ1^TL' G߰W<9weκn|.~u%>rC* ^FOͼ+|+ᗈ>
+^'am <y7ײxZP]6KT'ibkͳ,M)' eZS5 G7?g#ய|3\^8xkB].݊\y3|5P6p;ů3.?/+T-+i_lWB+7
+A	̓"; =q^XU=k:GzAt2KCgoz MmO};Ʒ~ͦsemmi	ɕlw?g=ǪNm3uPz ~ѰI%eŵĈ.evȶ]65~Ҟi/&q咺?n?I?
ߋ<]KZoTK>[My_ WN/
+~ث8l5+^5ܼ:̏!e\1L?Txu=J/MLQ_$ۜ۟X1& 5_񎝬[M&M_ZV49f6.Òҿ)x^_3Nqi_NӮٞaJ5^4k?&Au=XP {9yB98Zb/Pf#>u 'mZ8R5f<tǽt0dTb=x⿽8&9' Cf(eG>A}VRH0Iy-ϖۊg3$o}eanיbHF3Wnu}:Cn-ʲ&,0>ǽ}׵+iOj~vb"Vz8SȯlykIy+Ӌ$Cs  G߃  4U
'[KK{Iz7RE( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +E>% iu#ی4ۄ_DW)|Ch,L#̅fx"i噴=?ek;^'pⲎDDT'Sx{\fU!z6&7tOz[{WxVt }մ;A=xe~UYw
+WԢmZ/N֑X)m2miF>˯)I{2nUhZX^C%8^w⧁>.x_z6JIlpr3䚬1dU oxZ_ ~	iѿlj_oxWCn4I>L^C%/Mѩ)rLcV)^#_o?`W :k
{Qk/ m
+%ŘH|Gwv:摭m7]ŶieGg*K 5cq]xg!
5u/Yiz]@}t8DDب7 l~?A.WqSeu)N0)Ʉ[js۵2
+Vj)4}/ɣj`}wb9oҒ}Bx#WI.UUTd$ $+<|>y|2%,6eHt,(~oeP76N%u8|YԿg/~;;Fֿ+t3Px:$y
+C+Tdu8sF:n%GCާ'gßgu	k	]ě{v Y2x W: fֱxVF>}^) 0lqϖT-uV6K[k?>yx]g</go65N8.:%eEs
+LkGÿD2Ķe*B#D%7G+'b=P]tUG|qu?g?~xWmm<ox縖ioTκ	,r0DB=f_|6Iڔ6O,]BePé5*7cXY_Oqul|>H- y!aD)_b	&lcA_1x}3[ϴgxQpc*0H$ץfJ1`\*]ֽ^n ?}-?KMkڡ㼹/-VEYwLsac`8'$B>&i
+ǟ1A8'Kfֱo|;ycwa,gr0^jn7J_yzԝE-]'~N
+Mn_|5u̚&il-UQ䍮 sC6l?KFS.zg~o<uU*ѳ'?w~$կּSy\4> f9'v~f V_]G_mnv>rO^ká1UG?kK1s%cobdhJ&Xu=xoM6]ojƊKDE|3A
+z
+>ሙ_ºE8ULhOOKęvօ #30R[[=UVEWVqY+,YI*mc,*_yt=b&<FsI~="/*R*x&*+ oNxx6RDRQ[!~l\kk5mCT	iJł'YXҴ*bjT6?
+I_3 L3& 	<:d-q If3_l}pk?ɽ|Oєx×Y J:(((((((((((((((((((((((((Ux?֤IAhD?i?<;'w4`#;_0'
+u]
+KG.%w(COު1L]Mg^+1H '9<rx?4x9\%_kK{u8x{:'.84ff$cGak6N7_ +u b80VR$6_`R w4䣛KOqW.Tԋ	f
+s1
+ I8q^:{_uC$Ghg@|S`	 dL(Օv$Ɲp](qK,NnkX,o^gږnm5K;-nb˕<#6YfQ.׈U[(kWo뭒u)8
+3V.Mu;ktc}\ʱ[i+= X;KzK.ís_ IUT}Jj|GQѼ9o/<`]F}; , i\yk	87m%WNwnY,ܓ+o%ujwz>$ũGY7:j%N[pTg';T"HAiqZ!N/^{C5̌?2)!%L`	Թ>DcҐ猚_ZiFsi)?gwc^3] >
'-ϊj-giZ(Fc,lLOO2cwy	GiniHRUĠEnܜi St] 'i mWpKxEq$s(]G7[M2yR!^G,UK3$_# ~  |fP׼gg[:"<^"
+j筼,=GMKN}(y1
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+(
+B2=
-ouG9|/ X?|G[[5P~6kt >=
+6xv.EvjZ,
+kPֺ2$W5U Q?& ؗN !dI4ˋt/[ !
v\0b']5Kp?"gNOCYrFaʺGN[kfCJu<Ē(I8ַ@
+JTsi?)UJ2HPr+hZF\F&b7/~;Nts5¥,͹%9'W5W:usRWIKr3GRVS s#º9kvQrrt~.PŴWmE$R.F@U޺qF#zOMVƺ2\ ]^MmF9.bivIqomiir$]ąQ ,}kpCuu4Iч6zʖvd 㐚7ՕS{#go},w<p:+RN+٫<z|+{㮬l~|oOe%DkΘ؉mM #VMŘ,NI'`bCl]>
+|go[ T98y)O5m6}p͏s5d .3w`*2$e \x3ŰG	)3 '."%`cToǽ3[
<kB \xTej
+,Pgq0W8>7K MO:}j?gkn[M^UWTv/%Gj#?# fڌ {2!dof9|- <4L>0\2z]r9,Ey*Jm&z15n)|$2HBƍ+A9<Ŀ
_<C?j3,:m7z,p . k~U 1H#!{⦷hq2+v foُBm7
+Nn۩O =|{W? p]-Y5  *?@~md> Kcn5&82NYw՟!x~.~3kyeʠ]UdWMDT*@?
+ XԴj5&ewyĶAV=A_K10cwT(p^U<6 ylGpF)kg_?~^2A=bz_ Een}U{_X<d1ZdT֕
+ҋBEsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@ ȯ:
~	?hO	
q)s?4R.N#*W@W' ~_S
Drn1h՝l{.G@ W 5~*Ǩ0#&|+JW}?{Us0?
Vqoo$y4HѦcmnb:4	h;Ǩs
'ňkO&{f	  νM WV|TnbV-1_EA ъž( Fr77" n7ßMgOf7euxvAq}x]G-ul9fD`7WIP2yZ0?fךgfTSI?&~|4\N>?{ |)R?<|=~aP"GfMo>C㬥nbHv#AyOr~ZM~'-#|A =?m_·Pw~79V?
+NQv~9QUkÞ~a[
+B#/>3*V"a:^2t7qK!\<Ӟ-w2Jd(?H=cJOFC1&3MKB/?J𖴺u`8 ͓!H<dtEG<˃{$xu[9̈Čyv[tuK|/h'5I!do(CiVoNsAfKS©Yu ЋxV#'^~<jz/>ҿL.?n-+1WIq'Soˎzp?KTcJ\gҮ!O{~5z=1n-$ ^yܷ1'9ܙ?jii,4vRmI;W%yo|/
ԝtqfbLIݳw_N{W{4xcOoz?GI'+$ss$
+%*g]
0"?,`cֽ'J_  ặKHr6^⧰yh(`sɬARDsQOjFKgy?KRZF88Z)1!!GU 5Y9^6/XYSc>|aѴnO)hQl-Kkz I؞ΧkY'kHtkIma$eN<dlW`	1|'-M3^V؂@W#jYmg?Q'|6.kAoz?(O(((((((( &Nyp	'v S06>53޶	qc^Fu/,W} ]G'(:e-'K?^wu5nx\xg6րfsڼ\ ݨ_OZ[HCο3^T?ɗ*z)}}U _g<\wģ nR{E|I+{~?)?Ϥ~ʞ1L~?ypnr  0~ v  
+#| 3)C3?-E.r8"'5H>+A!Wx'Q%X iog dxӄ3 dqU3:v "g	1=Ij1nb2K={
+5[fjTM.5.O SG` a{wwkڛ
+QYԼ)▏`:9 {Wh7L><ȋSo0|\\_UT,7J{3>9g8xJtf۝i(ѵo3r3h=i^ }QQE( ( ( ( ( ( ( ( ( ( ( ( 9Ck4xFEI1J>x$?Q^GZΥ5%i+7f :|a+m/O3W|~%F>uxhx?㶗TIdLc㩯98捁VV> SgP?ix ̼'cL~gӐpKی9)8bӭ^_~<u8K '_
+d>#= 
+^9At7'cvߍ~-sr|j9HVF)H9z՞+	rX=x+^
ӕ0Չ"JTg,kOHB\o_v5}&`G;uZmjs٬(b%3`jZuA$H6x޳;VE `?fRD$=Warƫp[OL׳
+h|j~Jn^A'
}+ɯ?=.T灀?ΛB6㇢מxIw"A<r⦖筀
̅eN  ĸe)S׿_1rv'"I8cZ?V2jH8&t_-Eqd-X A[7605x~HI0G{آ[pFF+ԧO<QՒg-ih'Ti6~Mbьgj奡F9޺@Wz1C>x񶐻&-m _8|<߉go_?\kaŕ|ȭ>̣#|Y$|>"xbE9$됣
+~SzN;W<e	a+JW|U:'3[meA="0rß'w7]~3#V/5=@?GQ_r濬[)X8i]SKrUgt -Q_DEPEP_&π dE/Kt{?:#$c~ M>Ǐ⏅UMBb;؏@m"MsKMpFwj j_.ԯ:6Y pދ]UҮӓǯ_p_A' ~S9Twb=(?m_ ^,wm{bYd!|WC~K ~2nicfY/  5Ϟ:7@>Ɠwf9-ߕ yO [|:W\`.;Fݐ?+)ߋR@ɮ:'Fdlu
+qogk]kTXbz.\c//YJī]"vHPG(m:f|eBY
ZVW7H j?fwipsO9{:mxC-z7%' F|) pdßֿHf-7:|{YsPxwOoG]О+5
^7UYraV
+2lV6?|o$|{ȳ'tCVM-Sݟ|v;e⟊ZtyXceF|B_Gv.=@IMGN/+K"9cx|qMe}/} ƯF\w+~]k-|2K )/3)	q^6m5M>	 ̪bk% SK9e¹u<^eG[ᜒggk
+̵[JSշ]Ohc췬iG=+21,dV'u}HrFs_]#O%E1g,N ?WүlM:^~F6ʩe٥L61>/2\urʵnnk+-Z#?mxZ${05~8!cގY[EtGAW՜%NzxY9A$HcW|[&׬՟:8Dm|08WÿVב-YJWxL^&ӾgK+|(JN.Ŧ?q/Ԍa9]lך?ȜIJt GOOךg\]YOR
:W%)EK?l~T+Όkv
+(9B(((((((((((((0 Py@	'|y6h:WH#ksCQ>2FZD pzK`[
J]?Wn$Nk#r "VE9_	m|cC"bFuO|_
+^&nSn
RWz=o#{~"MA. I}u
H<c d>ze>gF_gx1GnȤ+^)N6?C,6Vnwӽz* 9#9%,UH +`cQJ	 8Tҳzm"&˧g,zՅ Q+c>WIӣ yYԥpg3N;8ݻiw
+Xmyt 6=Ƴu]gQQCi#OԢvppaN4iOLf
vs^ߴA{wgtȥ-VVs-b T5S\p]P7v J|([^ r2JqRzK"hNTNm㧭xX'P+msw(,r8jyR'<IcS+6~[lϧk<C>#-.b!՗ c*# Jֶ5 _,PQ${+$_\zW	{`kuUhwjg?c>+oǦr!|QXy'S%ƺU>_5Z*ijU^g:N'Uӵ7Ot{]OJ.-!pD]H ֕TI5aEU QE VnG:6<ym߿T :Ң?*UMveR)p<aj ~{`>l) e)@範ύ>5&L4yKvd}q_v0K/[G3*by@اO{	[x:_4k-7Mz5ϖ[M_T ڂ >x㾩)T-
͖3 GkWO?)%uBɄϭ{/
+G ~m%Ʒ3IPL>#_'߉gGxZHA֮q79t+mRTM@WD
+" ^@V8ԅA  A_?uz'W;
-d
+M ~'8W xo'񿌣/:C{WWww^2 "[O▽ǓZ5i±㕯׿!?>-ݻ D/ .h~Z+ ԘGW{/ؗ[mј@,u O _Ǻ A_5ͼ+cj+W O{j= j_i+ }  m_яI?# ׯK1w IGKU Ӆ) MoTxs'xX^d.ǭ} |>g\ҭD&u q	5R: g  oC A	Iz+K{+UYNyƔ+JJ-x=	 f|u=$q# mWG
+[KH#@R(&@ ~G?PR *uB)6쒾s׆x<D:gʥ)IGSm/9l O^L|K!#[}>C0cC?i&{Oᗁ<(k:".nx0}wv|y}c ݓ󎙯 'x	j^ݝ+RdUB:`+'qYmJnC/pdojrFn0Mzݧ{Lg~!>1xouxc/mhA1_V
+ 9 fz'|3/n]_Ŋqz ^徟g\8P0^ W?|pBxkDt$TGx0c|`)e-L4UZVW; IN*NKԔ.KǚkW(=;_Ӭ<t]KP76?x;||wwmpjrP{85~Ǳڿci#QԆC-/ Uw8%~ U=^'u*Ó-5V?Tqeas~1:|\ܺ{/^A~outoJW T "OeRoNOW)(g.j/AEWyEPEPEPEPEPEPEPEPEPEPEPEPEPEPֱu*Yӵ
#V$GqWF5LuޔmB CdwtoSj.X܇'۾c=gx<Q#i:6!'
+'3k:?og׼9inQ?{dO.#1_uBk=JNW{y)*H Pk0Ⱦ]vZN~A)?z:?GdKh䐸c+^1, ʯ^(
 ϧj*PtxpxzWQwgVNHCJ k=]J$h1 3^%Bx3,}kR(cY3 ֪-Sqw<4$kg'@YvMz}iB,sZ2g$-BKKC}+Q 	)ڽ̫ycX{W#W׭\E;@`^0l=۱RП7ro_(EB#Ft܎ͬv!>~?
6;ŴwVyX^2GTa 9ӑֶ80)-cV58<J`i#GlY1Ы)E4y<(]	9>'`^Ū٣2Yq'>qGmf(_v 灞:$ąW`_+]s[&wMڪO
O>#_09o<u!$F^]5<c:vZAȯ{⿇u
*]wD4oX\:Ɋ\YN]%B:*ֿs[kZ tW]+6Q:2ڿn~K:8_\zژeOGiQ@P( ( \ksx*ڗhc
+OLWj.^[8 ͻ\chę7 &[*/_j_e vu/}_X  G| 6 OkZ^}"퓪`ު'MS ~k>&xOǟ|+-gò3kwr,L pݖ w~ pW uğ!ITDh[[,$$v W k4zKVc2 Q@t	>1?!` |ݿ  j$M𯇮gCe=؎iL-$Sf< + f?X{dsCj%IΨѱ C po.!|
+v~6.H3_kzSYeg03X> Kqc~>n٥C_FZ	$jǏW ~x~˰y1q_Y8\ zq ~)x d~! &fF*o?~{D>`?c OT߶ ݻ%~|<'?|Sw.VQogr:
+)zpW|ߪ:c0fQMBI/v}^ MF
 tBZB}~_<kw|ǣ_nF!$nv ?Z #AƁgfg
+Dfo3JLFJP$:Hw~#|8% Dѯӯ&
 ?SO_^|A|Iug@";Vr,<oO*4]zyӵ]Fu
+Gһ-H6.O{iso8{N]Uwi[ rx ľ 6ןK
++Jx^Mz/VSI_Dωumj[m: P58  5 ]?5o~<K\Ź| 3%3^Ip3*f_c<=30W{yᡯ?"n0Ӫ>?lg/
+?eov <Xֿ 39i$Tbz;1<{ڄ4}&TYf`+5>vskA}紸W<<hJ
+rNuSYhm5J\',UDb=kg:m'2H
'd W5CGN=#LGquګQl(>h( ( ( ( ( ( ( ( ( ( ( ( ( ( )M-Vh}GZ2ܿ4՟
cݞ -#_K㢥ҩoO5\#_h >)^xO_{9i'ފ3H+_z̦8;zCKe =G<.Ӆmq~|7E-RҜI_xb㿁_ߵ͂%LھoBВ\+uݚaeNn2VhR
+QwLA7Ty_
++`)LWњ>-!l_]Ro(lAW~"V9 A^\f=(BgI&<q]L*$15@J0K"^h##ӏS]j\jڲ{TVX$^3Z,o xݻ3d1Z}M7nb;J넬a5̭b޼&G1h k[@/<ݵPxma,R8εԨc$jNCb%̎T+=n	a8*Ev~{Zе0yܡgxϯoiO:QOA\̮T_(K3Af2'sӜWx!`Rv3R3 ]S!J}y$'VYb y8wLu9$
%ZLYXv>
w⾊:%_GRBjv#+э~j;RL'7/8_js=b`Qv]ϺF6xY/aS5kxkTDNGב؂+	\/֟QmY#{qV!ltK
+qg^pSf?cfSx ?2Z((Wo|X?g_2IugkkV4cCZ!s_ψg+ˍRfx<P oq?Rs^m9@G8
W7
xW}i|VuI=юO5Tc 7F!>!\|grbjhxw	_gˇ#p8sF(lZƳZx
0M׀f9!>G 5D_i0-狤~Ϊ̡U^yNg Au'mmg$mv|
+ 9Ir`;f?'"oz-tskIx"'5uR3EP[X>j^:0,$"mzLOg˱opX5UE	qNZI_N+9߂?W.w>퇟/a^=ڿ){z?g
kwv> x{+gW<SjrٱoӗP1n-G6[x.*onmE&q_X[ҲNJճ8?hOUҭ.#"cr9Ϧ;W%i>hOJGt}\vs<xiW\S#G20e%ôٟ=ѿ7QEZї*+~y_. )h/gyvF ac0~7:?l߳o?%2IKkmYs dmm,/s
+(ժt]֟ уgBPǖRGV{nc .*J-+:
̉kw<rga:c๟={¿ 5+xU6-tesq_l8>uC$h}p5ļqr^ އᾃKS?vӺ]|k>Cſ$w◂oVZuRyY>r$+9 &x#K ѡWmD-S ̈ ;A=35	-~kRzrEx\9Řܱ8wxtW?SvU VjA.V{
+I  o ? fK_
(ROc9f
+@
+ӛ X[ Ɛ	eKx.w8H`Y{o _:gGz-	Ѭ1utd+zסF;?ʯhz#xK.ڜ\eԒv ZJhZDGmo#+qI Q8>*Aҿ Vjҩ7RNh0( ( ( ( ( ( ( ( ( ( ( ( ( ( ( e@'SR@w/ K<>ORYd }v \@+_⥆xF
p~\d{揦^6ڮyo%ݬ˺;dB2?obڧ 	o75	]Ȅ&f>\`n~QZGcگN/ȒD 
+Úm	 =gDNg#"uHpS5hW>pf|9?2{Wn3=y=iDP:O5z1FcnWc@h0%B¨[ɉXʠq6zcgzBDb3A[5:GEMrI=7e*\~bA+*,YԴ?,3JۙrҶ6aU`|IW1RbYwןJns pxq&4$\U O.tԕE<E*7npJX@<)S# K0#ۼ Ux5$B] f0F8,Ȍ]/m-(.$s=?5ό/ũE1Ҡ^_JK(n)c<w8WTMhѢ <~x/2g9%f/>?mYm#ʄ6H`O	b7#A k+S
ȯxJ)KC*%aC^>_x_ 
+j_u2xA͹NaԭupzwqLbr~䴒ׅXHRg+>|q?¿|Z^aX\/J?DlE{6y\QU ;FtVkFŢ+S ( ( ( (9O Wׄ~$xKB& e@%k犉IZZl>&8jvkѭO~/?tO % ~^"KX|#m	>eĭ~j1{׉SrTc#\cIR̫+~O? ,L ~! i?aM{RkkF]|Mf5/E=9.ʞOvciK[ 1+  ?g_  HV6S >#| mW_7_2~_= i_6wQ^ 1s@M ')P#<֭W ps$ S  ?mýN@kܩy1k;szWD8O-B?q~|mY%S4_ (` i_mCS`O}l&p5izn:E8ah: h=ri{׭PVEc\Jy&u۞NVQE|QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE .>$xSIo/6b"L}mm%_F޿e7I<7P"A&;E)QG^:ZO@!Dl
}
_#
+ ~ W[|:oNUSL.vzטx+YWkYH [TjJ֨ɱՃѣ/k1<8<_@Wr
+<_ xcS]D䝱><5-Qαȳ6[cھjQM)+3;VY-Jhd/}FOҼSG
+}JM.su2 wg|8oCoYP߱˜gtzfH͂
+-86|<Mi
+W#;]ЛX0e)#Pe W;IXd19栰i`k\ )0^H$8iUSZ)ٝM
2rSd-R"! =^ccy{f2LϠ ,k+$p;Q<DОWA!2?^DemeðP20=j˫PV2"`E(2@񧈧tE)hbksg"|I9OVT ,~b?_ʾ i&rF'G_UYȡ׌Q־_ꏮ3>RjG-w_>0a}%G|  cWkc{mZ_][O8teYXpAE$ }N[E_vSWK/Uvg"|klU^.$ gӟ,u<-nI, ^	UWƿ?)u9;EPEPEPEPEPEPEPEPEPEPEPEPEPEP
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/samsung/galaxy_tab.gif 2.3.1.src/images/samsung/galaxy_tab.gif
--- 2.2rc2a.cp.src/images/samsung/galaxy_tab.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/samsung/galaxy_tab.gif	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,21 @@
+GIF89ad P        U   	+G3:
#^"D)k#$R$K--r*S+c,[.k"3$;1^)B3t4c4j5{  !9  <!$!:k""#";|"=s$+;$/E$B$D%&)&Ac&Bt&C{&D&F<(J)K**,*IB*J+3D+>_+L+T-,'-.1-P/T1=S1Y2242Fu2\3;K3A#3V3Z3[3[5@55C\6696Q{6c7b8c9f:BT:m;;=;I'<]P<c<j<m<q=?A>MoABDAL^BIBjCEIDsEVtEvEzFY/F\>GU#GXHILH_H{JLRJKVeKNdNeNlOmPc3QRTQeIQq QR_oRSTZT^dTdUxUUUVwX}XXYZ\Ym;[\]}^hs_`c_m_xd`r*c^Xcficw6exeefghhjuWjklolclmHsm|6mxmmnunppqrtrtztauwx|xzjz{{|{|~|g[x_݈ӉBRݗ:"壤٪'&dΪ곴ٴWWWܿɱѺѹղR7   !	   ,    d P   	H*\ȰÇe4/2j(L&5j$ϜpRs̘0aBI`#qӞ=z;'nfu
+I/h"U!:tXzPZC#&&O>uR -V`ͪ߄%[כּvDBSlmY[@}ޫ|WW955hΙwڲf%GՂ^:V83͒g62]FlwnTS!c#˓XCŝfQ p`Jj{oVֱgo٨W;~dZ$0I1$p1!mG
+וvddatx	)(b
+'K$r	4E(aMڣ t d.YB~B/@FE Q=@Axݍ4hHPD`f
+ 
+(pm^
+)g|
+%b%Ƙdyfi@bII3*( dF駟
+fvYOFF"P"Xo@ Q0
+Z*DSf&T+B|zv;`%KlBf 0ݲ	/+ݹ;"$6
+/	<޹@(.b̐d\<  qG#02?
Cq4-
+i\O6L2pk#O0K'0 
+x@C- dB1pT/d5`0~p!,&&PĐ6
+lEB9L#M]BS}Cd	A#s;Ck0䡉54Wb) $nzBVF3oPBKr<fxR-lH9(bc.0o'\  Atw5`@D@bXpcCPP9L<E 9AXAHFd 	&ъt0c ~w*AbP 5Ax8HDeF0f
+.@>$$(:qi$H8ґpPB G9< 8H <<*`p#|'Ѐ,Tr.!!m8hL	+I$8HchPKLiG;&#x @K"I(d+ADP22c8׸Jуth$.Ђ<Ġ:HB\-xqJ@H):v@ B)(D;|RL;QK*#' E<PDրq0'
+ڡbpjJZhx$41	``D0檈5F9xzbX႘> uaD	0>	FkH+h
+W@5Tk aW 8( : B$(a
b  v['0a`7(lWYB4Ґ)L
+Sް:0z@`7,z@_=aiW0(DjZҡ=!?hp  L
+/MGA CCrqy`+x	He̊˘*9|
!Qb/80	PD,PVXfE	Ȁ0
j &e={8)`	G9 +r,o+/&z|e"$Rc܂(@M؂%,N;"{D(RApB&hbb<@,<T")E'g:n؂-
m.H>ZW-D͇Ox[5`Ldn(@1miS/E(߉Vq6ao!HA5x7_袾 C$Z1eD0;H5aP8W2L{.cv?;}ԧ-\$:PԢ:zԣ;<v?j~Nӭ{#jȻ쀈E1_jH|8H;a@~b
+#BP~!!;@+V+AXo#<`?4'tx
̐ ݛGXdoB;	O~5Yp~֑(xH`
?}7G<j Z@~sχI }"*(G?}}~M{釀B W }C`GN #{4QC4 0
LȄ}U=u!>! ^0_(J؄NjC28?@4AC*F8
S<{C0D $_sPC%a^XHWE4NXD0H q|`*!CX؄Ǆ XDp`& dҊEHXL{ B`!Ȍhȉy(pXp@{EHȇ  <pBsx(i:/p p P X&(?@_gy "e	9ؒ8(/ 1ISgaД8EXp9EPVyEZ	%EQ@>{8y4.4RAMّJ0pSJ@DEpE  @`'/Y7c @   P%U$!	=UU(d5.ٖgE$J	i a$ҍi
Д0 d0@ =.m)$MҔ
c@SAٖq'D96I J0s 󈞋I5l鑒I Y%JX0p6i . E  h^ z!B@2$0@  2J93ISj9q1*B'K:G! PV _&RQ* R#%@bs4fzQsFycTQ#Z$/3djj+0w>Ǧ [M"<UB%m]ssf*Wj#Yr,Z#
+!%s4#zZj	쩫1|0!! ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/social_bookmarks/digg.png 2.3.1.src/images/social_bookmarks/digg.png
--- 2.2rc2a.cp.src/images/social_bookmarks/digg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/social_bookmarks/digg.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR         a   IDAT8OM
+07FP@t!p(.2$m:%M״}TdE	Y
iۖ1IA ضia|5/B}KF怹: \U4]ץ ˲Z]ײ*5i*E\kND˩\	@85 /i'X3  3l.! 9gs!8Zוy s6gY]	ipz/<-    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/social_bookmarks/email.png 2.3.1.src/images/social_bookmarks/email.png
--- 2.2rc2a.cp.src/images/social_bookmarks/email.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/social_bookmarks/email.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         a   tEXtSoftware Adobe ImageReadyqe<  IDATxڔRjP$hD./~Zp%jyԨI:gZ
+f`H93gm2<gM`iƫ]x<vNS<IW\)9b,$Ia ruCI6 #1(h\R>RDe;r=#uEHrH IrT(R8iv%"p@<k9ZJLU(19!u:zΏ&zfŬmۂ	p8
TbHp"*5F+8\.S"w5J
+`@jrof|ߧ{VVjh4` KBxUxԠYߧf0_+ӵ)}2/ $Az    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/social_bookmarks/facebook.png 2.3.1.src/images/social_bookmarks/facebook.png
--- 2.2rc2a.cp.src/images/social_bookmarks/facebook.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/social_bookmarks/facebook.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         a   tEXtSoftware Adobe ImageReadyqe<  IDATxlSKkSAfMiŊbqR/Bn]?|*bmk[Jl#iu;㹓 .<0Μ93lƋ󱁑U)<VL{ AZ6}LSqVWϜnWUN(EiQ¢m&6tk^vrU/ 
+6{u5vd 'mSjqZe<d2<-.50yylĿ""-8prD@|)_qR <.tV$!}5*8g~_٢71qSp_BaRjSBb{r!jx0p_jpt66Mm3
`2'}^,9ATsVlhA$	cf?i)dO*H |\ŷCVqg,_<9&FRV~8/ ae0
+Dc,t[MF݆Ta`C>,?b'%=$Kћ#ݝ
D*!fgp=2ck2I"cb.OItV.8NTkFњ5Df1@RC{]&ECqX	z&o~W+xqpĶ\ƵӸ>3aKm[-s{k}  xLF    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/social_bookmarks/google_buzz.png 2.3.1.src/images/social_bookmarks/google_buzz.png
--- 2.2rc2a.cp.src/images/social_bookmarks/google_buzz.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/social_bookmarks/google_buzz.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,8 @@
+PNG
+
+   
IHDR         a   tEXtSoftware Adobe ImageReadyqe<  'IDATxڌkAǿ;$ƀ
$`HEJQPQ(m
+HHŃnQhَͯ;ͼy<<<%=W$:FaqBv˂2lqjC=Ո;iDZ8AAwS	~&Ćkz3X*#`h"^G)TKiG)4;[Щ
K3o14ڊi,pbe$cL?oJԋ:kJDj
+)T!jJ21v&dzJ`\1$j׺<ِDKB\rYo>SHPwzRJk,18HD6uL|v{K%
+Ou{ERDpwjn&>l!&vlC2aßzq/LwQK)\3,
|ՋKA7J_3sO0;>
+hzCX
+C禾2yko 皺    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/social_bookmarks/twitter.png 2.3.1.src/images/social_bookmarks/twitter.png
--- 2.2rc2a.cp.src/images/social_bookmarks/twitter.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/images/social_bookmarks/twitter.png	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         a   tEXtSoftware Adobe ImageReadyqe<  IDATxlS;OQ=w.D0$ihiZ1WL$*4@yއ$;=wΙsկ[kR  ץlmW;$DjhÈ٤ߗ[JcQdhtGc!]kߋJCF@sj!V&(QQ#<ni	/Hh
u"22Ud,2c(h"Zu*SH8H(*4RG|m,A.RBB<!%ab@2jJ<NR*:B{[ReaO..W7l	7þPhQ2p/H,Cg%Fj+J=wHdIHh,rM~IUH1Ψ$I(GE HXY@$lJJRum0\mT}<}*/#EX"el]=`KZXx/`zw6p|)RQc4+!p&$Z0)Y!i̟	lEnt)O(Z,IF<N?|M6q}b¯`a]<'M]/)>?/a	0 HwPs    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/images/store_logo.png 2.3.1.src/images/store_logo.png
--- 2.2rc2a.cp.src/images/store_logo.png	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/images/store_logo.png	2010-11-15 03:42:36.000000000 -0600
@@ -1,37 +1,21 @@
 PNG
 
-   
IHDR      2   !   tEXtSoftware Adobe ImageReadyqe<  IDATx]	XSW>C6 	}
Z[bݶvcڽ>ik[[un*(. Ȧ
-,쁰%!&ci'ߓrwOsnb͎Tؑjؑj;Rb1RʮK5%G"zxX
f7]#Z{
-v[W<''֘U& v7D*..<Ŗρ|hwj˵]~3zwwvH).e0htDAD"R[*(*7@w@𛃵6V7y6mw@](ٵ'ob&IGJJq	q''XW2]/
-xct*oÎz`pܘاy掙3@jzzŢ?S׳M\D"&Z5aU^{Jy<wdֶj2<iڴ Gc]m3g;vbB׈}}99'.\BCB&N8fء)POO"gEys~WW			&a,EENNNq<eJM
!|EvV'.cEjߟs'jLFpHɓ9qL>V|Z۸xX<H
]5R>t
-h5쭭yyyy?=nZJVQ[SsyxjD6n7f5=@I"{[b'WBר1G9yE{2m3 ~]h4>FNu%Xo[N7讼ӧgL&XlOup`\]Z@]]&huVyxAÁO?r0VuFO/#Gp4->̌I3h2k"VPY'NN$:\V-L{9O74-;;pJ ?;q1Tgp9AnWWY-[ƌEk菀@)FGoۺd@?Mp_hy~8B!zMHgH5E%~>jVzU]MӸ"%*諧LtWY}?5j-={
/OIJ3o..ToĄm;v\Y_z`~OO+WLC_(~eKҴyO?}aa=Νt:?wf1ϙ{9`Ygu]V"Dg.زukaa{pcNN_n˷%L#~˖-bJeGjJ*@	rwβ4+WM-g̘3wD*?͎bq4(ᇯ2\<oI'#dkCŒkkutoeQQ/= }67^'oS%wTT?ݷx=^	9Uzҧ8--Sn$zFJKzUJ$yA_d>:69^xRMM
.?[GRĉ%%ￏwLMڵg$>&Uݠ/w
-yDHhmm$
-RturIش	ز3MG??[$õ:.^L7FDA>#32btm͵`ȹ9>oN=DBk֭
--@YtH`7b[g'>eH-GN\^JzO8c绾pI![tue
-fu}a4^PW&>_~, pY'leߞY-X`5Q=ӫ|||ģɤ ZdVu@-\wޱD;2G'O<a
-]ow<jU+W[}]dgg'p~OOsL 
-ـ6%>l 7^ǧ!Xr-MѭsH"D3ti``P[1	ICg
lGgEXcwG;^ܹʎv$V{egg<xgΜA01H9rq*}xElc,[f5?qww=5AG]]S&$&ZYr]sNb-]-LF,'eŪUdef\).)//1kp^l)ݻ5k!}p)~pp=tCS775!}OrU?yᆭ
/[G+3Ӱa:>6ǈ"dI
-"s#Y!_﫩.CI;(=z4%%1wުyjj*0z%P<ڵYG
[+Ŭ9
gI$LLtpp?rSNp__F>B耥5G3]fin36r,LK;j>oGD 744OQQQa?lxPpy2dA!r*Hq1-lrsTN
-7҄^#U|L704UO"p$N"$tsVG*2+bd;J]K˹ʄ \ksrr222P!=gN@
A~ڊrJHoLh6=<=]ZB9h|#@147,PQ@|8GB y(	B[3ey1}|NhSl*#mZל]\F	
غVZVj<o+LËT=A#la2HX%R8U:[ZZbcciv	r={6u;vXs9ӻjQh;B @,Qh޴0B=NDؾ޾k='K0tq(H|tz.!t0R<%egn ftpT4#?hޛFj#[֬i; L6a:0ƘϔOb144W?uџ"4.sFz%wT(Xr9x:"B232WNiQWp?m^-QG
--wp$,Iti977M;E@4bWՇn߮n >a		SLRchpA`؏DLvK}m%i"WĠ*̦VwoTY~xyy!t͐ۼ7ݙ+ozJKA
-_G^<`2RTuz<#iFep	Ox"V({s/
-\1f欍λ?_LnVFQ!8RkD+vwwS"ݷ&5552l%0o-((0Y/
&yyUeՉ?'.>&ͪj1Wq NDk.[i7ҠU4*F9PK 7`
-Èԟ2s<<<n;5_hp\l`5Fl_X0ʎHPڊSRU9dJ"w|'"5rY+ ~:GL#mkwO7n\FFƁ<==_oJQ?GH=M pJxDK\pus2fP ;u8Fk߯6!z<6	&acuЁ8;SH,j8QkcDn:À,Ñ49}1jom
-/innnJJKpp/8+7L<IOwK>~SFkJr̟ajB5
-y-iSMnz#q4k3tI;JmdјE'E:|EE!!!v,?1TVYqɸ:	Ŧ&Ot=rGĸ!<>Tf a	ݬnkd4Р0;wv1BCCϞ=+..2555xeySx4ەo'RU}Z[Ll
-j:"C)+fx<b Rșr`=bpt=m>'N/vxBFat*L|ez;*Ӆ
-ZMmkka,|>fPQZZ I&ҁmQfJaŅ뫉iku o>2G*m'ʖނgbr;=ӥ&~ܢizA;B@%6<cpgIIPH$H3Ζ-)+k7Zkok_zy';;;o{2`P]mBFQ6
-9bU)BGC@ƏhZHObK"ѪVViıhh}G 8Y>.&5BZjU&
-&Miu2P3 rS(EE<->4,⥡,9rT*Oo܏hEظ8X\UYiKj+JoR=ţd7b֘ z(I4H4Df<!vyO4)224h*%|WWR*T#~Ɉte]1:$qQQnn}{Z-r6(8ٳ23o<{R8ԩۃT',9Rc
-E3uVmQw6jW4Azs)ыÂ&$N
.`hh?@}R(-7Q8ON?}Nt <xɒl96Vڑ#F/ﭮƍCna2.[yuÆtuvYg=n8hc11yS5${LFr c2UuCW"gp\|܄	AV _//,mȜsQ	51;;ے!_=.^$
-j޵ ?/3gEX숃<*˛zޓJ_|Rڧ#¿+Vdge`a?8ag~z3K-s9٧&'߷%\[SwϞӦŋgΚx}Rjkk[[ZpmۦOi4!w-WUE ӫt2W˸B(mbIZCJ}}}G	'$$8p Xdr1m;8qbzz}@ 
schƺ\RSR`p3>셒!`
*\oR:7J^A&H,XttWUj̾A"٭9itx䞞tz蘷LPϯZ۷n; @;MM[=4RڒASOݳw.2'
--4
y~>Oegql[ݯ2FWT,clذ,>{@tf/]fƁgju<Ƙ_M/zãƏ3ftd62E~	&FQÈǏ[ɢ0RSD,N5gi@Г3CHD#ۋ85xuI;zܸDP0/*2K:ModGԆqtRapX02W9aYc3Ɛ/Խn|/4'/rɓosaL&K٩9e^~/
. ֩j|>P~glqu[7tunO92rӦ%m'n8EM
-s|ޠ@KnSirpȆ
*S=rM 33_955	/xG
-81!&&]RqdRUݾoRln72nThat9/:{Abd$]rr5O0"v5A:%Wݥ&=zԦ+C%9ՏUBcfA qRiQ4uCVI(#6
-߮ӡLXG%kEקBٌv5F!FYcgA9M &OWT7{5u4=1\K:#.Tv"ǎua@A
-yyyo|*WΝ;%Krɓ'G-NHH]]]GaL>nfKKKFF(9s&RD333a?Xg '侸=,,,--
Z{{ܹsC'Ш'[,qtqohinR5J8Xf|
$KЖ-[Hoo﨨(j[hwmeeeW\UhZO_t	DCƙj=TRRB! #""@1OƐ0
-7Z\\|}Y`hh(5kllFJKKy᫳H-X mb8f3!W>w3f@|p#p޽gPeb__豉'L9ui3fOq1T^^^̥#LPvp˗0@aPpdPBhl܌K'N%	\K bxƂ|>a U,u\\\Ǝ?16pdo6A8 f*PĀCL/|-^ۂ>(yXQ0(q#lKr9,$xT]ܴ=K 6X'?>-W( hz(=shrI(
- a C좢
JLvB@40.^`x1Z<kyy9xĴkbg'- c3)08m v	`709Nn;LoY xQ) Z
-#j$0JPE\DԩSg͚EՉmD$E MM  & J^SC`)㢔JTh@ǐb{ZWthbX.Âh޽0c`[vAK,5 :99C	.5(  P+aJ0vuZUU
a2Tq~u6'*  ͕n+. ~Aځ
-:c*%$ D)'h#
-W] F #!	2>~EJ1 
t8\MWb`'h~'ni [N`#*PSgsazX1L4kFnG2?C#HCHvvo` 8i    IENDB`
\ No newline at end of file
+   
IHDR      2   Q   tEXtSoftware Adobe ImageReadyqe<  "iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:3A078D0FB38511DF94B9E85B68D0D3C5" xmpMM:DocumentID="xmp.did:3A078D10B38511DF94B9E85B68D0D3C5"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:3A078D0DB38511DF94B9E85B68D0D3C5" stRef:documentID="xmp.did:3A078D0EB38511DF94B9E85B68D0D3C5"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>
+  oIDATx\	|T?wLɾ@X  @\ZV_}>_ӾZK]k}*>Ҫh+"HBB&=d}zw2}߽W	Bd)Dy	L1) 1 bSLb^l(GtR0<$T,|{fռ5UjMͦ	I|^/M>l4mO8aZBevǘdEv`V'`}զI5D$Œ}+*2VU,Xҳ/y<|MK06EPcXτi
$_$s
+Q+g`Co2kUϞw(!ygc*mmWڃ߲X:== ʺU"3p
+F)bݍgu.kǬO5WzwI-IC:Y+8bvp:ֿAik6#Oç6NND4g}u	w' s+½bDﳎ=:wP^DA;#9|Y3/)T:c)˗)3M.{Ʈ?>cD$!!_V~znHk-@;u O+'z@02t^#^&a}FHNueMյMY/g}$;Y/a?0N1XOoǁ¡tpFgg^yэsadwPWTa}Z<c>Kt{k9H*Ԅą!BaUtRR+vų\D'n
"*Fo:?p.c @\0{Y4	poehD^KYKѶs8Ɇ~8' 7X)^83bvhc{\b# :EWgq8=B?Yxzͻ`}|8]F ctb@}N,Qk Qe4%/Kh=OEh;ݟp_Sw$"UrU*Yr.)x_~֟c	^Q5}00] Lv
+ڂ(7@Q?G&o._-5iczrws_9/5вp~`]s?jz !"c>Szy`6GO7GU(uu<-Zwiѣ#?I xV&ڃ̣1ԓ]y+oٳ+ρwTn0c|-55&L@~_#q *FqhaMȃF#Zmv<(pq2n9;A){Yo1ů0|?u6+6Dӣu.zź<84T97|*Fup 
+[_ܕRMptڞOJr&=!lJLɧe4{l2UN*9gٟmٕPN[%~
+R^H<2x
+${XpN<i{B`$		@4"Gy[JD Ht::bݍ(0=Dϥq\g"o} |	iܐ?_X(iO5<	Arx8>4T'+t3pZ<eoɖ(6 9j.}oֵHf~>
+Hy#Cgă-=#z| 6vR#Tecsr"Dw ܀y}fD3Oy1PbԐsڞRw{=/zJ	ۖGPߝO;3,`̄lp\3.|6\o Т2C[P	C\T3+z{{+Բ,GV]9q:r(fF=qPE zW!o}_gcĞJ%g}Yӷgz`ґ!{J)ITtt7i˨RPɾ;gqP~TQ,-2@aYr)[s&jW]ԒE $A1`.@(hdAļbag6C匊Zg.}	=-l`%eZ)ÑOVF{(}̭}_Әaāg)8K&< #@GHSI,&%rw+3yM92PvxiLIIM52GG'
 bGաFre:hBd>(CK֟=J+LOr5͚VH.Bv&%I=	MAk hU" *ǧ^:n O4o~eJ$1NE(G}>ʤ>Χ߸iL1hO)SHI(Qm)/Mm?|VXFMݧQBz6y{$>7)"ISzQ!փH֢5Y4ةo2Э9zѨMqu"̂)4\"HpҌ3UđFES蒀'5B:֫&+,lr2TjG/
+W'g#
;vR^F.J5)⏝>TnXHrE(^A[>(NUv ŊhT1ly_P@VAa
+d((Yy l!_ETbI:T9ki׻k)j3\T]-IA:P<Nx"F999NGg4Co|"*b_1JetɐmfќyshpT3$IUO!B ǀzNdGN
8 W9TwS&ώnOC,	edd-"kW^:m̐J_WPh|Qg02dJqQ>9N{jQ"QHDrnZ˜ݼLvZJ+.J
؂|V
+3_?emFUCZaaPiʆ5YOIEq.T-d;BW0k(N/E$ы-̽nFl&
+YU8Q'a$+'+n_+u5تd
+4vz_n^U2xY1/P>KKd?SIqɈBj!F: )-m>|ҀxP7cZz0*@<m<iD;{%g$YWsII:i#$
Jg@?֣&?ʂ4j(JfvqiuU1@^nnnn7X(l8q ًǠOOlE~aK{8C64HW݇j0*qo!٩QDb30mbmdeSespZ>
+tKC\Y*Hu1%[eәwGQŊ$4'lN5	 {{N~"$#ׇⲦoE"sg]g=nz)<-QMJc 8hM4I.~;'<[hrMySbmWV@,BdV)"qG%̸aTdɸe\;ɹ8 y@6ADqn!@(H ǔaQ{I"}97IwW\D/IyEkxQ]"aix;^FsfbY
Yp:/FcԞ&/ܜEiROmO=#QOP|+V
u8<e6痭0/ʛ<Wq	TaATl Yt!O`kW%YFܯy^a⵫,OZU~Xnoy8ktneӫ<&6$y"n]{h[!v);ͥj|fiH7KU,o_BS bCN8Ogb5u/?@WmBn g|%LƸVX:xup__{M"DYhΫ fHG_)Ɋ]m5Tnxvve{}	9z  ryRhzYlzJ-*RFMMKGOTkP@--Po)/0>2@Ҍc6"ӻ^CcP<T\eKʋO焍(h|HuYfUj"D
7иq.輕x1SMڨ(7/O<I?wVڛ<@)(8g.Rp@`A["/#)/i+hx͙7O]Znծ[$yyj}{=-f=9p+.׹C>5+ly:A1؏
c5:=?/s]OZ/Yȟ|l6ؕL}뎺\ǟ%4rFjX3DNV1./Gg'Q@ n1 |ih#H`lne]F,:  rPռ!n{U bTEM;nz]5UlQb94y߂arPG^n+j}eZ:?ěͪN_T|j1k^^|,;ή.dm];v[@J'iԩys]ƴh沎OȠ6_'ys;5Ր^BhT/r^qjJpx@K*yx٨J@% JLN'OVW ňsi)'O7{lMv%ƌKͺki#i*phy-q۩ Y얐V1yde`gsvl%<͛6'j雜S'[HJJI*2G|q
+wѹjYc]"	 ^LQvF~ђ_3<oiy_5GG0)bN;tcUd_Pn1@'AbA>>F@'/Ҙ]U޺>pr` hEFsx<~Tsqvݴk.c'_"s\e|XǿJan5r3885hhUJn; m_S\̷)IIsrr oÎ`]SJptR}fUF$D>Td[54EPe媁HR)|#їSh9q4QAP7QF .QK\޸_8Kwe_Lx4pT?cP	k@eZvF$Ѳ๕k)
+
+ZuU[D9De6P&*ZUm&_ƹ0l $@fҖmXc^uXkDpA!))^s	1p_+:I{/kC׃c)|p&Rmo%*
a`IQIbpHJCG!_G#h~v_Rz)q%0||E}Ǘb`ndmD2/kU8c<`ɢ IA! eaX9c3MG1W
5R>&yMbZC}~{A[yBt98[&9jD.m#ъNĮN־d-QU=@3<h C)" NiK%hO7O-״RjߴC ↁJtIYC_|ǘ T%-oC &e#e`K_iAA{zi:K[m
ϩȷSc>7`0T^0Jpa'N
+rQ+ڊAn@;q;L)Si{ҶK>3	-X u${.$.x>F}[}1¹d{J	o9F"|-]d
*"E[-#K};Ā?IHڽ.<|ȅl[uKuv86s($c^eځ9/|`<O}--+s}SY2 bSLb	SL1b)_  kG>6    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/application_bottom.php 2.3.1.src/includes/application_bottom.php
--- 2.2rc2a.cp.src/includes/application_bottom.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/application_bottom.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: application_bottom.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/application_top.php 2.3.1.src/includes/application_top.php
--- 2.2rc2a.cp.src/includes/application_top.php	2009-12-03 16:11:23.000000000 -0600
+++ 2.3.1.src/includes/application_top.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: application_top.php 1833 2008-01-30 22:03:30Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,22 +14,19 @@
   define('PAGE_PARSE_START_TIME', microtime());
 
 // set the level of error reporting
-if (defined('E_DEPRECATED') and defined('E_USER_DEPRECATED')) {
-  error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_DEPRECATED);
-} else { 
   error_reporting(E_ALL & ~E_NOTICE);
-} 
 
 // check support for register_globals
   if (function_exists('ini_get') && (ini_get('register_globals') == false) && (PHP_VERSION < 4.3) ) {
     exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory. Please use PHP 4.3+ if register_globals cannot be enabled on the server.');
   }
 
-// Set the local configuration parameters - mainly for developers
-  if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');
-
-// include server parameters
-  require('includes/configure.php');
+// load server configuration parameters
+  if (file_exists('includes/local/configure.php')) { // for developers
+    include('includes/local/configure.php');
+  } else {
+    include('includes/configure.php');
+  }
 
   if (strlen(DB_SERVER) < 1) {
     if (is_dir('install')) {
@@ -37,8 +34,8 @@
     }
   }
 
-// define the project version
-  define('PROJECT_VERSION', 'osCommerce Online Merchant v2.2 RC2a');
+// define the project version --- obsolete, now retrieved with tep_get_version()
+  define('PROJECT_VERSION', 'osCommerce Online Merchant v2.3');
 
 // some code to solve compatibility issues
   require(DIR_WS_FUNCTIONS . 'compatibility.php');
@@ -47,7 +44,7 @@
   $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL';
 
 // set php_self in the local scope
-  if (!isset($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
+  $PHP_SELF = (((strlen(ini_get('cgi.fix_pathinfo')) > 0) && ((bool)ini_get('cgi.fix_pathinfo') == false)) || !isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) ? basename($HTTP_SERVER_VARS['PHP_SELF']) : basename($HTTP_SERVER_VARS['SCRIPT_NAME']);
 
   if ($request_type == 'NONSSL') {
     define('DIR_WS_CATALOG', DIR_WS_HTTP_CATALOG);
@@ -61,9 +58,6 @@
 // include the list of project database tables
   require(DIR_WS_INCLUDES . 'database_tables.php');
 
-// customization for the design layout
-  define('BOX_WIDTH', 125); // how wide the boxes should be in pixels (default: 125)
-
 // include the database functions
   require(DIR_WS_FUNCTIONS . 'database.php');
 
@@ -97,6 +91,7 @@
       $GET_array = array();
       $PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
       $vars = explode('/', substr(getenv('PATH_INFO'), 1));
+      do_magic_quotes_gpc($vars);
       for ($i=0, $n=sizeof($vars); $i<$n; $i++) {
         if (strpos($vars[$i], '[]')) {
           $GET_array[substr($vars[$i], 0, -2)][] = $vars[$i+1];
@@ -131,16 +126,6 @@
 // include navigation history class
   require(DIR_WS_CLASSES . 'navigation_history.php');
 
-// check if sessions are supported, otherwise use the php3 compatible session class
-  if (!function_exists('session_start')) {
-    define('PHP_SESSION_NAME', 'osCsid');
-    define('PHP_SESSION_PATH', $cookie_path);
-    define('PHP_SESSION_DOMAIN', $cookie_domain);
-    define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);
-
-    include(DIR_WS_CLASSES . 'sessions.php');
-  }
-
 // define how the session functions will be used
   require(DIR_WS_FUNCTIONS . 'sessions.php');
 
@@ -157,6 +142,8 @@
     ini_set('session.cookie_domain', $cookie_domain);
   }
 
+  @ini_set('session.use_only_cookies', (SESSION_FORCE_COOKIE_USE == 'True') ? 1 : 0);
+
 // set the session ID if it exists
    if (isset($HTTP_POST_VARS[tep_session_name()])) {
      tep_session_id($HTTP_POST_VARS[tep_session_name()]);
@@ -203,6 +190,12 @@
     extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);
   }
 
+// initialize a session token
+  if (!tep_session_is_registered('sessiontoken')) {
+    $sessiontoken = md5(tep_rand() . tep_rand() . tep_rand() . tep_rand());
+    tep_session_register('sessiontoken');
+  }
+
 // set SID once, even if empty
   $SID = (defined('SID') ? SID : '');
 
@@ -248,14 +241,8 @@
     }
   }
 
-// create the shopping cart & fix the cart if necesary
-  if (tep_session_is_registered('cart') && is_object($cart)) {
-    if (PHP_VERSION < 4) {
-      $broken_cart = $cart;
-      $cart = new shoppingCart;
-      $cart->unserialize($broken_cart);
-    }
-  } else {
+// create the shopping cart
+  if (!tep_session_is_registered('cart') || !is_object($cart)) {
     tep_session_register('cart');
     $cart = new shoppingCart;
   }
@@ -298,23 +285,20 @@
     if (isset($HTTP_GET_VARS['currency']) && $currencies->is_set($HTTP_GET_VARS['currency'])) {
       $currency = $HTTP_GET_VARS['currency'];
     } else {
-      $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
+      $currency = ((USE_DEFAULT_LANGUAGE_CURRENCY == 'true') && $currencies->is_set(LANGUAGE_CURRENCY)) ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
     }
   }
 
 // navigation history
-  if (tep_session_is_registered('navigation')) {
-    if (PHP_VERSION < 4) {
-      $broken_navigation = $navigation;
-      $navigation = new navigationHistory;
-      $navigation->unserialize($broken_navigation);
-    }
-  } else {
+  if (!tep_session_is_registered('navigation') || !is_object($navigation)) {
     tep_session_register('navigation');
     $navigation = new navigationHistory;
   }
   $navigation->add_current_page();
 
+// action recorder
+  include('includes/classes/action_recorder.php');
+
 // Shopping cart actions
   if (isset($HTTP_GET_VARS['action'])) {
 // redirect the customer to a friendly cookie-must-be-enabled page if cookies are disabled
@@ -339,22 +323,7 @@
                                 if (in_array($HTTP_POST_VARS['products_id'][$i], (is_array($HTTP_POST_VARS['cart_delete']) ? $HTTP_POST_VARS['cart_delete'] : array()))) {
                                   $cart->remove($HTTP_POST_VARS['products_id'][$i]);
                                 } else {
-                                  if (PHP_VERSION < 4) {
-                                    // if PHP3, make correction for lack of multidimensional array.
-                                    reset($HTTP_POST_VARS);
-                                    while (list($key, $value) = each($HTTP_POST_VARS)) {
-                                      if (is_array($value)) {
-                                        while (list($key2, $value2) = each($value)) {
-                                          if (ereg ("(.*)\]\[(.*)", $key2, $var)) {
-                                            $id2[$var[1]][$var[2]] = $value2;
-                                          }
-                                        }
-                                      }
-                                    }
-                                    $attributes = ($id2[$HTTP_POST_VARS['products_id'][$i]]) ? $id2[$HTTP_POST_VARS['products_id'][$i]] : '';
-                                  } else {
-                                    $attributes = ($HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]]) ? $HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]] : '';
-                                  }
+                                  $attributes = ($HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]]) ? $HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]] : '';
                                   $cart->add_cart($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['cart_quantity'][$i], $attributes, false);
                                 }
                               }
@@ -362,7 +331,14 @@
                               break;
       // customer adds a product from the products page
       case 'add_product' :    if (isset($HTTP_POST_VARS['products_id']) && is_numeric($HTTP_POST_VARS['products_id'])) {
-                                $cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);
+                                $attributes = isset($HTTP_POST_VARS['id']) ? $HTTP_POST_VARS['id'] : '';
+                                $cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $attributes))+1, $attributes);
+                              }
+                              tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
+                              break;
+      // customer removes a product from their shopping cart
+      case 'remove_product' : if (isset($HTTP_GET_VARS['products_id'])) {
+                                $cart->remove($HTTP_GET_VARS['products_id']);
                               }
                               tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                               break;
@@ -449,6 +425,9 @@
   require(DIR_WS_FUNCTIONS . 'specials.php');
   tep_expire_specials();
 
+  require(DIR_WS_CLASSES . 'osc_template.php');
+  $oscTemplate = new oscTemplate();
+
 // calculate category path
   if (isset($HTTP_GET_VARS['cPath'])) {
     $cPath = $HTTP_GET_VARS['cPath'];
@@ -504,11 +483,4 @@
 // initialize the message stack for output messages
   require(DIR_WS_CLASSES . 'message_stack.php');
   $messageStack = new messageStack;
-
-// set which precautions should be checked
-  define('WARN_INSTALL_EXISTENCE', 'true');
-  define('WARN_CONFIG_WRITEABLE', 'true');
-  define('WARN_SESSION_DIRECTORY_NOT_WRITEABLE', 'true');
-  define('WARN_SESSION_AUTO_START', 'true');
-  define('WARN_DOWNLOAD_DIRECTORY_NOT_READABLE', 'true');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/best_sellers.php 2.3.1.src/includes/boxes/best_sellers.php
--- 2.2rc2a.cp.src/includes/boxes/best_sellers.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/best_sellers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,48 +0,0 @@
-<?php
-/*
-  $Id: best_sellers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (isset($current_category_id) && ($current_category_id > 0)) {
-    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and '" . (int)$current_category_id . "' in (c.categories_id, c.parent_id) order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
-  } else {
-    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
-  }
-
-  if (tep_db_num_rows($best_sellers_query) >= MIN_DISPLAY_BESTSELLERS) {
-?>
-<!-- best_sellers //-->
-          <tr>
-            <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_BESTSELLERS);
-
-    new infoBoxHeading($info_box_contents, false, false);
-
-    $rows = 0;
-    $bestsellers_list = '<table border="0" width="100%" cellspacing="0" cellpadding="1">';
-    while ($best_sellers = tep_db_fetch_array($best_sellers_query)) {
-      $rows++;
-      $bestsellers_list .= '<tr><td class="infoBoxContents" valign="top">' . tep_row_number_format($rows) . '.</td><td class="infoBoxContents"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $best_sellers['products_id']) . '">' . $best_sellers['products_name'] . '</a></td></tr>';
-    }
-    $bestsellers_list .= '</table>';
-
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => $bestsellers_list);
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- best_sellers_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/categories.php 2.3.1.src/includes/boxes/categories.php
--- 2.2rc2a.cp.src/includes/boxes/categories.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/categories.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,138 +0,0 @@
-<?php
-/*
-  $Id: categories.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  function tep_show_category($counter) {
-    global $tree, $categories_string, $cPath_array;
-
-    for ($i=0; $i<$tree[$counter]['level']; $i++) {
-      $categories_string .= "&nbsp;&nbsp;";
-    }
-
-    $categories_string .= '<a href="';
-
-    if ($tree[$counter]['parent'] == 0) {
-      $cPath_new = 'cPath=' . $counter;
-    } else {
-      $cPath_new = 'cPath=' . $tree[$counter]['path'];
-    }
-
-    $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
-
-    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
-      $categories_string .= '<b>';
-    }
-
-// display category name
-    $categories_string .= $tree[$counter]['name'];
-
-    if (isset($cPath_array) && in_array($counter, $cPath_array)) {
-      $categories_string .= '</b>';
-    }
-
-    if (tep_has_category_subcategories($counter)) {
-      $categories_string .= '-&gt;';
-    }
-
-    $categories_string .= '</a>';
-
-    if (SHOW_COUNTS == 'true') {
-      $products_in_category = tep_count_products_in_category($counter);
-      if ($products_in_category > 0) {
-        $categories_string .= '&nbsp;(' . $products_in_category . ')';
-      }
-    }
-
-    $categories_string .= '<br>';
-
-    if ($tree[$counter]['next_id'] != false) {
-      tep_show_category($tree[$counter]['next_id']);
-    }
-  }
-?>
-<!-- categories //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_CATEGORIES);
-
-  new infoBoxHeading($info_box_contents, true, false);
-
-  $categories_string = '';
-  $tree = array();
-
-  $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
-  while ($categories = tep_db_fetch_array($categories_query))  {
-    $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
-                                                'parent' => $categories['parent_id'],
-                                                'level' => 0,
-                                                'path' => $categories['categories_id'],
-                                                'next_id' => false);
-
-    if (isset($parent_id)) {
-      $tree[$parent_id]['next_id'] = $categories['categories_id'];
-    }
-
-    $parent_id = $categories['categories_id'];
-
-    if (!isset($first_element)) {
-      $first_element = $categories['categories_id'];
-    }
-  }
-
-  //------------------------
-  if (tep_not_null($cPath)) {
-    $new_path = '';
-    reset($cPath_array);
-    while (list($key, $value) = each($cPath_array)) {
-      unset($parent_id);
-      unset($first_id);
-      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
-      if (tep_db_num_rows($categories_query)) {
-        $new_path .= $value;
-        while ($row = tep_db_fetch_array($categories_query)) {
-          $tree[$row['categories_id']] = array('name' => $row['categories_name'],
-                                               'parent' => $row['parent_id'],
-                                               'level' => $key+1,
-                                               'path' => $new_path . '_' . $row['categories_id'],
-                                               'next_id' => false);
-
-          if (isset($parent_id)) {
-            $tree[$parent_id]['next_id'] = $row['categories_id'];
-          }
-
-          $parent_id = $row['categories_id'];
-
-          if (!isset($first_id)) {
-            $first_id = $row['categories_id'];
-          }
-
-          $last_id = $row['categories_id'];
-        }
-        $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
-        $tree[$value]['next_id'] = $first_id;
-        $new_path .= '_';
-      } else {
-        break;
-      }
-    }
-  }
-  tep_show_category($first_element); 
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => $categories_string);
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- categories_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/currencies.php 2.3.1.src/includes/boxes/currencies.php
--- 2.2rc2a.cp.src/includes/boxes/currencies.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/currencies.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,50 +0,0 @@
-<?php
-/*
-  $Id: currencies.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (isset($currencies) && is_object($currencies)) {
-?>
-<!-- currencies //-->
-          <tr>
-            <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_CURRENCIES);
-
-    new infoBoxHeading($info_box_contents, false, false);
-
-    reset($currencies->currencies);
-    $currencies_array = array();
-    while (list($key, $value) = each($currencies->currencies)) {
-      $currencies_array[] = array('id' => $key, 'text' => $value['title']);
-    }
-
-    $hidden_get_variables = '';
-    reset($HTTP_GET_VARS);
-    while (list($key, $value) = each($HTTP_GET_VARS)) {
-      if ( ($key != 'currency') && ($key != tep_session_name()) && ($key != 'x') && ($key != 'y') ) {
-        $hidden_get_variables .= tep_draw_hidden_field($key, $value);
-      }
-    }
-
-    $info_box_contents = array();
-    $info_box_contents[] = array('form' => tep_draw_form('currencies', tep_href_link(basename($PHP_SELF), '', $request_type, false), 'get'),
-                                 'align' => 'center',
-                                 'text' => tep_draw_pull_down_menu('currency', $currencies_array, $currency, 'onChange="this.form.submit();" style="width: 100%"') . $hidden_get_variables . tep_hide_session_id());
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- currencies_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/information.php 2.3.1.src/includes/boxes/information.php
--- 2.2rc2a.cp.src/includes/boxes/information.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/information.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-<?php
-/*
-  $Id: information.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- information //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_INFORMATION);
-
-  new infoBoxHeading($info_box_contents, false, false);
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => '<a href="' . tep_href_link(FILENAME_SHIPPING) . '">' . BOX_INFORMATION_SHIPPING . '</a><br>' .
-                                         '<a href="' . tep_href_link(FILENAME_PRIVACY) . '">' . BOX_INFORMATION_PRIVACY . '</a><br>' .
-                                         '<a href="' . tep_href_link(FILENAME_CONDITIONS) . '">' . BOX_INFORMATION_CONDITIONS . '</a><br>' .
-                                         '<a href="' . tep_href_link(FILENAME_CONTACT_US) . '">' . BOX_INFORMATION_CONTACT . '</a>');
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- information_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/languages.php 2.3.1.src/includes/boxes/languages.php
--- 2.2rc2a.cp.src/includes/boxes/languages.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/languages.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-<?php
-/*
-  $Id: languages.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- languages //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_LANGUAGES);
-
-  new infoBoxHeading($info_box_contents, false, false);
-
-  if (!isset($lng) || (isset($lng) && !is_object($lng))) {
-    include(DIR_WS_CLASSES . 'language.php');
-    $lng = new language;
-  }
-
-  $languages_string = '';
-  reset($lng->catalog_languages);
-  while (list($key, $value) = each($lng->catalog_languages)) {
-    $languages_string .= ' <a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('language', 'currency')) . 'language=' . $key, $request_type) . '">' . tep_image(DIR_WS_LANGUAGES .  $value['directory'] . '/images/' . $value['image'], $value['name']) . '</a> ';
-  }
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('align' => 'center',
-                               'text' => $languages_string);
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- languages_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/manufacturer_info.php 2.3.1.src/includes/boxes/manufacturer_info.php
--- 2.2rc2a.cp.src/includes/boxes/manufacturer_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/manufacturer_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,44 +0,0 @@
-<?php
-/*
-  $Id: manufacturer_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (isset($HTTP_GET_VARS['products_id'])) {
-    $manufacturer_query = tep_db_query("select m.manufacturers_id, m.manufacturers_name, m.manufacturers_image, mi.manufacturers_url from " . TABLE_MANUFACTURERS . " m left join " . TABLE_MANUFACTURERS_INFO . " mi on (m.manufacturers_id = mi.manufacturers_id and mi.languages_id = '" . (int)$languages_id . "'), " . TABLE_PRODUCTS . " p  where p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and p.manufacturers_id = m.manufacturers_id");
-    if (tep_db_num_rows($manufacturer_query)) {
-      $manufacturer = tep_db_fetch_array($manufacturer_query);
-?>
-<!-- manufacturer_info //-->
-          <tr>
-            <td>
-<?php
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => BOX_HEADING_MANUFACTURER_INFO);
-
-      new infoBoxHeading($info_box_contents, false, false);
-
-      $manufacturer_info_string = '<table border="0" width="100%" cellspacing="0" cellpadding="0">';
-      if (tep_not_null($manufacturer['manufacturers_image'])) $manufacturer_info_string .= '<tr><td align="center" class="infoBoxContents" colspan="2">' . tep_image(DIR_WS_IMAGES . $manufacturer['manufacturers_image'], $manufacturer['manufacturers_name']) . '</td></tr>';
-      if (tep_not_null($manufacturer['manufacturers_url'])) $manufacturer_info_string .= '<tr><td valign="top" class="infoBoxContents">-&nbsp;</td><td valign="top" class="infoBoxContents"><a href="' . tep_href_link(FILENAME_REDIRECT, 'action=manufacturer&manufacturers_id=' . $manufacturer['manufacturers_id']) . '" target="_blank">' . sprintf(BOX_MANUFACTURER_INFO_HOMEPAGE, $manufacturer['manufacturers_name']) . '</a></td></tr>';
-      $manufacturer_info_string .= '<tr><td valign="top" class="infoBoxContents">-&nbsp;</td><td valign="top" class="infoBoxContents"><a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $manufacturer['manufacturers_id']) . '">' . BOX_MANUFACTURER_INFO_OTHER_PRODUCTS . '</a></td></tr>' .
-                                   '</table>';
-
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => $manufacturer_info_string);
-
-      new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- manufacturer_info_eof //-->
-<?php
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/manufacturers.php 2.3.1.src/includes/boxes/manufacturers.php
--- 2.2rc2a.cp.src/includes/boxes/manufacturers.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/manufacturers.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,63 +0,0 @@
-<?php
-/*
-  $Id: manufacturers.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  $manufacturers_query = tep_db_query("select manufacturers_id, manufacturers_name from " . TABLE_MANUFACTURERS . " order by manufacturers_name");
-  if ($number_of_rows = tep_db_num_rows($manufacturers_query)) {
-?>
-<!-- manufacturers //-->
-          <tr>
-            <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_MANUFACTURERS);
-
-    new infoBoxHeading($info_box_contents, false, false);
-
-    if ($number_of_rows <= MAX_DISPLAY_MANUFACTURERS_IN_A_LIST) {
-// Display a list
-      $manufacturers_list = '';
-      while ($manufacturers = tep_db_fetch_array($manufacturers_query)) {
-        $manufacturers_name = ((strlen($manufacturers['manufacturers_name']) > MAX_DISPLAY_MANUFACTURER_NAME_LEN) ? substr($manufacturers['manufacturers_name'], 0, MAX_DISPLAY_MANUFACTURER_NAME_LEN) . '..' : $manufacturers['manufacturers_name']);
-        if (isset($HTTP_GET_VARS['manufacturers_id']) && ($HTTP_GET_VARS['manufacturers_id'] == $manufacturers['manufacturers_id'])) $manufacturers_name = '<b>' . $manufacturers_name .'</b>';
-        $manufacturers_list .= '<a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $manufacturers['manufacturers_id']) . '">' . $manufacturers_name . '</a><br>';
-      }
-
-      $manufacturers_list = substr($manufacturers_list, 0, -4);
-
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => $manufacturers_list);
-    } else {
-// Display a drop-down
-      $manufacturers_array = array();
-      if (MAX_MANUFACTURERS_LIST < 2) {
-        $manufacturers_array[] = array('id' => '', 'text' => PULL_DOWN_DEFAULT);
-      }
-
-      while ($manufacturers = tep_db_fetch_array($manufacturers_query)) {
-        $manufacturers_name = ((strlen($manufacturers['manufacturers_name']) > MAX_DISPLAY_MANUFACTURER_NAME_LEN) ? substr($manufacturers['manufacturers_name'], 0, MAX_DISPLAY_MANUFACTURER_NAME_LEN) . '..' : $manufacturers['manufacturers_name']);
-        $manufacturers_array[] = array('id' => $manufacturers['manufacturers_id'],
-                                       'text' => $manufacturers_name);
-      }
-
-      $info_box_contents = array();
-      $info_box_contents[] = array('form' => tep_draw_form('manufacturers', tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false), 'get'),
-                                   'text' => tep_draw_pull_down_menu('manufacturers_id', $manufacturers_array, (isset($HTTP_GET_VARS['manufacturers_id']) ? $HTTP_GET_VARS['manufacturers_id'] : ''), 'onChange="this.form.submit();" size="' . MAX_MANUFACTURERS_LIST . '" style="width: 100%"') . tep_hide_session_id());
-    }
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- manufacturers_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/order_history.php 2.3.1.src/includes/boxes/order_history.php
--- 2.2rc2a.cp.src/includes/boxes/order_history.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/order_history.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,54 +0,0 @@
-<?php
-/*
-  $Id: order_history.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (tep_session_is_registered('customer_id')) {
-// retreive the last x products purchased
-    $orders_query = tep_db_query("select distinct op.products_id from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op, " . TABLE_PRODUCTS . " p where o.customers_id = '" . (int)$customer_id . "' and o.orders_id = op.orders_id and op.products_id = p.products_id and p.products_status = '1' group by products_id order by o.date_purchased desc limit " . MAX_DISPLAY_PRODUCTS_IN_ORDER_HISTORY_BOX);
-    if (tep_db_num_rows($orders_query)) {
-?>
-<!-- customer_orders //-->
-          <tr>
-            <td>
-<?php
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => BOX_HEADING_CUSTOMER_ORDERS);
-
-      new infoBoxHeading($info_box_contents, false, false);
-
-      $product_ids = '';
-      while ($orders = tep_db_fetch_array($orders_query)) {
-        $product_ids .= (int)$orders['products_id'] . ',';
-      }
-      $product_ids = substr($product_ids, 0, -1);
-
-      $customer_orders_string = '<table border="0" width="100%" cellspacing="0" cellpadding="1">';
-      $products_query = tep_db_query("select products_id, products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id in (" . $product_ids . ") and language_id = '" . (int)$languages_id . "' order by products_name");
-      while ($products = tep_db_fetch_array($products_query)) {
-        $customer_orders_string .= '  <tr>' .
-                                   '    <td class="infoBoxContents"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . '">' . $products['products_name'] . '</a></td>' .
-                                   '    <td class="infoBoxContents" align="right" valign="top"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=cust_order&pid=' . $products['products_id']) . '">' . tep_image(DIR_WS_ICONS . 'cart.gif', ICON_CART) . '</a></td>' .
-                                   '  </tr>';
-      }
-      $customer_orders_string .= '</table>';
-
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => $customer_orders_string);
-
-      new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- customer_orders_eof //-->
-<?php
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/product_notifications.php 2.3.1.src/includes/boxes/product_notifications.php
--- 2.2rc2a.cp.src/includes/boxes/product_notifications.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/product_notifications.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,47 +0,0 @@
-<?php
-/*
-  $Id: product_notifications.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (isset($HTTP_GET_VARS['products_id'])) {
-?>
-<!-- notifications //-->
-          <tr>
-            <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_NOTIFICATIONS);
-
-    new infoBoxHeading($info_box_contents, false, false, tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL'));
-
-    if (tep_session_is_registered('customer_id')) {
-      $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and customers_id = '" . (int)$customer_id . "'");
-      $check = tep_db_fetch_array($check_query);
-
-      $notification_exists = (($check['count'] > 0) ? true : false);
-    } else {
-      $notification_exists = false;
-    }
-
-    $info_box_contents = array();
-    if ($notification_exists == true) {
-      $info_box_contents[] = array('text' => '<table border="0" cellspacing="0" cellpadding="2"><tr><td class="infoBoxContents"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications_remove.gif', IMAGE_BUTTON_REMOVE_NOTIFICATIONS) . '</a></td><td class="infoBoxContents"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . sprintf(BOX_NOTIFICATIONS_NOTIFY_REMOVE, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>');
-    } else {
-      $info_box_contents[] = array('text' => '<table border="0" cellspacing="0" cellpadding="2"><tr><td class="infoBoxContents"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications.gif', IMAGE_BUTTON_NOTIFICATIONS) . '</a></td><td class="infoBoxContents"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . sprintf(BOX_NOTIFICATIONS_NOTIFY, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>');
-    }
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- notifications_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/reviews.php 2.3.1.src/includes/boxes/reviews.php
--- 2.2rc2a.cp.src/includes/boxes/reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,51 +0,0 @@
-<?php
-/*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- reviews //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_REVIEWS);
-
-  new infoBoxHeading($info_box_contents, false, false, tep_href_link(FILENAME_REVIEWS));
-
-  $random_select = "select r.reviews_id, r.reviews_rating, p.products_id, p.products_image, pd.products_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = r.products_id and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "'";
-  if (isset($HTTP_GET_VARS['products_id'])) {
-    $random_select .= " and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'";
-  }
-  $random_select .= " order by r.reviews_id desc limit " . MAX_RANDOM_SELECT_REVIEWS;
-  $random_product = tep_random_select($random_select);
-
-  $info_box_contents = array();
-
-  if ($random_product) {
-// display random review box
-    $rand_review_query = tep_db_query("select substring(reviews_text, 1, 60) as reviews_text from " . TABLE_REVIEWS_DESCRIPTION . " where reviews_id = '" . (int)$random_product['reviews_id'] . "' and languages_id = '" . (int)$languages_id . "'");
-    $rand_review = tep_db_fetch_array($rand_review_query);
-
-    $rand_review_text = tep_break_string(tep_output_string_protected($rand_review['reviews_text']), 15, '-<br>');
-
-    $info_box_contents[] = array('text' => '<div align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $random_product['products_id'] . '&reviews_id=' . $random_product['reviews_id']) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></div><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $random_product['products_id'] . '&reviews_id=' . $random_product['reviews_id']) . '">' . $rand_review_text . ' ..</a><br><div align="center">' . tep_image(DIR_WS_IMAGES . 'stars_' . $random_product['reviews_rating'] . '.gif' , sprintf(BOX_REVIEWS_TEXT_OF_5_STARS, $random_product['reviews_rating'])) . '</div>');
-  } elseif (isset($HTTP_GET_VARS['products_id'])) {
-// display 'write a review' box
-    $info_box_contents[] = array('text' => '<table border="0" cellspacing="0" cellpadding="2"><tr><td class="infoBoxContents"><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'products_id=' . $HTTP_GET_VARS['products_id']) . '">' . tep_image(DIR_WS_IMAGES . 'box_write_review.gif', IMAGE_BUTTON_WRITE_REVIEW) . '</a></td><td class="infoBoxContents"><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'products_id=' . $HTTP_GET_VARS['products_id']) . '">' . BOX_REVIEWS_WRITE_REVIEW .'</a></td></tr></table>');
-  } else {
-// display 'no reviews' box
-    $info_box_contents[] = array('text' => BOX_REVIEWS_NO_REVIEWS);
-  }
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- reviews_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/search.php 2.3.1.src/includes/boxes/search.php
--- 2.2rc2a.cp.src/includes/boxes/search.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/search.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: search.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- search //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_SEARCH);
-
-  new infoBoxHeading($info_box_contents, false, false);
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('form' => tep_draw_form('quick_find', tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, '', 'NONSSL', false), 'get'),
-                               'align' => 'center',
-                               'text' => tep_draw_input_field('keywords', '', 'size="10" maxlength="30" style="width: ' . (BOX_WIDTH-30) . 'px"') . '&nbsp;' . tep_hide_session_id() . tep_image_submit('button_quick_find.gif', BOX_HEADING_SEARCH) . '<br>' . BOX_SEARCH_TEXT . '<br><a href="' . tep_href_link(FILENAME_ADVANCED_SEARCH) . '"><b>' . BOX_SEARCH_ADVANCED_SEARCH . '</b></a>');
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- search_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/shopping_cart.php 2.3.1.src/includes/boxes/shopping_cart.php
--- 2.2rc2a.cp.src/includes/boxes/shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,67 +0,0 @@
-<?php
-/*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- shopping_cart //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_SHOPPING_CART);
-
-  new infoBoxHeading($info_box_contents, false, true, tep_href_link(FILENAME_SHOPPING_CART));
-
-  $cart_contents_string = '';
-  if ($cart->count_contents() > 0) {
-    $cart_contents_string = '<table border="0" width="100%" cellspacing="0" cellpadding="0">';
-    $products = $cart->get_products();
-    for ($i=0, $n=sizeof($products); $i<$n; $i++) {
-      $cart_contents_string .= '<tr><td align="right" valign="top" class="infoBoxContents">';
-
-      if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
-        $cart_contents_string .= '<span class="newItemInCart">';
-      } else {
-        $cart_contents_string .= '<span class="infoBoxContents">';
-      }
-
-      $cart_contents_string .= $products[$i]['quantity'] . '&nbsp;x&nbsp;</span></td><td valign="top" class="infoBoxContents"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '">';
-
-      if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
-        $cart_contents_string .= '<span class="newItemInCart">';
-      } else {
-        $cart_contents_string .= '<span class="infoBoxContents">';
-      }
-
-      $cart_contents_string .= $products[$i]['name'] . '</span></a></td></tr>';
-
-      if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
-        tep_session_unregister('new_products_id_in_cart');
-      }
-    }
-    $cart_contents_string .= '</table>';
-  } else {
-    $cart_contents_string .= BOX_SHOPPING_CART_EMPTY;
-  }
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => $cart_contents_string);
-
-  if ($cart->count_contents() > 0) {
-    $info_box_contents[] = array('text' => tep_draw_separator());
-    $info_box_contents[] = array('align' => 'right',
-                                 'text' => $currencies->format($cart->show_total()));
-  }
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- shopping_cart_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/specials.php 2.3.1.src/includes/boxes/specials.php
--- 2.2rc2a.cp.src/includes/boxes/specials.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/specials.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-<?php
-/*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if ($random_product = tep_random_select("select p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_image, s.specials_new_products_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_SPECIALS . " s where p.products_status = '1' and p.products_id = s.products_id and pd.products_id = s.products_id and pd.language_id = '" . (int)$languages_id . "' and s.status = '1' order by s.specials_date_added desc limit " . MAX_RANDOM_SELECT_SPECIALS)) {
-?>
-<!-- specials //-->
-          <tr>
-            <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_SPECIALS);
-
-    new infoBoxHeading($info_box_contents, false, false, tep_href_link(FILENAME_SPECIALS));
-
-    $info_box_contents = array();
-    $info_box_contents[] = array('align' => 'center',
-                                 'text' => '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product["products_id"]) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . $random_product['products_name'] . '</a><br><s>' . $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</s><br><span class="productSpecialPrice">' . $currencies->display_price($random_product['specials_new_products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</span>');
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- specials_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/tell_a_friend.php 2.3.1.src/includes/boxes/tell_a_friend.php
--- 2.2rc2a.cp.src/includes/boxes/tell_a_friend.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/tell_a_friend.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: tell_a_friend.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
-<!-- tell_a_friend //-->
-          <tr>
-            <td>
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => BOX_HEADING_TELL_A_FRIEND);
-
-  new infoBoxHeading($info_box_contents, false, false);
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('form' => tep_draw_form('tell_a_friend', tep_href_link(FILENAME_TELL_A_FRIEND, '', 'NONSSL', false), 'get'),
-                               'align' => 'center',
-                               'text' => tep_draw_input_field('to_email_address', '', 'size="10"') . '&nbsp;' . tep_image_submit('button_tell_a_friend.gif', BOX_HEADING_TELL_A_FRIEND) . tep_draw_hidden_field('products_id', $HTTP_GET_VARS['products_id']) . tep_hide_session_id() . '<br>' . BOX_TELL_A_FRIEND_TEXT);
-
-  new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- tell_a_friend_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/boxes/whats_new.php 2.3.1.src/includes/boxes/whats_new.php
--- 2.2rc2a.cp.src/includes/boxes/whats_new.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/boxes/whats_new.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,45 +0,0 @@
-<?php
-/*
-  $Id: whats_new.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if ($random_product = tep_random_select("select products_id, products_image, products_tax_class_id, products_price from " . TABLE_PRODUCTS . " where products_status = '1' order by products_date_added desc limit " . MAX_RANDOM_SELECT_NEW)) {
-?>
-<!-- whats_new //-->
-          <tr>
-            <td>
-<?php
-    $random_product['products_name'] = tep_get_products_name($random_product['products_id']);
-    $random_product['specials_new_products_price'] = tep_get_products_special_price($random_product['products_id']);
-
-    $info_box_contents = array();
-    $info_box_contents[] = array('text' => BOX_HEADING_WHATS_NEW);
-
-    new infoBoxHeading($info_box_contents, false, false, tep_href_link(FILENAME_PRODUCTS_NEW));
-
-    if (tep_not_null($random_product['specials_new_products_price'])) {
-      $whats_new_price = '<s>' . $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</s><br>';
-      $whats_new_price .= '<span class="productSpecialPrice">' . $currencies->display_price($random_product['specials_new_products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</span>';
-    } else {
-      $whats_new_price = $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id']));
-    }
-
-    $info_box_contents = array();
-    $info_box_contents[] = array('align' => 'center',
-                                 'text' => '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . $random_product['products_name'] . '</a><br>' . $whats_new_price);
-
-    new infoBox($info_box_contents);
-?>
-            </td>
-          </tr>
-<!-- whats_new_eof //-->
-<?php
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/action_recorder.php 2.3.1.src/includes/classes/action_recorder.php
--- 2.2rc2a.cp.src/includes/classes/action_recorder.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/classes/action_recorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,86 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class actionRecorder {
+    var $_module;
+    var $_user_id;
+    var $_user_name;
+
+    function actionRecorder($module, $user_id = null, $user_name = null) {
+      global $language, $PHP_SELF;
+
+      $module = tep_sanitize_string(str_replace(' ', '', $module));
+
+      if (defined('MODULE_ACTION_RECORDER_INSTALLED') && tep_not_null(MODULE_ACTION_RECORDER_INSTALLED)) {
+        if (tep_not_null($module) && in_array($module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)), explode(';', MODULE_ACTION_RECORDER_INSTALLED))) {
+          if (!class_exists($module)) {
+            if (file_exists(DIR_WS_MODULES . 'action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)))) {
+              include(DIR_WS_LANGUAGES . $language . '/modules/action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)));
+              include(DIR_WS_MODULES . 'action_recorder/' . $module . '.' . substr($PHP_SELF, (strrpos($PHP_SELF, '.')+1)));
+            } else {
+              return false;
+            }
+          }
+        } else {
+          return false;
+        }
+      } else {
+        return false;
+      }
+
+      $this->_module = $module;
+
+      if (!empty($user_id) && is_numeric($user_id)) {
+        $this->_user_id = $user_id;
+      }
+
+      if (!empty($user_name)) {
+        $this->_user_name = $user_name;
+      }
+
+      $GLOBALS[$this->_module] = new $module();
+      $GLOBALS[$this->_module]->setIdentifier();
+    }
+
+    function canPerform() {
+      if (tep_not_null($this->_module)) {
+        return $GLOBALS[$this->_module]->canPerform($this->_user_id, $this->_user_name);
+      }
+
+      return false;
+    }
+
+    function getTitle() {
+      if (tep_not_null($this->_module)) {
+        return $GLOBALS[$this->_module]->title;
+      }
+    }
+
+    function getIdentifier() {
+      if (tep_not_null($this->_module)) {
+        return $GLOBALS[$this->_module]->identifier;
+      }
+    }
+
+    function record($success = true) {
+      if (tep_not_null($this->_module)) {
+        tep_db_query("insert into " . TABLE_ACTION_RECORDER . " (module, user_id, user_name, identifier, success, date_added) values ('" . tep_db_input($this->_module) . "', '" . (int)$this->_user_id . "', '" . tep_db_input($this->_user_name) . "', '" . tep_db_input($this->getIdentifier()) . "', '" . ($success == true ? 1 : 0) . "', now())");
+      }
+    }
+
+    function expireEntries() {
+      if (tep_not_null($this->_module)) {
+        return $GLOBALS[$this->_module]->expireEntries();
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/boxes.php 2.3.1.src/includes/classes/boxes.php
--- 2.2rc2a.cp.src/includes/classes/boxes.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/boxes.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: boxes.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/breadcrumb.php 2.3.1.src/includes/classes/breadcrumb.php
--- 2.2rc2a.cp.src/includes/classes/breadcrumb.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/breadcrumb.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: breadcrumb.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/cc_validation.php 2.3.1.src/includes/classes/cc_validation.php
--- 2.2rc2a.cp.src/includes/classes/cc_validation.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/cc_validation.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cc_validation.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,21 +14,21 @@
     var $cc_type, $cc_number, $cc_expiry_month, $cc_expiry_year;
 
     function validate($number, $expiry_m, $expiry_y) {
-      $this->cc_number = ereg_replace('[^0-9]', '', $number);
+      $this->cc_number = preg_replace('/[^0-9]/', '', $number);
 
-      if (ereg('^4[0-9]{12}([0-9]{3})?$', $this->cc_number)) {
+      if (preg_match('/^4[0-9]{12}([0-9]{3})?$/', $this->cc_number)) {
         $this->cc_type = 'Visa';
-      } elseif (ereg('^5[1-5][0-9]{14}$', $this->cc_number)) {
+      } elseif (preg_match('/^5[1-5][0-9]{14}$/', $this->cc_number)) {
         $this->cc_type = 'Master Card';
-      } elseif (ereg('^3[47][0-9]{13}$', $this->cc_number)) {
+      } elseif (preg_match('/^3[47][0-9]{13}$/', $this->cc_number)) {
         $this->cc_type = 'American Express';
-      } elseif (ereg('^3(0[0-5]|[68][0-9])[0-9]{11}$', $this->cc_number)) {
+      } elseif (preg_match('/^3(0[0-5]|[68][0-9])[0-9]{11}$/', $this->cc_number)) {
         $this->cc_type = 'Diners Club';
-      } elseif (ereg('^6011[0-9]{12}$', $this->cc_number)) {
+      } elseif (preg_match('/^6011[0-9]{12}$/', $this->cc_number)) {
         $this->cc_type = 'Discover';
-      } elseif (ereg('^(3[0-9]{4}|2131|1800)[0-9]{11}$', $this->cc_number)) {
+      } elseif (preg_match('/^(3[0-9]{4}|2131|1800)[0-9]{11}$/', $this->cc_number)) {
         $this->cc_type = 'JCB';
-      } elseif (ereg('^5610[0-9]{12}$', $this->cc_number)) { 
+      } elseif (preg_match('/^5610[0-9]{12}$/', $this->cc_number)) {
         $this->cc_type = 'Australian BankCard';
       } else {
         return -1;
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/currencies.php 2.3.1.src/includes/classes/currencies.php
--- 2.2rc2a.cp.src/includes/classes/currencies.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: currencies.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/email.php 2.3.1.src/includes/classes/email.php
--- 2.2rc2a.cp.src/includes/classes/email.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/email.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: email.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -156,7 +156,7 @@
  */
 
     function add_html($html, $text = NULL, $images_dir = NULL) {
-      $this->html = tep_convert_linefeeds(array("\r\n", "\n", "\r"), '<br>', $html);
+      $this->html = tep_convert_linefeeds(array("\r\n", "\n", "\r"), '<br />', $html);
       $this->html_text = tep_convert_linefeeds(array("\r\n", "\n", "\r"), $this->lf, $text);
 
       if (isset($images_dir)) $this->find_html_images($images_dir);
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/http_client.php 2.3.1.src/includes/classes/http_client.php
--- 2.2rc2a.cp.src/includes/classes/http_client.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/http_client.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: http_client.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -386,7 +386,7 @@
         $str = fgets($this->socket, 1024);
         $finished = ($str == $lastLine);
         if (!$finished) {
-          list($hdr, $value) = split(': ', $str, 2);
+          list($hdr, $value) = explode(': ', $str, 2);
 // nasty workaround broken multiple same headers (eg. Set-Cookie headers) @FIXME 
           if (isset($headers[$hdr])) {
             $headers[$hdr] .= '; ' . trim($value);
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/language.php 2.3.1.src/includes/classes/language.php
--- 2.2rc2a.cp.src/includes/classes/language.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/language.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: language.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -84,7 +84,7 @@
       for ($i=0, $n=sizeof($this->browser_languages); $i<$n; $i++) {
         reset($this->languages);
         while (list($key, $value) = each($this->languages)) {
-          if (eregi('^(' . $value . ')(;q=[0-9]\\.[0-9])?$', $this->browser_languages[$i]) && isset($this->catalog_languages[$key])) {
+          if (preg_match('/^(' . $value . ')(;q=[0-9]\\.[0-9])?$/i', $this->browser_languages[$i]) && isset($this->catalog_languages[$key])) {
             $this->language = $this->catalog_languages[$key];
             break 2;
           }
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/message_stack.php 2.3.1.src/includes/classes/message_stack.php
--- 2.2rc2a.cp.src/includes/classes/message_stack.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/message_stack.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: message_stack.php 1740 2007-12-20 14:57:13Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/mime.php 2.3.1.src/includes/classes/mime.php
--- 2.2rc2a.cp.src/includes/classes/mime.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/mime.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: mime.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/navigation_history.php 2.3.1.src/includes/classes/navigation_history.php
--- 2.2rc2a.cp.src/includes/classes/navigation_history.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/navigation_history.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: navigation_history.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -109,18 +109,18 @@
           echo $key . '=' . $value . '&';
         }
         if (sizeof($this->path[$i]['post']) > 0) {
-          echo '<br>';
+          echo '<br />';
           while (list($key, $value) = each($this->path[$i]['post'])) {
-            echo '&nbsp;&nbsp;<b>' . $key . '=' . $value . '</b><br>';
+            echo '&nbsp;&nbsp;<strong>' . $key . '=' . $value . '</strong><br />';
           }
         }
-        echo '<br>';
+        echo '<br />';
       }
 
       if (sizeof($this->snapshot) > 0) {
-        echo '<br><br>';
+        echo '<br /><br />';
 
-        echo $this->snapshot['mode'] . ' ' . $this->snapshot['page'] . '?' . tep_array_to_string($this->snapshot['get'], array(tep_session_name())) . '<br>';
+        echo $this->snapshot['mode'] . ' ' . $this->snapshot['page'] . '?' . tep_array_to_string($this->snapshot['get'], array(tep_session_name())) . '<br />';
       }
     }
 
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/order.php 2.3.1.src/includes/classes/order.php
--- 2.2rc2a.cp.src/includes/classes/order.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/order.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: order.php 1750 2007-12-21 05:20:28Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/order_total.php 2.3.1.src/includes/classes/order_total.php
--- 2.2rc2a.cp.src/includes/classes/order_total.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/order_total.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: order_total.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/osc_template.php 2.3.1.src/includes/classes/osc_template.php
--- 2.2rc2a.cp.src/includes/classes/osc_template.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/classes/osc_template.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,101 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class oscTemplate {
+    var $_title;
+    var $_blocks = array();
+    var $_grid_container_width = 24;
+    var $_grid_content_width = 16;
+    var $_grid_column_width = 4;
+
+    function oscTemplate() {
+      $this->_title = TITLE;
+    }
+
+    function setGridContainerWidth($width) {
+      $this->_grid_container_width = $width;
+    }
+
+    function getGridContainerWidth() {
+      return $this->_grid_container_width;
+    }
+
+    function setGridContentWidth($width) {
+      $this->_grid_content_width = $width;
+    }
+
+    function getGridContentWidth() {
+      return $this->_grid_content_width;
+    }
+
+    function setGridColumnWidth($width) {
+      $this->_grid_column_width = $width;
+    }
+
+    function getGridColumnWidth() {
+      return $this->_grid_column_width;
+    }
+
+    function setTitle($title) {
+      $this->_title = $title;
+    }
+
+    function getTitle() {
+      return $this->_title;
+    }
+
+    function addBlock($block, $group) {
+      $this->_blocks[$group][] = $block;
+    }
+
+    function hasBlocks($group) {
+      return (isset($this->_blocks[$group]) && !empty($this->_blocks[$group]));
+    }
+
+    function getBlocks($group) {
+      if ($this->hasBlocks($group)) {
+        return implode("\n", $this->_blocks[$group]);
+      }
+    }
+
+    function buildBlocks() {
+      global $language;
+
+      if ( defined('TEMPLATE_BLOCK_GROUPS') && tep_not_null(TEMPLATE_BLOCK_GROUPS) ) {
+        $tbgroups_array = explode(';', TEMPLATE_BLOCK_GROUPS);
+
+        foreach ($tbgroups_array as $group) {
+          $module_key = 'MODULE_' . strtoupper($group) . '_INSTALLED';
+
+          if ( defined($module_key) && tep_not_null(constant($module_key)) ) {
+            $modules_array = explode(';', constant($module_key));
+
+            foreach ( $modules_array as $module ) {
+              $class = substr($module, 0, strrpos($module, '.'));
+
+              if ( !class_exists($class) ) {
+                include(DIR_WS_LANGUAGES . $language . '/modules/' . $group . '/' . $module);
+                include(DIR_WS_MODULES . $group . '/' . $class . '.php');
+              }
+
+              $mb = new $class();
+
+              if ( $mb->isEnabled() ) {
+                $mb->execute();
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/passwordhash.php 2.3.1.src/includes/classes/passwordhash.php
--- 2.2rc2a.cp.src/includes/classes/passwordhash.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/classes/passwordhash.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,254 @@
+<?php
+#
+# Portable PHP password hashing framework.
+#
+# Version 0.3 / genuine.
+# Version 0.3 / osCommerce (silenced @is_readable('/dev/urandom'))
+#
+# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
+# the public domain.  Revised in subsequent years, still public domain.
+#
+# There's absolutely no warranty.
+#
+# The homepage URL for this framework is:
+#
+#	http://www.openwall.com/phpass/
+#
+# Please be sure to update the Version line if you edit this file in any way.
+# It is suggested that you leave the main version number intact, but indicate
+# your project name (after the slash) and add your own revision information.
+#
+# Please do not change the "private" password hashing method implemented in
+# here, thereby making your hashes incompatible.  However, if you must, please
+# change the hash type identifier (the "$P$") to something different.
+#
+# Obviously, since this code is in the public domain, the above are not
+# requirements (there can be none), but merely suggestions.
+#
+class PasswordHash {
+	var $itoa64;
+	var $iteration_count_log2;
+	var $portable_hashes;
+	var $random_state;
+
+	function PasswordHash($iteration_count_log2, $portable_hashes)
+	{
+		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
+			$iteration_count_log2 = 8;
+		$this->iteration_count_log2 = $iteration_count_log2;
+
+		$this->portable_hashes = $portable_hashes;
+
+		$this->random_state = microtime();
+		if (function_exists('getmypid'))
+			$this->random_state .= getmypid();
+	}
+
+	function get_random_bytes($count)
+	{
+		$output = '';
+		if (@is_readable('/dev/urandom') &&
+		    ($fh = @fopen('/dev/urandom', 'rb'))) {
+			$output = fread($fh, $count);
+			fclose($fh);
+		}
+
+		if (strlen($output) < $count) {
+			$output = '';
+			for ($i = 0; $i < $count; $i += 16) {
+				$this->random_state =
+				    md5(microtime() . $this->random_state);
+				$output .=
+				    pack('H*', md5($this->random_state));
+			}
+			$output = substr($output, 0, $count);
+		}
+
+		return $output;
+	}
+
+	function encode64($input, $count)
+	{
+		$output = '';
+		$i = 0;
+		do {
+			$value = ord($input[$i++]);
+			$output .= $this->itoa64[$value & 0x3f];
+			if ($i < $count)
+				$value |= ord($input[$i]) << 8;
+			$output .= $this->itoa64[($value >> 6) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			if ($i < $count)
+				$value |= ord($input[$i]) << 16;
+			$output .= $this->itoa64[($value >> 12) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			$output .= $this->itoa64[($value >> 18) & 0x3f];
+		} while ($i < $count);
+
+		return $output;
+	}
+
+	function gensalt_private($input)
+	{
+		$output = '$P$';
+		$output .= $this->itoa64[min($this->iteration_count_log2 +
+			((PHP_VERSION >= '5') ? 5 : 3), 30)];
+		$output .= $this->encode64($input, 6);
+
+		return $output;
+	}
+
+	function crypt_private($password, $setting)
+	{
+		$output = '*0';
+		if (substr($setting, 0, 2) == $output)
+			$output = '*1';
+
+		$id = substr($setting, 0, 3);
+		# We use "$P$", phpBB3 uses "$H$" for the same thing
+		if ($id != '$P$' && $id != '$H$')
+			return $output;
+
+		$count_log2 = strpos($this->itoa64, $setting[3]);
+		if ($count_log2 < 7 || $count_log2 > 30)
+			return $output;
+
+		$count = 1 << $count_log2;
+
+		$salt = substr($setting, 4, 8);
+		if (strlen($salt) != 8)
+			return $output;
+
+		# We're kind of forced to use MD5 here since it's the only
+		# cryptographic primitive available in all versions of PHP
+		# currently in use.  To implement our own low-level crypto
+		# in PHP would result in much worse performance and
+		# consequently in lower iteration counts and hashes that are
+		# quicker to crack (by non-PHP code).
+		if (PHP_VERSION >= '5') {
+			$hash = md5($salt . $password, TRUE);
+			do {
+				$hash = md5($hash . $password, TRUE);
+			} while (--$count);
+		} else {
+			$hash = pack('H*', md5($salt . $password));
+			do {
+				$hash = pack('H*', md5($hash . $password));
+			} while (--$count);
+		}
+
+		$output = substr($setting, 0, 12);
+		$output .= $this->encode64($hash, 16);
+
+		return $output;
+	}
+
+	function gensalt_extended($input)
+	{
+		$count_log2 = min($this->iteration_count_log2 + 8, 24);
+		# This should be odd to not reveal weak DES keys, and the
+		# maximum valid value is (2**24 - 1) which is odd anyway.
+		$count = (1 << $count_log2) - 1;
+
+		$output = '_';
+		$output .= $this->itoa64[$count & 0x3f];
+		$output .= $this->itoa64[($count >> 6) & 0x3f];
+		$output .= $this->itoa64[($count >> 12) & 0x3f];
+		$output .= $this->itoa64[($count >> 18) & 0x3f];
+
+		$output .= $this->encode64($input, 3);
+
+		return $output;
+	}
+
+	function gensalt_blowfish($input)
+	{
+		# This one needs to use a different order of characters and a
+		# different encoding scheme from the one in encode64() above.
+		# We care because the last character in our encoded string will
+		# only represent 2 bits.  While two known implementations of
+		# bcrypt will happily accept and correct a salt string which
+		# has the 4 unused bits set to non-zero, we do not want to take
+		# chances and we also do not want to waste an additional byte
+		# of entropy.
+		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+		$output = '$2a$';
+		$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
+		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
+		$output .= '$';
+
+		$i = 0;
+		do {
+			$c1 = ord($input[$i++]);
+			$output .= $itoa64[$c1 >> 2];
+			$c1 = ($c1 & 0x03) << 4;
+			if ($i >= 16) {
+				$output .= $itoa64[$c1];
+				break;
+			}
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 4;
+			$output .= $itoa64[$c1];
+			$c1 = ($c2 & 0x0f) << 2;
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 6;
+			$output .= $itoa64[$c1];
+			$output .= $itoa64[$c2 & 0x3f];
+		} while (1);
+
+		return $output;
+	}
+
+	function HashPassword($password)
+	{
+		$random = '';
+
+		if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
+			$random = $this->get_random_bytes(16);
+			$hash =
+			    crypt($password, $this->gensalt_blowfish($random));
+			if (strlen($hash) == 60)
+				return $hash;
+		}
+
+		if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
+			if (strlen($random) < 3)
+				$random = $this->get_random_bytes(3);
+			$hash =
+			    crypt($password, $this->gensalt_extended($random));
+			if (strlen($hash) == 20)
+				return $hash;
+		}
+
+		if (strlen($random) < 6)
+			$random = $this->get_random_bytes(6);
+		$hash =
+		    $this->crypt_private($password,
+		    $this->gensalt_private($random));
+		if (strlen($hash) == 34)
+			return $hash;
+
+		# Returning '*' on error is safe here, but would _not_ be safe
+		# in a crypt(3)-like function used _both_ for generating new
+		# hashes and for validating passwords against existing hashes.
+		return '*';
+	}
+
+	function CheckPassword($password, $stored_hash)
+	{
+		$hash = $this->crypt_private($password, $stored_hash);
+		if ($hash[0] == '*')
+			$hash = crypt($password, $stored_hash);
+
+		return $hash == $stored_hash;
+	}
+}
+
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/payment.php 2.3.1.src/includes/classes/payment.php
--- 2.2rc2a.cp.src/includes/classes/payment.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/payment.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: payment.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -80,7 +80,7 @@
     function javascript_validation() {
       $js = '';
       if (is_array($this->modules)) {
-        $js = '<script language="javascript"><!-- ' . "\n" .
+        $js = '<script type="text/javascript"><!-- ' . "\n" .
               'function check_form() {' . "\n" .
               '  var error = 0;' . "\n" .
               '  var error_message = "' . JS_ERROR . '";' . "\n" .
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/sessions.php 2.3.1.src/includes/classes/sessions.php
--- 2.2rc2a.cp.src/includes/classes/sessions.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/sessions.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,521 +0,0 @@
-<?php
-/*
-  $Id: sessions.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-
-  Original source from Web Application Development with PHP (Tobias Ratschiller, Till Gerken)
-  Copyright (c) 2000, New Riders Publishing
-*/
-
-  $SID = '';
-
-  class php3session {
-    var $name = PHP_SESSION_NAME;
-    var $auto_start = false;
-    var $referer_check = false;
-
-    var $save_path = PHP_SESSION_SAVE_PATH;
-    var $save_handler = 'php3session_files';
-
-    var $lifetime = 0;
-
-    var $cache_limiter = 'nocache';
-    var $cache_expire = 180;
-
-    var $use_cookies = true;
-    var $cookie_lifetime = 0;
-    var $cookie_path = PHP_SESSION_PATH;
-    var $cookie_domain = PHP_SESSION_DOMAIN;
-
-    var $gc_probability = 1;
-    var $gc_maxlifetime = 0;
-
-    var $serialize_handler = 'php';
-    var $ID;
-
-    var $nr_open_sessions = 0;
-    var $mod_name = '';
-    var $id;
-    var $delimiter = "\n";
-    var $delimiter_value = '[==]';
-
-    var $vars;
-
-    function php3session() {
-      $this->mod_name = $this->save_handler;
-      $this->vars = array();
-    }
-  }
-
-  class php3session_user {
-    var $open_func, $close_func, $read_func, $write_func, $destroy_func, $gc_func;
-
-    function open($save_path, $sess_name) {
-      $func = $this->open_func;
-      if (function_exists($func)) {
-        return $func($save_path, $sess_name);
-      }
-
-      return true;
-    }
-
-    function close($save_path, $sess_name) {
-      $func = $this->close_func;
-      if (function_exists($func)) {
-        return $func();
-      }
-
-      return true;
-    }
-
-    function read($sess_id) {
-      $func = $this->read_func;
-
-      return $func($sess_id);
-    }
-
-    function write($sess_id, $val) {
-      $func = $this->write_func;
-
-      return $func($sess_id, $val);
-    }
-
-    function destroy($sess_id) {
-      $func = $this->destroy_func;
-      if (function_exists($func)) {
-        return $func($sess_id);
-      }
-
-      return true;
-    }
-
-    function gc($max_lifetime) {
-      $func = $this->gc_func;
-      if (function_exists($func)) {
-        return $func($max_lifetime);
-      }
-
-      return true;
-    }
-  }
-
-  class php3session_files {
-    function open($save_path, $sess_name) {
-      return true;
-    }
-
-    function close() {
-      return true;
-    }
-
-    function read($sess_id) {
-      global $session;
-
-// Open, read in, close file with session data
-      $file = $session->save_path . '/sess_' . $sess_id;
-      if (!file_exists($file)) {
-// Create it
-        touch($file);
-      }
-      $fp = fopen($file, 'r') or die('Could not open session file (' . $file . ').');
-      $val = fread($fp, filesize($file));
-      fclose($fp);
-
-      return $val;
-    }
-
-    function write($sess_id, $val) {
-      global $session;
-
-// Open, write to, close file with session data
-      $file = $session->save_path . '/sess_' . $sess_id;
-      $fp = fopen($file, 'w') or die('Could not write session file (' . $file . ')');
-      $val = fputs($fp, $val);
-      fclose($fp);
-
-      return true;
-    }
-
-    function destroy($sess_id) {
-      global $session;
-
-      $file = $session->save_path . '/sess_' . $sess_id;
-      unlink($file);
-
-      return true;
-    }
-
-    function gc($max_lifetime) {
-// We return true, since all cleanup should be handled by
-// an external entity (i.e. find -ctime x | xargs rm)
-      return true;
-    }
-  }
-
-  function _session_create_id() {
-    return md5(uniqid(microtime()));
-  }
-
-  function _session_cache_limiter() {
-    global $session;
-
-    switch ($session->cache_limiter) {
-      case 'nocache':
-                      header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
-                      header('Cache-Control: no-cache');
-                      header('Pragma: no-cache');
-                      break;
-      case 'private':
-                      header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
-                      header(sprintf('Cache-Control: private, max-age=%s', $session->cache_expire * 60));
-                      header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime(basename($GLOBALS['PHP_SELF']))) . ' GMT');
-                      break;
-      case 'public':
-                      $now = time();
-                      $now += $session->cache_expire * 60;
-                      $now = gmdate('D, d M Y H:i:s', $now) . ' GMT';
-                      header('Expires: ' . $now);
-                      header(sprintf('Cache-Control: public, max-age=%s', $session->cache_expire * 60));
-                      header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime(basename($GLOBALS['PHP_SELF']))) . ' GMT');
-                      break;
-      default:
-                      die('Caching method ' . $session->cache_limiter . ' not implemented.');
-    }
-  }
-
-  function _php_encode() {
-    global $session;
-
-    $ret = '';
-// Create a string containing the serialized variables
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      $ret .= $session->vars[$i] . $session->delimiter_value . serialize($GLOBALS[$session->vars[$i]]) . $session->delimiter;
-    }
-
-    return $ret;
-  }
-
-  function _php_decode($data) {
-    global $session;
-
-    $data = trim($data);
-    $vars = explode($session->delimiter, $data);
-
-// Add the variables to the global namespace
-    for (reset($vars); list($i)=each($vars);) {
-      $tmp = explode($session->delimiter_value, $vars[$i]);
-      $name = trim($tmp[0]);
-      $value = trim($tmp[1]);
-      $GLOBALS[$name] = unserialize($value);
-      $session->vars[] = trim($name);
-    }
-  }
-
-  function _wddx_encode($data) {
-    global $session;
-
-    $ret = wddx_serialize_vars($session->vars);
-
-    return $ret;
-  }
-
-  function _wddx_decode($data) {
-    return wddx_deserialize($data);
-  }
-
-  function session_name($name = '') {
-    global $session;
-
-    if (empty($name)) {
-      return $session->name;
-    }
-
-    $session->name = $name;
-  }
-
-  function session_set_save_handler($open, $close, $read, $write, $destroy, $gc) {
-    global $session, $php3session_user;
-
-    $php3session_user = new php3session_user;
-    $php3session_user->open_func = $open;
-    $php3session_user->close_func = $close;
-    $php3session_user->read_func = $read;
-    $php3session_user->write_func = $write;
-    $php3session_user->destroy_func = $destroy;
-    $php3session_user->gc_func = $gc;
-    $session->mod_name = 'php3session_user';
-  }
-
-  function session_module_name($name = '') {
-    global $session;
-
-    if (empty($name)) {
-      return $session->mod_name;
-    }
-
-    $session->mod_name = $name;
-  }
-
-  function session_save_path($path = '') {
-    global $session;
-
-    if(empty($path)) {
-      return $session->save_path;
-    }
-
-    $session->save_path = $path;
-  }
-
-  function session_id($id = '') {
-    global $session;
-
-    if(empty($id)) {
-      return $session->id;
-    }
-
-    $session->id = $id;
-  }
-
-  function session_register($var) {
-    global $session;
-
-    if ($session->nr_open_sessions == 0) {
-      session_start();
-    }
-
-    $session->vars[] = trim($var);
-  }
-
-  function session_unregister($var) {
-    global $session;
-
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      if ($session->vars[$i] == trim($var)) {
-        unset($session->vars[$i]);
-        break;
-      }
-    }
-  }
-
-  function session_is_registered($var) {
-    global $session;
-
-    for (reset($session->vars); list($i)=each($session->vars);) {
-      if ($session->vars[$i] == trim($var)) {
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  function session_encode() {
-    global $session;
-
-    $serializer = '_' . $session->serialize_handler . '_encode';
-    $ret = $serializer();
-
-    return $ret;
-  }
-
-  function session_decode($data) {
-    global $session;
-
-    $serializer = '_' . $session->serialize_handler . '_decode';
-    $ret = $serializer($data);
-
-    return $ret;
-  }
-
-  function session_start() {
-    global $session, $SID, $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS;
-
-// Define the global variable $SID?
-    $define_sid = true;
-
-// Send the session cookie?
-    $send_cookie = true;
-
-// Is track_vars enabled?
-    $track_vars = ( (isset($HTTP_COOKIE_VARS)) || (isset($HTTP_GET_VARS)) || (isset($HTTP_POST_VARS)) ) ? true : false;
-
-// Check if session_start() has been called once already
-    if ($session->nr_open_sessions != 0) {
-      return false;
-    }
-
-// If our only resource is the global symbol_table, then check it.
-// If track_vars are enabled, we prefer these, because they are more
-// reliable, and we always know whether the user has accepted the 
-// cookie.
-    if ( (isset($GLOBALS[$session->name])) && (!empty($GLOBALS[$session->name])) && (!$track_vars) ) {
-      $session->id = $GLOBALS[$session->name];
-      $send_cookie = false;
-    }
-
-// Now check the track_vars. Cookies are preferred, because initially
-// cookie and get variables will be available. 
-    if ( (empty($session->id)) && ($track_vars) ) {
-      if (isset($HTTP_COOKIE_VARS[$session->name])) {
-        $session->id = $HTTP_COOKIE_VARS[$session->name];
-        $define_sid = false;
-        $send_cookie = false;
-      }
-
-      if (isset($HTTP_GET_VARS[$session->name])) {
-        $session->id = $HTTP_GET_VARS[$session->name];
-      }
-
-      if (isset($HTTP_POST_VARS[$session->name])) {
-        $session->id = $HTTP_POST_VARS[$session->name];
-      }
-    }
-
-    if (!empty($session->id)) {
-      if (preg_match('/^[a-zA-Z0-9]+$/', $session->id) == false) {
-        unset($session->id);
-      }
-    }
-
-/*
-// Check the REQUEST_URI symbol for a string of the form
-// '<session-name>=<session-id>' to allow URLs of the form
-// http://yoursite/<session-name>=<session-id>/script.php 
-    if (empty($session->id)) {
-      eregi($session->name . '=([^/]+)', $GLOBALS['REQUEST_URI'], $regs);
-      $regs[1] = trim($regs[1]);
-      if (!empty($regs[1])) {
-        $session->id = $regs[1];
-      }
-    }
-*/
-
-// Check whether the current request was referred to by
-// an external site which invalidates the previously found ID
-    if ( (!empty($session->id)) && ($session->referer_check) ) {
-      $url = parse_url($GLOBALS['HTTP_REFERER']);
-      if (trim($url['host']) != $GLOBALS['SERVER_NAME']) {
-        unset($session->id);
-        $send_cookie = true;
-        $define_sid = true;
-      }
-    }
-
-// Do we have an existing session ID?
-    if (empty($session->id)) {
-// Create new session ID
-      $session->id = _session_create_id();
-    }
-
-// Is use_cookies set to false?
-    if ( (!$session->use_cookies) && ($send_cookie) ) {
-      $define_sid = true;
-      $send_cookie = false;
-    }
-
-// Should we send a cookie?
-    if ($send_cookie) {
-      setcookie($session->name, $session->id, $session->cookie_lifetime, $session->cookie_path, $session->cookie_domain);
-    }
-
-// Should we define the SID?
-    if($define_sid) {
-      $SID = $session->name . '=' . $session->id;
-    }
-
-    $session->nr_open_sessions++;
-
-// Send caching headers
-
-// Start session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->open($session->save_path, $session->name)) {
-      die('Failed to initialize session module.');
-    }
-
-// Read session data
-    if ($val = $mod->read($session->id)) {
-// Decode session data
-      session_decode($val);
-    }
-
-// Send HTTP cache headers
-    _session_cache_limiter();
-
-// Check if we should clean up (call the garbage collection routines)
-    if ($session->gc_probability > 0) {
-      $randmax = getrandmax();
-      $nrand = (int)(100 * tep_rand() / $randmax);
-      if ($nrand < $session->gc_probability) {
-        $mod->gc($session->gc_maxlifetime);
-      }
-    }
-
-    if ($define_sid) {
-      define('SID', $SID);
-    } else {
-      define('SID', '');
-    }
-
-    return true;
-  }
-
-  function session_destroy() {
-    global $session;
-
-    if ($session->nr_open_sessions == 0) {
-      return false;
-    }
-
-// Destroy session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->destroy($session->id)) {
-      return false;
-    }
-    unset($session);
-    $session = new php3session;
-
-    return true;
-  }
-
-  function session_close() {
-    global $session, $SID;
-
-    if ($session->nr_open_sessions == 0) {
-      return false;
-    }
-// Encode session
-    $val = session_encode();
-    $len = strlen($val);
-
-// Save session
-    $mod = $GLOBALS[$session->mod_name];
-    if (!$mod->write($session->id, $val)) {
-      die('Session could not be saved.');
-    }
-// Close session
-    if ( (function_exists($session->mod_name . '->close')) && (!$mod->close()) ) {
-      die('Session could not be closed.');
-    }
-    $SID = '';
-    $session->nr_open_sessions--;
-
-    return true;
-  }
-
-  $session = new php3session;
-  $mod = $session->save_handler;
-  $$mod = new $mod;
-
-  if ($session->auto_start) {
-    $ret = session_start() or die('Session could not be started.');
-  }
-
-  register_shutdown_function('session_close');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/shipping.php 2.3.1.src/includes/classes/shipping.php
--- 2.2rc2a.cp.src/includes/classes/shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/shopping_cart.php 2.3.1.src/includes/classes/shopping_cart.php
--- 2.2rc2a.cp.src/includes/classes/shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -56,6 +56,9 @@
       }
 
       $this->cleanup();
+
+// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
+      $this->cartID = $this->generate_cart_id();
     }
 
     function reset($reset_database = false) {
@@ -87,14 +90,22 @@
 
       $attributes_pass_check = true;
 
-      if (is_array($attributes)) {
+      if (is_array($attributes) && !empty($attributes)) {
         reset($attributes);
         while (list($option, $value) = each($attributes)) {
           if (!is_numeric($option) || !is_numeric($value)) {
             $attributes_pass_check = false;
             break;
+          } else {
+            $check_query = tep_db_query("select products_attributes_id from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$products_id . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "' limit 1");
+            if (tep_db_num_rows($check_query) < 1) {
+              $attributes_pass_check = false;
+              break;
+            }
           }
         }
+      } elseif (tep_has_product_attributes($products_id)) {
+        $attributes_pass_check = false;
       }
 
       if (is_numeric($products_id) && is_numeric($qty) && ($attributes_pass_check == true)) {
diff -x .svn -aruN 2.2rc2a.cp.src/includes/classes/split_page_results.php 2.3.1.src/includes/classes/split_page_results.php
--- 2.2rc2a.cp.src/includes/classes/split_page_results.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/classes/split_page_results.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: split_page_results.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -95,7 +95,7 @@
 // page nn button
       for ($jump_to_page = 1 + (($cur_window_num - 1) * $max_page_links); ($jump_to_page <= ($cur_window_num * $max_page_links)) && ($jump_to_page <= $this->number_of_pages); $jump_to_page++) {
         if ($jump_to_page == $this->current_page_number) {
-          $display_links_string .= '&nbsp;<b>' . $jump_to_page . '</b>&nbsp;';
+          $display_links_string .= '&nbsp;<strong>' . $jump_to_page . '</strong>&nbsp;';
         } else {
           $display_links_string .= '&nbsp;<a href="' . tep_href_link(basename($PHP_SELF), $parameters . $this->page_name . '=' . $jump_to_page, $request_type) . '" class="pageResults" title=" ' . sprintf(PREVNEXT_TITLE_PAGE_NO, $jump_to_page) . ' "><u>' . $jump_to_page . '</u></a>&nbsp;';
         }
diff -x .svn -aruN 2.2rc2a.cp.src/includes/column_left.php 2.3.1.src/includes/column_left.php
--- 2.2rc2a.cp.src/includes/column_left.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/column_left.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: column_left.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if ((USE_CACHE == 'true') && empty($SID)) {
-    echo tep_cache_categories_box();
-  } else {
-    include(DIR_WS_BOXES . 'categories.php');
-  }
-
-  if ((USE_CACHE == 'true') && empty($SID)) {
-    echo tep_cache_manufacturers_box();
-  } else {
-    include(DIR_WS_BOXES . 'manufacturers.php');
-  }
-
-  require(DIR_WS_BOXES . 'whats_new.php');
-  require(DIR_WS_BOXES . 'search.php');
-  require(DIR_WS_BOXES . 'information.php');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/column_right.php 2.3.1.src/includes/column_right.php
--- 2.2rc2a.cp.src/includes/column_right.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/column_right.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,47 +0,0 @@
-<?php
-/*
-  $Id: column_right.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  require(DIR_WS_BOXES . 'shopping_cart.php');
-
-  if (isset($HTTP_GET_VARS['products_id'])) include(DIR_WS_BOXES . 'manufacturer_info.php');
-
-  if (tep_session_is_registered('customer_id')) include(DIR_WS_BOXES . 'order_history.php');
-
-  if (isset($HTTP_GET_VARS['products_id'])) {
-    if (tep_session_is_registered('customer_id')) {
-      $check_query = tep_db_query("select count(*) as count from " . TABLE_CUSTOMERS_INFO . " where customers_info_id = '" . (int)$customer_id . "' and global_product_notifications = '1'");
-      $check = tep_db_fetch_array($check_query);
-      if ($check['count'] > 0) {
-        include(DIR_WS_BOXES . 'best_sellers.php');
-      } else {
-        include(DIR_WS_BOXES . 'product_notifications.php');
-      }
-    } else {
-      include(DIR_WS_BOXES . 'product_notifications.php');
-    }
-  } else {
-    include(DIR_WS_BOXES . 'best_sellers.php');
-  }
-
-  if (isset($HTTP_GET_VARS['products_id'])) {
-    if (basename($PHP_SELF) != FILENAME_TELL_A_FRIEND) include(DIR_WS_BOXES . 'tell_a_friend.php');
-  } else {
-    include(DIR_WS_BOXES . 'specials.php');
-  }
-
-  require(DIR_WS_BOXES . 'reviews.php');
-
-  if (substr(basename($PHP_SELF), 0, 8) != 'checkout') {
-    include(DIR_WS_BOXES . 'languages.php');
-    include(DIR_WS_BOXES . 'currencies.php');
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/counter.php 2.3.1.src/includes/counter.php
--- 2.2rc2a.cp.src/includes/counter.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/counter.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: counter.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/database_tables.php 2.3.1.src/includes/database_tables.php
--- 2.2rc2a.cp.src/includes/database_tables.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/database_tables.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: database_tables.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,7 @@
 */
 
 // define the database table names used in the project
+  define('TABLE_ACTION_RECORDER', 'action_recorder');
   define('TABLE_ADDRESS_BOOK', 'address_book');
   define('TABLE_ADDRESS_FORMAT', 'address_format');
   define('TABLE_ADMINISTRATORS', 'administrators');
@@ -42,6 +43,7 @@
   define('TABLE_PRODUCTS_ATTRIBUTES', 'products_attributes');
   define('TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD', 'products_attributes_download');
   define('TABLE_PRODUCTS_DESCRIPTION', 'products_description');
+  define('TABLE_PRODUCTS_IMAGES', 'products_images');
   define('TABLE_PRODUCTS_NOTIFICATIONS', 'products_notifications');
   define('TABLE_PRODUCTS_OPTIONS', 'products_options');
   define('TABLE_PRODUCTS_OPTIONS_VALUES', 'products_options_values');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/filenames.php 2.3.1.src/includes/filenames.php
--- 2.2rc2a.cp.src/includes/filenames.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/filenames.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: filenames.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/footer.php 2.3.1.src/includes/footer.php
--- 2.2rc2a.cp.src/includes/footer.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/footer.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,38 +1,34 @@
 <?php
 /*
-  $Id: footer.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require(DIR_WS_INCLUDES . 'counter.php');
 ?>
-<table border="0" width="100%" cellspacing="0" cellpadding="1">
-  <tr class="footer">
-    <td class="footer">&nbsp;&nbsp;<?php echo strftime(DATE_FORMAT_LONG); ?>&nbsp;&nbsp;</td>
-    <td align="right" class="footer">&nbsp;&nbsp;<?php echo $counter_now . ' ' . FOOTER_TEXT_REQUESTS_SINCE . ' ' . $counter_startdate_formatted; ?>&nbsp;&nbsp;</td>
-  </tr>
-</table>
-<br>
-<table border="0" width="100%" cellspacing="0" cellpadding="0">
-  <tr>
-    <td align="center" class="smallText"><?php echo FOOTER_TEXT_BODY; ?></td>
-  </tr>
-</table>
+
+<div class="grid_24 footer">
+  <p align="center"><?php echo FOOTER_TEXT_BODY; ?></p>
+</div>
+
 <?php
   if ($banner = tep_banner_exists('dynamic', '468x50')) {
 ?>
-<br>
-<table border="0" width="100%" cellspacing="0" cellpadding="0">
-  <tr>
-    <td align="center"><?php echo tep_display_banner('static', $banner); ?></td>
-  </tr>
-</table>
+
+<div class="grid_24" style="text-align: center; padding-bottom: 20px;">
+  <?php echo tep_display_banner('static', $banner); ?>
+</div>
+
 <?php
   }
 ?>
+
+<script type="text/javascript">
+$('.productListTable tr:nth-child(even)').addClass('alt');
+</script>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/form_check.js.php 2.3.1.src/includes/form_check.js.php
--- 2.2rc2a.cp.src/includes/form_check.js.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/form_check.js.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: form_check.js.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -10,7 +10,7 @@
   Released under the GNU General Public License
 */
 ?>
-<script language="javascript"><!--
+<script type="text/javascript"><!--
 var form = "";
 var submitted = false;
 var error = false;
@@ -73,25 +73,6 @@
   }
 }
 
-function check_password_new(field_name_1, field_name_2, field_name_3, field_size, message_1, message_2, message_3) {
-  if (form.elements[field_name_1] && (form.elements[field_name_1].type != "hidden")) {
-    var password_current = form.elements[field_name_1].value;
-    var password_new = form.elements[field_name_2].value;
-    var password_confirmation = form.elements[field_name_3].value;
-
-    if (password_current.length < field_size) {
-      error_message = error_message + "* " + message_1 + "\n";
-      error = true;
-    } else if (password_new.length < field_size) {
-      error_message = error_message + "* " + message_2 + "\n";
-      error = true;
-    } else if (password_new != password_confirmation) {
-      error_message = error_message + "* " + message_3 + "\n";
-      error = true;
-    }
-  }
-}
-
 function check_form(form_name) {
   if (submitted == true) {
     alert("<?php echo JS_ERROR_SUBMITTED; ?>");
@@ -121,7 +102,7 @@
   check_input("telephone", <?php echo ENTRY_TELEPHONE_MIN_LENGTH; ?>, "<?php echo ENTRY_TELEPHONE_NUMBER_ERROR; ?>");
 
   check_password("password", "confirmation", <?php echo ENTRY_PASSWORD_MIN_LENGTH; ?>, "<?php echo ENTRY_PASSWORD_ERROR; ?>", "<?php echo ENTRY_PASSWORD_ERROR_NOT_MATCHING; ?>");
-  check_password_new("password_current", "password_new", "password_confirmation", <?php echo ENTRY_PASSWORD_MIN_LENGTH; ?>, "<?php echo ENTRY_PASSWORD_ERROR; ?>", "<?php echo ENTRY_PASSWORD_NEW_ERROR; ?>", "<?php echo ENTRY_PASSWORD_NEW_ERROR_NOT_MATCHING; ?>");
+  check_password("password_new", "password_confirmation", <?php echo ENTRY_PASSWORD_MIN_LENGTH; ?>, "<?php echo ENTRY_PASSWORD_NEW_ERROR; ?>", "<?php echo ENTRY_PASSWORD_NEW_ERROR_NOT_MATCHING; ?>");
 
   if (error == true) {
     alert(error_message);
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/banner.php 2.3.1.src/includes/functions/banner.php
--- 2.2rc2a.cp.src/includes/functions/banner.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/banner.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: banner.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -63,7 +63,7 @@
       if ($banners['count'] > 0) {
         $banner = tep_random_select("select banners_id, banners_title, banners_image, banners_html_text from " . TABLE_BANNERS . " where status = '1' and banners_group = '" . $identifier . "'");
       } else {
-        return '<b>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> No banners with group \'' . $identifier . '\' found!</b>';
+        return '<strong>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> No banners with group \'' . $identifier . '\' found!</strong>';
       }
     } elseif ($action == 'static') {
       if (is_array($identifier)) {
@@ -73,11 +73,11 @@
         if (tep_db_num_rows($banner_query)) {
           $banner = tep_db_fetch_array($banner_query);
         } else {
-          return '<b>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> Banner with ID \'' . $identifier . '\' not found, or status inactive</b>';
+          return '<strong>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> Banner with ID \'' . $identifier . '\' not found, or status inactive</strong>';
         }
       }
     } else {
-      return '<b>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> Unknown $action parameter value - it must be either \'dynamic\' or \'static\'</b>';
+      return '<strong>TEP ERROR! (tep_display_banner(' . $action . ', ' . $identifier . ') -> Unknown $action parameter value - it must be either \'dynamic\' or \'static\'</strong>';
     }
 
     if (tep_not_null($banner['banners_html_text'])) {
@@ -122,4 +122,4 @@
   function tep_update_banner_click_count($banner_id) {
     tep_db_query("update " . TABLE_BANNERS_HISTORY . " set banners_clicked = banners_clicked + 1 where banners_id = '" . (int)$banner_id . "' and date_format(banners_history_date, '%Y%m%d') = date_format(now(), '%Y%m%d')");
   }
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/cache.php 2.3.1.src/includes/functions/cache.php
--- 2.2rc2a.cp.src/includes/functions/cache.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/cache.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cache.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -98,15 +98,18 @@
 //! Cache the categories box
 // Cache the categories box
   function tep_cache_categories_box($auto_expire = false, $refresh = false) {
-    global $cPath, $language, $languages_id, $tree, $cPath_array, $categories_string;
+    global $cPath, $language;
 
     $cache_output = '';
 
     if (($refresh == true) || !read_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath, $auto_expire)) {
-      ob_start();
-      include(DIR_WS_BOXES . 'categories.php');
-      $cache_output = ob_get_contents();
-      ob_end_clean();
+      if (!class_exists('bm_categories')) {
+        include(DIR_WS_MODULES . 'boxes/bm_categories.php');
+      }
+
+      $bm_categories = new bm_categories();
+      $cache_output = $bm_categories->getData();
+
       write_cache($cache_output, 'categories_box-' . $language . '.cache' . $cPath);
     }
 
@@ -127,10 +130,13 @@
     }
 
     if (($refresh == true) || !read_cache($cache_output, 'manufacturers_box-' . $language . '.cache' . $manufacturers_id, $auto_expire)) {
-      ob_start();
-      include(DIR_WS_BOXES . 'manufacturers.php');
-      $cache_output = ob_get_contents();
-      ob_end_clean();
+      if (!class_exists('bm_manufacturers')) {
+        include(DIR_WS_MODULES . 'boxes/bm_manufacturers.php');
+      }
+
+      $bm_manufacturers = new bm_manufacturers();
+      $cache_output = $bm_manufacturers->getData();
+
       write_cache($cache_output, 'manufacturers_box-' . $language . '.cache' . $manufacturers_id);
     }
 
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/compatibility.php 2.3.1.src/includes/functions/compatibility.php
--- 2.2rc2a.cp.src/includes/functions/compatibility.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/compatibility.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: compatibility.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -49,131 +49,51 @@
     do_magic_quotes_gpc($HTTP_COOKIE_VARS);
   }
 
-  if (!function_exists('array_splice')) {
-    function array_splice(&$array, $maximum) {
-      if (sizeof($array) >= $maximum) {
-        for ($i=0; $i<$maximum; $i++) {
-          $new_array[$i] = $array[$i];
-        }
-        $array = $new_array;
-      }
-    }
-  }
-
-  if (!function_exists('in_array')) {
-    function in_array($lookup_value, $lookup_array) {
-      reset($lookup_array);
-      while (list($key, $value) = each($lookup_array)) {
-        if ($value == $lookup_value) return true;
-      }
-
-      return false;
-    }
+// set default timezone if none exists (PHP 5.3 throws an E_WARNING)
+  if ((strlen(ini_get('date.timezone')) < 1) && function_exists('date_default_timezone_set')) {
+    date_default_timezone_set(@date_default_timezone_get());
   }
 
-  if (!function_exists('array_reverse')) {
-    function array_reverse($array) {
-      for ($i=0, $n=sizeof($array); $i<$n; $i++) $array_reversed[$i] = $array[($n-$i-1)];
-
-      return $array_reversed;
-    }
-  }
-
-  if (!function_exists('constant')) {
-    function constant($constant) {
-      eval("\$temp=$constant;");
-
-      return $temp;
-    }
-  }
-
-  if (!function_exists('is_null')) {
-    function is_null($value) {
-      if (is_array($value)) {
-        if (sizeof($value) > 0) {
-          return false;
-        } else {
-          return true;
-        }
-      } else {
-        if (($value != '') && ($value != 'NULL') && (strlen(trim($value)) > 0)) {
-          return false;
-        } else {
-          return true;
+  if (!function_exists('checkdnsrr')) {
+    function checkdnsrr($host, $type) {
+      if(tep_not_null($host) && tep_not_null($type)) {
+        @exec("nslookup -type=" . escapeshellarg($type) . " " . escapeshellarg($host), $output);
+        while(list($k, $line) = each($output)) {
+          if(preg_match("/^$host/i", $line)) {
+            return true;
+          }
         }
       }
+      return false;
     }
   }
 
-  if (!function_exists('array_merge')) {
-    function array_merge($array1, $array2, $array3 = '') {
-      if (empty($array3) && !is_array($array3)) $array3 = array();
-      while (list($key, $val) = each($array1)) $array_merged[$key] = $val;
-      while (list($key, $val) = each($array2)) $array_merged[$key] = $val;
-      if (sizeof($array3) > 0) while (list($key, $val) = each($array3)) $array_merged[$key] = $val;
-
-      return (array) $array_merged;
-    }
-  }
-
-  if (!function_exists('is_numeric')) {
-    function is_numeric($param) {
-      return ereg('^[0-9]{1,50}.?[0-9]{0,50}$', $param);
-    }
-  }
-
-  if (!function_exists('array_slice')) {
-    function array_slice($array, $offset, $length = 0) {
-      if ($offset < 0 ) {
-        $offset = sizeof($array) + $offset;
-      }
-      $length = ((!$length) ? sizeof($array) : (($length < 0) ? sizeof($array) - $length : $length + $offset));
-      for ($i = $offset; $i<$length; $i++) {
-        $tmp[] = $array[$i];
-      }
-
-      return $tmp;
-    }
-  }
-
-  if (!function_exists('array_map')) {
-    function array_map($callback, $array) {
-      if (is_array($array)) {
-        $_new_array = array();
-        reset($array);
-        while (list($key, $value) = each($array)) {
-          $_new_array[$key] = array_map($callback, $array[$key]);
+/*
+ * stripos() natively supported from PHP 5.0
+ * From Pear::PHP_Compat
+ */
+
+  if (!function_exists('stripos')) {
+    function stripos($haystack, $needle, $offset = null) {
+      $fix = 0;
+
+      if (!is_null($offset)) {
+        if ($offset > 0) {
+          $haystack = substr($haystack, $offset, strlen($haystack) - $offset);
+          $fix = $offset;
         }
-        return $_new_array;
-      } else {
-        return $callback($array);
       }
-    }
-  }
 
-  if (!function_exists('str_repeat')) {
-    function str_repeat($string, $number) {
-      $repeat = '';
+      $segments = explode(strtolower($needle), strtolower($haystack), 2);
 
-      for ($i=0; $i<$number; $i++) {
-        $repeat .= $string;
+// Check there was a match
+      if (count($segments) == 1) {
+        return false;
       }
 
-      return $repeat;
-    }
-  }
+      $position = strlen($segments[0]) + $fix;
 
-  if (!function_exists('checkdnsrr')) {
-    function checkdnsrr($host, $type) {
-      if(tep_not_null($host) && tep_not_null($type)) {
-        @exec("nslookup -type=$type $host", $output);
-        while(list($k, $line) = each($output)) {
-          if(eregi("^$host", $line)) {
-            return true;
-          }
-        }
-      }
-      return false;
+      return $position;
     }
   }
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/database.php 2.3.1.src/includes/functions/database.php
--- 2.2rc2a.cp.src/includes/functions/database.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/database.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: database.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -31,7 +31,7 @@
   }
 
   function tep_db_error($query, $errno, $error) { 
-    die('<font color="#000000"><b>' . $errno . ' - ' . $error . '<br><br>' . $query . '<br><br><small><font color="#ff0000">[TEP STOP]</font></small><br><br></b></font>');
+    die('<font color="#000000"><strong>' . $errno . ' - ' . $error . '<br /><br />' . $query . '<br /><br /><small><font color="#ff0000">[TEP STOP]</font></small><br /><br /></strong></font>');
   }
 
   function tep_db_query($query, $link = 'db_link') {
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/general.php 2.3.1.src/includes/functions/general.php
--- 2.2rc2a.cp.src/includes/functions/general.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/general.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: general.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,18 @@
 */
 
 ////
+// Get the installed version number
+  function tep_get_version() {
+    static $v;
+
+    if (!isset($v)) {
+      $v = trim(implode('', file(DIR_FS_CATALOG . 'includes/version.php')));
+    }
+
+    return $v;
+  }
+
+////
 // Stop from parsing any further PHP code
   function tep_exit() {
    tep_session_close();
@@ -58,9 +70,9 @@
   }
 
   function tep_sanitize_string($string) {
-    $string = ereg_replace(' +', ' ', trim($string));
-
-    return preg_replace("/[<>]/", '_', $string);
+    $patterns = array ('/ +/','/[<>]/');
+    $replace = array (' ', '_');
+    return preg_replace($patterns, $replace, trim($string));
   }
 
 ////
@@ -96,7 +108,7 @@
 // Return a product's special price (returns nothing if there is no offer)
 // TABLES: products
   function tep_get_products_special_price($product_id) {
-    $product_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "' and status");
+    $product_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "' and status = 1");
     $product = tep_db_fetch_array($product_query);
 
     return $product['specials_new_products_price'];
@@ -160,7 +172,7 @@
     if (is_array($HTTP_GET_VARS) && (sizeof($HTTP_GET_VARS) > 0)) {
       reset($HTTP_GET_VARS);
       while (list($key, $value) = each($HTTP_GET_VARS)) {
-        if ( (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') ) {
+        if ( is_string($value) && (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') ) {
           $get_url .= $key . '=' . rawurlencode(stripslashes($value)) . '&';
         }
       }
@@ -311,6 +323,7 @@
 // TABLES: tax_rates, zones_to_geo_zones
   function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) {
     global $customer_zone_id, $customer_country_id;
+    static $tax_rates = array();
 
     if ( ($country_id == -1) && ($zone_id == -1) ) {
       if (!tep_session_is_registered('customer_id')) {
@@ -322,34 +335,45 @@
       }
     }
 
-    $tax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' group by tr.tax_priority");
-    if (tep_db_num_rows($tax_query)) {
-      $tax_multiplier = 1.0;
-      while ($tax = tep_db_fetch_array($tax_query)) {
-        $tax_multiplier *= 1.0 + ($tax['tax_rate'] / 100);
+    if (!isset($tax_rates[$class_id][$country_id][$zone_id]['rate'])) {
+      $tax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' group by tr.tax_priority");
+      if (tep_db_num_rows($tax_query)) {
+        $tax_multiplier = 1.0;
+        while ($tax = tep_db_fetch_array($tax_query)) {
+          $tax_multiplier *= 1.0 + ($tax['tax_rate'] / 100);
+        }
+
+        $tax_rates[$class_id][$country_id][$zone_id]['rate'] = ($tax_multiplier - 1.0) * 100;
+      } else {
+        $tax_rates[$class_id][$country_id][$zone_id]['rate'] = 0;
       }
-      return ($tax_multiplier - 1.0) * 100;
-    } else {
-      return 0;
     }
+
+    return $tax_rates[$class_id][$country_id][$zone_id]['rate'];
   }
 
 ////
 // Return the tax description for a zone / class
 // TABLES: tax_rates;
   function tep_get_tax_description($class_id, $country_id, $zone_id) {
-    $tax_query = tep_db_query("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' order by tr.tax_priority");
-    if (tep_db_num_rows($tax_query)) {
-      $tax_description = '';
-      while ($tax = tep_db_fetch_array($tax_query)) {
-        $tax_description .= $tax['tax_description'] . ' + ';
-      }
-      $tax_description = substr($tax_description, 0, -3);
+    static $tax_rates = array();
 
-      return $tax_description;
-    } else {
-      return TEXT_UNKNOWN_TAX_RATE;
+    if (!isset($tax_rates[$class_id][$country_id][$zone_id]['description'])) {
+      $tax_query = tep_db_query("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' order by tr.tax_priority");
+      if (tep_db_num_rows($tax_query)) {
+        $tax_description = '';
+        while ($tax = tep_db_fetch_array($tax_query)) {
+          $tax_description .= $tax['tax_description'] . ' + ';
+        }
+        $tax_description = substr($tax_description, 0, -3);
+
+        $tax_rates[$class_id][$country_id][$zone_id]['description'] = $tax_description;
+      } else {
+        $tax_rates[$class_id][$country_id][$zone_id]['description'] = TEXT_UNKNOWN_TAX_RATE;
+      }
     }
+
+    return $tax_rates[$class_id][$country_id][$zone_id]['description'];
   }
 
 ////
@@ -455,11 +479,11 @@
 
     if ($html) {
 // HTML Mode
-      $HR = '<hr>';
-      $hr = '<hr>';
+      $HR = '<hr />';
+      $hr = '<hr />';
       if ( ($boln == '') && ($eoln == "\n") ) { // Values not specified, use rational defaults
-        $CR = '<br>';
-        $cr = '<br>';
+        $CR = '<br />';
+        $cr = '<br />';
         $eoln = $cr;
       } else { // Use values supplied
         $CR = $eoln . $boln;
@@ -584,7 +608,7 @@
     if (@date('Y', mktime($hour, $minute, $second, $month, $day, $year)) == $year) {
       return date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, $year));
     } else {
-      return ereg_replace('2037' . '$', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
+      return preg_replace('/2037$/', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
     }
   }
 
@@ -594,7 +618,7 @@
     $search_str = trim(strtolower($search_str));
 
 // Break up $search_str on whitespace; quoted string will be reconstructed later
-    $pieces = split('[[:space:]]+', $search_str);
+    $pieces = preg_split('/[[:space:]]+/', $search_str);
     $objects = array();
     $tmpstring = '';
     $flag = '';
@@ -635,14 +659,14 @@
 */
 
 // Add this word to the $tmpstring, starting the $tmpstring
-        $tmpstring = trim(ereg_replace('"', ' ', $pieces[$k]));
+        $tmpstring = trim(preg_replace('/"/', ' ', $pieces[$k]));
 
 // Check for one possible exception to the rule. That there is a single quoted word.
         if (substr($pieces[$k], -1 ) == '"') {
 // Turn the flag off for future iterations
           $flag = 'off';
 
-          $objects[] = trim($pieces[$k]);
+          $objects[] = trim(preg_replace('/"/', ' ', $pieces[$k]));
 
           for ($j=0; $j<count($post_objects); $j++) {
             $objects[] = $post_objects[$j];
@@ -685,7 +709,7 @@
    $piece onto the tail of the string, push the $tmpstring onto the $haves,
    kill the $tmpstring, turn the $flag "off", and return.
 */
-            $tmpstring .= ' ' . trim(ereg_replace('"', ' ', $pieces[$k]));
+            $tmpstring .= ' ' . trim(preg_replace('/"/', ' ', $pieces[$k]));
 
 // Push the $tmpstring onto the array of stuff to search for
             $objects[] = trim($tmpstring);
@@ -914,7 +938,7 @@
 // Return a product ID with attributes
   function tep_get_uprid($prid, $params) {
     if (is_numeric($prid)) {
-      $uprid = $prid;
+      $uprid = (int)$prid;
 
       if (is_array($params) && (sizeof($params) > 0)) {
         $attributes_check = true;
@@ -974,7 +998,7 @@
     $pieces = explode('{', $uprid);
 
     if (is_numeric($pieces[0])) {
-      return $pieces[0];
+      return (int)$pieces[0];
     } else {
       return false;
     }
@@ -1012,7 +1036,7 @@
     if (SEND_EMAILS != 'true') return false;
 
     // Instantiate a new mail object
-    $message = new email(array('X-Mailer: osCommerce Mailer'));
+    $message = new email(array('X-Mailer: osCommerce'));
 
     // Build the text version
     $text = strip_tags($email_text);
@@ -1043,7 +1067,7 @@
 ////
 // Get the number of times a word/character is present in a string
   function tep_word_count($string, $needle) {
-    $temp_array = split($needle, $string);
+    $temp_array = preg_split('/' . $needle . '/', $string);
 
     return sizeof($temp_array);
   }
@@ -1053,12 +1077,12 @@
 
     if (empty($modules)) return $count;
 
-    $modules_array = split(';', $modules);
+    $modules_array = explode(';', $modules);
 
     for ($i=0, $n=sizeof($modules_array); $i<$n; $i++) {
       $class = substr($modules_array[$i], 0, strrpos($modules_array[$i], '.'));
 
-      if (is_object($GLOBALS[$class])) {
+      if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
         if ($GLOBALS[$class]->enabled) {
           $count++;
         }
@@ -1087,11 +1111,11 @@
         $char = chr(tep_rand(0,255));
       }
       if ($type == 'mixed') {
-        if (eregi('^[a-z0-9]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[a-z0-9]$/i', $char)) $rand_value .= $char;
       } elseif ($type == 'chars') {
-        if (eregi('^[a-z]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[a-z]$/i', $char)) $rand_value .= $char;
       } elseif ($type == 'digits') {
-        if (ereg('^[0-9]$', $char)) $rand_value .= $char;
+        if (preg_match('/^[0-9]$/i', $char)) $rand_value .= $char;
       }
     }
 
@@ -1227,28 +1251,64 @@
     setcookie($name, $value, $expire, $path, (tep_not_null($domain) ? $domain : ''), $secure);
   }
 
+  function tep_validate_ip_address($ip_address) {
+    if (function_exists('filter_var') && defined('FILTER_VALIDATE_IP')) {
+      return filter_var($ip_address, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4));
+    }
+
+    if (preg_match('/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip_address)) {
+      $parts = explode('.', $ip_address);
+
+      foreach ($parts as $ip_parts) {
+        if ( (intval($ip_parts) > 255) || (intval($ip_parts) < 0) ) {
+          return false; // number is not within 0-255
+        }
+      }
+
+      return true;
+    }
+
+    return false;
+  }
+
   function tep_get_ip_address() {
     global $HTTP_SERVER_VARS;
 
-    if (isset($HTTP_SERVER_VARS)) {
-      if (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) {
-        $ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
-      } elseif (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])) {
-        $ip = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
-      } else {
-        $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
+    $ip_address = null;
+    $ip_addresses = array();
+
+    if (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) && !empty($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) {
+      foreach ( array_reverse(explode(',', $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])) as $x_ip ) {
+        $x_ip = trim($x_ip);
+
+        if (tep_validate_ip_address($x_ip)) {
+          $ip_addresses[] = $x_ip;
+        }
       }
-    } else {
-      if (getenv('HTTP_X_FORWARDED_FOR')) {
-        $ip = getenv('HTTP_X_FORWARDED_FOR');
-      } elseif (getenv('HTTP_CLIENT_IP')) {
-        $ip = getenv('HTTP_CLIENT_IP');
-      } else {
-        $ip = getenv('REMOTE_ADDR');
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP']) && !empty($HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_X_CLUSTER_CLIENT_IP'];
+    }
+
+    if (isset($HTTP_SERVER_VARS['HTTP_PROXY_USER']) && !empty($HTTP_SERVER_VARS['HTTP_PROXY_USER'])) {
+      $ip_addresses[] = $HTTP_SERVER_VARS['HTTP_PROXY_USER'];
+    }
+
+    $ip_addresses[] = $HTTP_SERVER_VARS['REMOTE_ADDR'];
+
+    foreach ( $ip_addresses as $ip ) {
+      if (!empty($ip) && tep_validate_ip_address($ip)) {
+        $ip_address = $ip;
+        break;
       }
     }
 
-    return $ip;
+    return $ip_address;
   }
 
   function tep_count_customer_orders($id = '', $check_session = true) {
@@ -1300,7 +1360,7 @@
 // nl2br() prior PHP 4.2.0 did not convert linefeeds on all OSs (it only converted \n)
   function tep_convert_linefeeds($from, $to, $string) {
     if ((PHP_VERSION < "4.0.5") && is_array($from)) {
-      return ereg_replace('(' . implode('|', $from) . ')', $to, $string);
+      return preg_replace('/(' . implode('|', $from) . ')/', $to, $string);
     } else {
       return str_replace($from, $to, $string);
     }
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/gzip_compression.php 2.3.1.src/includes/functions/gzip_compression.php
--- 2.2rc2a.cp.src/includes/functions/gzip_compression.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/gzip_compression.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: gzip_compression.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/html_output.php 2.3.1.src/includes/functions/html_output.php
--- 2.2rc2a.cp.src/includes/functions/html_output.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/html_output.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: html_output.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,8 +15,10 @@
   function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
     global $request_type, $session_started, $SID;
 
+    $page = tep_output_string($page);
+
     if (!tep_not_null($page)) {
-      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine the page link!<br><br>');
+      die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />');
     }
 
     if ($connection == 'NONSSL') {
@@ -28,7 +30,7 @@
         $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
       }
     } else {
-      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL</b><br><br>');
+      die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL</strong><br /><br />');
     }
 
     if (tep_not_null($parameters)) {
@@ -52,18 +54,18 @@
       }
     }
 
-    if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
-      while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
+    if (isset($_sid)) {
+      $link .= $separator . tep_output_string($_sid);
+    }
+
+    while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
 
+    if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
       $link = str_replace('?', '/', $link);
       $link = str_replace('&', '/', $link);
       $link = str_replace('=', '/', $link);
-
-      $separator = '?';
-    }
-
-    if (isset($_sid)) {
-      $link .= $separator . tep_output_string($_sid);
+    } else {
+      $link = str_replace('&', '&amp;', $link);
     }
 
     return $link;
@@ -78,7 +80,7 @@
 
 // alt is added to the img tag even if it is null to prevent browsers from outputting
 // the image filename as default
-    $image = '<img src="' . tep_output_string($src) . '" border="0" alt="' . tep_output_string($alt) . '"';
+    $image = '<img src="' . tep_output_string($src) . '" alt="' . tep_output_string($alt) . '"';
 
     if (tep_not_null($alt)) {
       $image .= ' title=" ' . tep_output_string($alt) . ' "';
@@ -107,7 +109,7 @@
 
     if (tep_not_null($parameters)) $image .= ' ' . $parameters;
 
-    $image .= '>';
+    $image .= ' />';
 
     return $image;
   }
@@ -118,13 +120,13 @@
   function tep_image_submit($image, $alt = '', $parameters = '') {
     global $language;
 
-    $image_submit = '<input type="image" src="' . tep_output_string(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image) . '" border="0" alt="' . tep_output_string($alt) . '"';
+    $image_submit = '<input type="image" src="' . tep_output_string(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image) . '" alt="' . tep_output_string($alt) . '"';
 
     if (tep_not_null($alt)) $image_submit .= ' title=" ' . tep_output_string($alt) . ' "';
 
     if (tep_not_null($parameters)) $image_submit .= ' ' . $parameters;
 
-    $image_submit .= '>';
+    $image_submit .= ' />';
 
     return $image_submit;
   }
@@ -145,13 +147,19 @@
 
 ////
 // Output a form
-  function tep_draw_form($name, $action, $method = 'post', $parameters = '') {
+  function tep_draw_form($name, $action, $method = 'post', $parameters = '', $tokenize = false) {
+    global $sessiontoken;
+
     $form = '<form name="' . tep_output_string($name) . '" action="' . tep_output_string($action) . '" method="' . tep_output_string($method) . '"';
 
     if (tep_not_null($parameters)) $form .= ' ' . $parameters;
 
     $form .= '>';
 
+    if ( ($tokenize == true) && isset($sessiontoken) ) {
+      $form .= '<input type="hidden" name="formid" value="' . tep_output_string($sessiontoken) . '" />';
+    }
+
     return $form;
   }
 
@@ -176,7 +184,7 @@
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
-    $field .= '>';
+    $field .= ' />';
 
     return $field;
   }
@@ -197,12 +205,12 @@
     if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
 
     if ( ($checked == true) || (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name]) && (($HTTP_GET_VARS[$name] == 'on') || (stripslashes($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HTTP_POST_VARS[$name]) == $value))) ) {
-      $selection .= ' CHECKED';
+      $selection .= ' checked="checked"';
     }
 
     if (tep_not_null($parameters)) $selection .= ' ' . $parameters;
 
-    $selection .= '>';
+    $selection .= ' />';
 
     return $selection;
   }
@@ -221,10 +229,11 @@
 
 ////
 // Output a form textarea field
+// The $wrap parameter is no longer used in the core xhtml template
   function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
     global $HTTP_GET_VARS, $HTTP_POST_VARS;
 
-    $field = '<textarea name="' . tep_output_string($name) . '" wrap="' . tep_output_string($wrap) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
+    $field = '<textarea name="' . tep_output_string($name) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
@@ -264,7 +273,7 @@
 
     if (tep_not_null($parameters)) $field .= ' ' . $parameters;
 
-    $field .= '>';
+    $field .= ' />';
 
     return $field;
   }
@@ -301,7 +310,7 @@
     for ($i=0, $n=sizeof($values); $i<$n; $i++) {
       $field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
       if ($default == $values[$i]['id']) {
-        $field .= ' SELECTED';
+        $field .= ' selected="selected"';
       }
 
       $field .= '>' . tep_output_string($values[$i]['text'], array('"' => '&quot;', '\'' => '&#039;', '<' => '&lt;', '>' => '&gt;')) . '</option>';
@@ -325,4 +334,82 @@
 
     return tep_draw_pull_down_menu($name, $countries_array, $selected, $parameters);
   }
+
+////
+// Output a jQuery UI Button
+  function tep_draw_button($title = null, $icon = null, $link = null, $priority = null, $params = null) {
+    static $button_counter = 1;
+
+    $types = array('submit', 'button', 'reset');
+
+    if ( !isset($params['type']) ) {
+      $params['type'] = 'submit';
+    }
+
+    if ( !in_array($params['type'], $types) ) {
+      $params['type'] = 'submit';
+    }
+
+    if ( ($params['type'] == 'submit') && isset($link) ) {
+      $params['type'] = 'button';
+    }
+
+    if (!isset($priority)) {
+      $priority = 'secondary';
+    }
+
+    $button = '<span class="tdbLink">';
+
+    if ( ($params['type'] == 'button') && isset($link) ) {
+      $button .= '<a id="tdb' . $button_counter . '" href="' . $link . '"';
+
+      if ( isset($params['newwindow']) ) {
+        $button .= ' target="_blank"';
+      }
+    } else {
+      $button .= '<button id="tdb' . $button_counter . '" type="' . tep_output_string($params['type']) . '"';
+    }
+
+    if ( isset($params['params']) ) {
+      $button .= ' ' . $params['params'];
+    }
+
+    $button .= '>' . $title;
+
+    if ( ($params['type'] == 'button') && isset($link) ) {
+      $button .= '</a>';
+    } else {
+      $button .= '</button>';
+    }
+
+    $button .= '</span><script type="text/javascript">$("#tdb' . $button_counter . '").button(';
+
+    $args = array();
+
+    if ( isset($icon) ) {
+      if ( !isset($params['iconpos']) ) {
+        $params['iconpos'] = 'left';
+      }
+
+      if ( $params['iconpos'] == 'left' ) {
+        $args[] = 'icons:{primary:"ui-icon-' . $icon . '"}';
+      } else {
+        $args[] = 'icons:{secondary:"ui-icon-' . $icon . '"}';
+      }
+    }
+
+    if (empty($title)) {
+      $args[] = 'text:false';
+    }
+
+    if (!empty($args)) {
+      $button .= '{' . implode(',', $args) . '}';
+    }
+
+    $button .= ').addClass("ui-priority-' . $priority . '").parent().removeClass("tdbLink");</script>';
+
+    $button_counter++;
+
+    return $button;
+  }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/password_funcs.php 2.3.1.src/includes/functions/password_funcs.php
--- 2.2rc2a.cp.src/includes/functions/password_funcs.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/password_funcs.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,20 +1,41 @@
 <?php
 /*
-  $Id: password_funcs.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
 ////
-// This funstion validates a plain text password with an
-// encrpyted password
+// This function validates a plain text password with a
+// salted or phpass password
   function tep_validate_password($plain, $encrypted) {
     if (tep_not_null($plain) && tep_not_null($encrypted)) {
+      if (tep_password_type($encrypted) == 'salt') {
+        return tep_validate_old_password($plain, $encrypted);
+      }
+
+      if (!class_exists('PasswordHash')) {
+        include(DIR_WS_CLASSES . 'passwordhash.php');
+      }
+
+      $hasher = new PasswordHash(10, true);
+
+      return $hasher->CheckPassword($plain, $encrypted);
+    }
+
+    return false;
+  }
+
+////
+// This function validates a plain text password with a
+// salted password
+  function tep_validate_old_password($plain, $encrypted) {
+    if (tep_not_null($plain) && tep_not_null($encrypted)) {
 // split apart the hash / salt
       $stack = explode(':', $encrypted);
 
@@ -29,8 +50,22 @@
   }
 
 ////
-// This function makes a new password from a plaintext password. 
+// This function encrypts a phpass password from a plaintext
+// password.
   function tep_encrypt_password($plain) {
+    if (!class_exists('PasswordHash')) {
+      include(DIR_WS_CLASSES . 'passwordhash.php');
+    }
+
+    $hasher = new PasswordHash(10, true);
+
+    return $hasher->HashPassword($plain);
+  }
+
+////
+// This function encrypts a salted password from a plaintext
+// password.
+  function tep_encrypt_old_password($plain) {
     $password = '';
 
     for ($i=0; $i<10; $i++) {
@@ -43,4 +78,15 @@
 
     return $password;
   }
-?>
+
+////
+// This function returns the type of the encrpyted password
+// (phpass or salt)
+  function tep_password_type($encrypted) {
+    if (preg_match('/^[A-Z0-9]{32}\:[A-Z0-9]{2}$/i', $encrypted) === 1) {
+      return 'salt';
+    }
+
+    return 'phpass';
+  }
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/sessions.php 2.3.1.src/includes/functions/sessions.php
--- 2.2rc2a.cp.src/includes/functions/sessions.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/sessions.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: sessions.php 1830 2008-01-30 00:58:21Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/specials.php 2.3.1.src/includes/functions/specials.php
--- 2.2rc2a.cp.src/includes/functions/specials.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/validations.php 2.3.1.src/includes/functions/validations.php
--- 2.2rc2a.cp.src/includes/functions/validations.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/validations.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: validations.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -21,102 +21,55 @@
   //
   // Description : function for validating email address that conforms to RFC 822 specs
   //
-  //               This function is converted from a JavaScript written by
-  //               Sandeep V. Tamhankar (stamhankar@hotmail.com). The original JavaScript
-  //               is available at http://javascript.internet.com
+  //              This function will first attempt to validate the Email address using the filter
+  //              extension for performance. If this extension is not available it will
+  //              fall back to a regex based validator which doesn't validate all RFC822
+  //              addresses but catches 99.9% of them. The regex is based on the code found at
+  //              http://www.regular-expressions.info/email.html
+  //
+  //              Optional validation for validating the domain name is also valid is supplied
+  //              and can be enabled using the administration tool.
   //
   // Sample Valid Addresses:
   //
   //    first.last@host.com
   //    firstlast@host.to
-  //    "first last"@host.com
-  //    "first@last"@host.com
   //    first-last@host.com
-  //    first.last@[123.123.123.123]
+  //    first_last@host.com
   //
   // Invalid Addresses:
   //
   //    first last@host.com
-  //
+  //    first@last@host.com
   //
   ////////////////////////////////////////////////////////////////////////////////////////////////
   function tep_validate_email($email) {
-    $valid_address = true;
+    $email = trim($email);
 
-    $mail_pat = '^(.+)@(.+)$';
-    $valid_chars = "[^] \(\)<>@,;:\.\\\"\[]";
-    $atom = "$valid_chars+";
-    $quoted_user='(\"[^\"]*\")';
-    $word = "($atom|$quoted_user)";
-    $user_pat = "^$word(\.$word)*$";
-    $ip_domain_pat='^\[([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\]$';
-    $domain_pat = "^$atom(\.$atom)*$";
-
-    if (eregi($mail_pat, $email, $components)) {
-      $user = $components[1];
-      $domain = $components[2];
-      // validate user
-      if (eregi($user_pat, $user)) {
-        // validate domain
-        if (eregi($ip_domain_pat, $domain, $ip_components)) {
-          // this is an IP address
-      	  for ($i=1;$i<=4;$i++) {
-      	    if ($ip_components[$i] > 255) {
-      	      $valid_address = false;
-      	      break;
-      	    }
-          }
-        }
-        else {
-          // Domain is a name, not an IP
-          if (eregi($domain_pat, $domain)) {
-            /* domain name seems valid, but now make sure that it ends in a valid TLD or ccTLD
-               and that there's a hostname preceding the domain or country. */
-            $domain_components = explode(".", $domain);
-            // Make sure there's a host name preceding the domain.
-            if (sizeof($domain_components) < 2) {
-              $valid_address = false;
-            } else {
-              $top_level_domain = strtolower($domain_components[sizeof($domain_components)-1]);
-              // Allow all 2-letter TLDs (ccTLDs)
-              if (eregi('^[a-z][a-z]$', $top_level_domain) != 1) {
-                $tld_pattern = '';
-                // Get authorized TLDs from text file
-                $tlds = file(DIR_WS_INCLUDES . 'tld.txt');
-                while (list(,$line) = each($tlds)) {
-                  // Get rid of comments
-                  $words = explode('#', $line);
-                  $tld = trim($words[0]);
-                  // TLDs should be 3 letters or more
-                  if (eregi('^[a-z]{3,}$', $tld) == 1) {
-                    $tld_pattern .= '^' . $tld . '$|';
-                  }
-                }
-                // Remove last '|'
-                $tld_pattern = substr($tld_pattern, 0, -1);
-                if (eregi("$tld_pattern", $top_level_domain) == 0) {
-                    $valid_address = false;
-                }
-              }
-            }
-          }
-          else {
-      	    $valid_address = false;
-      	  }
-      	}
+    if ( strlen($email) > 255 ) {
+      $valid_address = false;
+    } elseif ( function_exists('filter_var') && defined('FILTER_VALIDATE_EMAIL') ) {
+     $valid_address = (bool)filter_var($email, FILTER_VALIDATE_EMAIL);
+    } else {
+      if ( substr_count( $email, '@' ) > 1 ) {
+        $valid_address = false;
       }
-      else {
+
+      if ( preg_match("/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i", $email) ) {
+        $valid_address = true;
+      } else {
         $valid_address = false;
       }
     }
-    else {
-      $valid_address = false;
-    }
+
     if ($valid_address && ENTRY_EMAIL_ADDRESS_CHECK == 'true') {
-      if (!checkdnsrr($domain, "MX") && !checkdnsrr($domain, "A")) {
+      $domain = explode('@', $email);
+
+      if ( !checkdnsrr($domain[1], "MX") && !checkdnsrr($domain[1], "A") ) {
         $valid_address = false;
       }
     }
+
     return $valid_address;
   }
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/functions/whos_online.php 2.3.1.src/includes/functions/whos_online.php
--- 2.2rc2a.cp.src/includes/functions/whos_online.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/functions/whos_online.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: whos_online.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/general.js 2.3.1.src/includes/general.js
--- 2.2rc2a.cp.src/includes/general.js	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/general.js	2010-11-15 03:42:36.000000000 -0600
@@ -1,5 +1,5 @@
 /*
-  $Id: general.js 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/header.php 2.3.1.src/includes/header.php
--- 2.2rc2a.cp.src/includes/header.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/header.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,69 +1,44 @@
 <?php
 /*
-  $Id: header.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
-// check if the 'install' directory exists, and warn of its existence
-  if (WARN_INSTALL_EXISTENCE == 'true') {
-    if (file_exists(dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/install')) {
-      $messageStack->add('header', WARNING_INSTALL_DIRECTORY_EXISTS, 'warning');
-    }
+  if ($messageStack->size('header') > 0) {
+    echo '<div class="grid_24">' . $messageStack->output('header') . '</div>';
   }
+?>
 
-// check if the configure.php file is writeable
-  if (WARN_CONFIG_WRITEABLE == 'true') {
-    if ( (file_exists(dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/includes/configure.php')) && (is_writeable(dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/includes/configure.php')) ) {
-      $messageStack->add('header', WARNING_CONFIG_FILE_WRITEABLE, 'warning');
-    }
-  }
+<div id="header" class="grid_24">
+  <div id="storeLogo"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image(DIR_WS_IMAGES . 'store_logo.png', STORE_NAME) . '</a>'; ?></div>
 
-// check if the session folder is writeable
-  if (WARN_SESSION_DIRECTORY_NOT_WRITEABLE == 'true') {
-    if (STORE_SESSIONS == '') {
-      if (!is_dir(tep_session_save_path())) {
-        $messageStack->add('header', WARNING_SESSION_DIRECTORY_NON_EXISTENT, 'warning');
-      } elseif (!is_writeable(tep_session_save_path())) {
-        $messageStack->add('header', WARNING_SESSION_DIRECTORY_NOT_WRITEABLE, 'warning');
-      }
-    }
-  }
+  <div id="headerShortcuts">
+<?php
+  echo tep_draw_button(HEADER_TITLE_CART_CONTENTS . ($cart->count_contents() > 0 ? ' (' . $cart->count_contents() . ')' : ''), 'cart', tep_href_link(FILENAME_SHOPPING_CART)) .
+       tep_draw_button(HEADER_TITLE_CHECKOUT, 'triangle-1-e', tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL')) .
+       tep_draw_button(HEADER_TITLE_MY_ACCOUNT, 'person', tep_href_link(FILENAME_ACCOUNT, '', 'SSL'));
 
-// check session.auto_start is disabled
-  if ( (function_exists('ini_get')) && (WARN_SESSION_AUTO_START == 'true') ) {
-    if (ini_get('session.auto_start') == '1') {
-      $messageStack->add('header', WARNING_SESSION_AUTO_START, 'warning');
-    }
+  if (tep_session_is_registered('customer_id')) {
+    echo tep_draw_button(HEADER_TITLE_LOGOFF, null, tep_href_link(FILENAME_LOGOFF, '', 'SSL'));
   }
+?>
+  </div>
 
-  if ( (WARN_DOWNLOAD_DIRECTORY_NOT_READABLE == 'true') && (DOWNLOAD_ENABLED == 'true') ) {
-    if (!is_dir(DIR_FS_DOWNLOAD)) {
-      $messageStack->add('header', WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT, 'warning');
-    }
-  }
+<script type="text/javascript">
+  $("#headerShortcuts").buttonset();
+</script>
+</div>
+
+<div class="grid_24 ui-widget infoBoxContainer">
+  <div class="ui-widget-header infoBoxHeading"><?php echo '&nbsp;&nbsp;' . $breadcrumb->trail(' &raquo; '); ?></div>
+</div>
 
-  if ($messageStack->size('header') > 0) {
-    echo $messageStack->output('header');
-  }
-?>
-<table border="0" width="100%" cellspacing="0" cellpadding="0">
-  <tr class="header">
-    <td valign="middle"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image(DIR_WS_IMAGES . 'store_logo.png', STORE_NAME) . '</a>'; ?></td>
-    <td align="right" valign="bottom"><?php echo '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . tep_image(DIR_WS_IMAGES . 'header_account.gif', HEADER_TITLE_MY_ACCOUNT) . '</a>&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '">' . tep_image(DIR_WS_IMAGES . 'header_cart.gif', HEADER_TITLE_CART_CONTENTS) . '</a>&nbsp;&nbsp;<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '">' . tep_image(DIR_WS_IMAGES . 'header_checkout.gif', HEADER_TITLE_CHECKOUT) . '</a>'; ?>&nbsp;&nbsp;</td>
-  </tr>
-</table>
-<table border="0" width="100%" cellspacing="0" cellpadding="1">
-  <tr class="headerNavigation">
-    <td class="headerNavigation">&nbsp;&nbsp;<?php echo $breadcrumb->trail(' &raquo; '); ?></td>
-    <td align="right" class="headerNavigation"><?php if (tep_session_is_registered('customer_id')) { ?><a href="<?php echo tep_href_link(FILENAME_LOGOFF, '', 'SSL'); ?>" class="headerNavigation"><?php echo HEADER_TITLE_LOGOFF; ?></a> &nbsp;|&nbsp; <?php } ?><a href="<?php echo tep_href_link(FILENAME_ACCOUNT, '', 'SSL'); ?>" class="headerNavigation"><?php echo HEADER_TITLE_MY_ACCOUNT; ?></a> &nbsp;|&nbsp; <a href="<?php echo tep_href_link(FILENAME_SHOPPING_CART); ?>" class="headerNavigation"><?php echo HEADER_TITLE_CART_CONTENTS; ?></a> &nbsp;|&nbsp; <a href="<?php echo tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'); ?>" class="headerNavigation"><?php echo HEADER_TITLE_CHECKOUT; ?></a> &nbsp;&nbsp;</td>
-  </tr>
-</table>
 <?php
   if (isset($HTTP_GET_VARS['error_message']) && tep_not_null($HTTP_GET_VARS['error_message'])) {
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/.htaccess 2.3.1.src/includes/.htaccess
--- 2.2rc2a.cp.src/includes/.htaccess	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -1,4 +1,4 @@
-# $Id: .htaccess 1739 2007-12-20 00:52:16Z hpdl $
+# $Id$
 #
 # This is used with Apache WebServers
 # The following blocks direct HTTP requests in this directory recursively
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_edit.php 2.3.1.src/includes/languages/english/account_edit.php
--- 2.2rc2a.cp.src/includes/languages/english/account_edit.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_edit.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_edit.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_history_info.php 2.3.1.src/includes/languages/english/account_history_info.php
--- 2.2rc2a.cp.src/includes/languages/english/account_history_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_history_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_history_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_history.php 2.3.1.src/includes/languages/english/account_history.php
--- 2.2rc2a.cp.src/includes/languages/english/account_history.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_history.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_history.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_newsletters.php 2.3.1.src/includes/languages/english/account_newsletters.php
--- 2.2rc2a.cp.src/includes/languages/english/account_newsletters.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_newsletters.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_notifications.php 2.3.1.src/includes/languages/english/account_notifications.php
--- 2.2rc2a.cp.src/includes/languages/english/account_notifications.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_notifications.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_notifications.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,14 +16,14 @@
 define('HEADING_TITLE', 'Product Notifications');
 
 define('MY_NOTIFICATIONS_TITLE', 'My Product Notifications');
-define('MY_NOTIFICATIONS_DESCRIPTION', 'The product notification list allows you to stay up to date on products you find of interest.<br><br>To be up to date on all product changes, select <b>Global Product Notifications</b>.');
+define('MY_NOTIFICATIONS_DESCRIPTION', 'The product notification list allows you to stay up to date on products you find of interest.<br /><br />To be up to date on all product changes, select <strong>Global Product Notifications</strong>.');
 
 define('GLOBAL_NOTIFICATIONS_TITLE', 'Global Product Notifications');
 define('GLOBAL_NOTIFICATIONS_DESCRIPTION', 'Recieve notifications on all available products.');
 
 define('NOTIFICATIONS_TITLE', 'Product Notifications');
 define('NOTIFICATIONS_DESCRIPTION', 'To remove a product notification, clear the products checkbox and click on Continue.');
-define('NOTIFICATIONS_NON_EXISTING', 'There are currently no products marked to be notified on.<br><br>To add products to your product notification list, click on the notification link available on the detailed product information page.');
+define('NOTIFICATIONS_NON_EXISTING', 'There are currently no products marked to be notified on.<br /><br />To add products to your product notification list, click on the notification link available on the detailed product information page.');
 
 define('SUCCESS_NOTIFICATIONS_UPDATED', 'Your product notifications have been successfully updated.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account_password.php 2.3.1.src/includes/languages/english/account_password.php
--- 2.2rc2a.cp.src/includes/languages/english/account_password.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account_password.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account_password.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/account.php 2.3.1.src/includes/languages/english/account.php
--- 2.2rc2a.cp.src/includes/languages/english/account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/account.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: account.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/address_book.php 2.3.1.src/includes/languages/english/address_book.php
--- 2.2rc2a.cp.src/includes/languages/english/address_book.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/address_book.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: address_book.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,11 +16,11 @@
 define('HEADING_TITLE', 'My Personal Address Book');
 
 define('PRIMARY_ADDRESS_TITLE', 'Primary Address');
-define('PRIMARY_ADDRESS_DESCRIPTION', 'This address is used as the pre-selected shipping and billing address for orders placed on this store.<br><br>This address is also used as the base for product and service tax calculations.');
+define('PRIMARY_ADDRESS_DESCRIPTION', 'This address is used as the pre-selected shipping and billing address for orders placed on this store.<br /><br />This address is also used as the base for product and service tax calculations.');
 
 define('ADDRESS_BOOK_TITLE', 'Address Book Entries');
 
 define('PRIMARY_ADDRESS', '(primary address)');
 
-define('TEXT_MAXIMUM_ENTRIES', '<font color="#ff0000"><b>NOTE:</b></font> A maximum of %s address book entries allowed.');
+define('TEXT_MAXIMUM_ENTRIES', '<font color="#ff0000"><strong>NOTE:</strong></font> A maximum of %s address book entries allowed.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/address_book_process.php 2.3.1.src/includes/languages/english/address_book_process.php
--- 2.2rc2a.cp.src/includes/languages/english/address_book_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/address_book_process.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: address_book_process.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/advanced_search.php 2.3.1.src/includes/languages/english/advanced_search.php
--- 2.2rc2a.cp.src/includes/languages/english/advanced_search.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/advanced_search.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: advanced_search.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -33,7 +33,7 @@
 define('TEXT_ALL_MANUFACTURERS', 'All Manufacturers');
 
 define('HEADING_SEARCH_HELP', 'Search Help');
-define('TEXT_SEARCH_HELP', 'Keywords may be separated by AND and/or OR statements for greater control of the search results.<br><br>For example, <u>Microsoft AND mouse</u> would generate a result set that contain both words. However, for <u>mouse OR keyboard</u>, the result set returned would contain both or either words.<br><br>Exact matches can be searched for by enclosing keywords in double-quotes.<br><br>For example, <u>"notebook computer"</u> would generate a result set which match the exact string.<br><br>Brackets can be used for further control on the result set.<br><br>For example, <u>Microsoft and (keyboard or mouse or "visual basic")</u>.');
+define('TEXT_SEARCH_HELP', 'Keywords may be separated by AND and/or OR statements for greater control of the search results.<br /><br />For example, <u>Microsoft AND mouse</u> would generate a result set that contain both words. However, for <u>mouse OR keyboard</u>, the result set returned would contain both or either words.<br /><br />Exact matches can be searched for by enclosing keywords in double-quotes.<br /><br />For example, <u>"notebook computer"</u> would generate a result set which match the exact string.<br /><br />Brackets can be used for further control on the result set.<br /><br />For example, <u>Microsoft and (keyboard or mouse or "visual basic")</u>.');
 define('TEXT_CLOSE_WINDOW', '<u>Close Window</u> [x]');
 
 define('TABLE_HEADING_IMAGE', '');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_confirmation.php 2.3.1.src/includes/languages/english/checkout_confirmation.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_confirmation.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_confirmation.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: checkout_confirmation.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,6 +15,7 @@
 
 define('HEADING_TITLE', 'Order Confirmation');
 
+define('HEADING_SHIPPING_INFORMATION', 'Shipping Information');
 define('HEADING_DELIVERY_ADDRESS', 'Delivery Address');
 define('HEADING_SHIPPING_METHOD', 'Shipping Method');
 define('HEADING_PRODUCTS', 'Products');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_payment_address.php 2.3.1.src/includes/languages/english/checkout_payment_address.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_payment_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_payment_address.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_payment_address.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_payment.php 2.3.1.src/includes/languages/english/checkout_payment.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_payment.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_payment.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_payment.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_process.php 2.3.1.src/includes/languages/english/checkout_process.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_process.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_process.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_shipping_address.php 2.3.1.src/includes/languages/english/checkout_shipping_address.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_shipping_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_shipping_address.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_shipping_address.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_shipping.php 2.3.1.src/includes/languages/english/checkout_shipping.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/checkout_success.php 2.3.1.src/includes/languages/english/checkout_success.php
--- 2.2rc2a.cp.src/includes/languages/english/checkout_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/checkout_success.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: checkout_success.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/conditions.php 2.3.1.src/includes/languages/english/conditions.php
--- 2.2rc2a.cp.src/includes/languages/english/conditions.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/conditions.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: conditions.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/contact_us.php 2.3.1.src/includes/languages/english/contact_us.php
--- 2.2rc2a.cp.src/includes/languages/english/contact_us.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/contact_us.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: contact_us.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -18,4 +18,6 @@
 define('ENTRY_NAME', 'Full Name:');
 define('ENTRY_EMAIL', 'E-Mail Address:');
 define('ENTRY_ENQUIRY', 'Enquiry:');
+
+define('ERROR_ACTION_RECORDER', 'Error: An enquiry has already been sent. Please try again in %s minutes.');
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/cookie_usage.php 2.3.1.src/includes/languages/english/cookie_usage.php
--- 2.2rc2a.cp.src/includes/languages/english/cookie_usage.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/cookie_usage.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cookie_usage.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -13,8 +13,8 @@
 define('NAVBAR_TITLE', 'Cookie Usage');
 define('HEADING_TITLE', 'Cookie Usage');
 
-define('TEXT_INFORMATION', 'We have detected that your browser does not support cookies, or has set cookies to be disabled.<br><br>To continue shopping online, we encourage you to enable cookies on your browser.<br><br>For <b>Internet Explorer</b> browsers, please follow these instructions:<br><ol><li>Click on the Tools menubar, and select Internet Options</li><li>Select the Security tab, and reset the security level to Medium</li></ol>We have taken this measurement of security for your benefit, and apologize upfront if any inconveniences are caused.<br><br>Please contact the store owner if you have any questions relating to this requirement, or to continue purchasing products offline.');
+define('TEXT_INFORMATION', 'We have detected that your browser does not support cookies, or has set cookies to be disabled.<br /><br />To continue shopping online, we encourage you to enable cookies on your browser.<br /><br />For <strong>Internet Explorer</strong> browsers, please follow these instructions:<br /><ol><li>Click on the Tools menubar, and select Internet Options</li><li>Select the Security tab, and reset the security level to Medium</li></ol>We have taken this measurement of security for your benefit, and apologize upfront if any inconveniences are caused.<br /><br />Please contact the store owner if you have any questions relating to this requirement, or to continue purchasing products offline.');
 
 define('BOX_INFORMATION_HEADING', 'Cookie Privacy and Security');
-define('BOX_INFORMATION', 'Cookies must be enabled to purchase online on this store to embrace privacy and security related issues regarding your visit to this site.<br><br>By enabling cookie support on your browser, the communication between you and this site is strengthened to be certain it is you who are making transactions on your own behalf, and to prevent leakage of your privacy information.');
+define('BOX_INFORMATION', 'Cookies must be enabled to purchase online on this store to embrace privacy and security related issues regarding your visit to this site.<br /><br />By enabling cookie support on your browser, the communication between you and this site is strengthened to be certain it is you who are making transactions on your own behalf, and to prevent leakage of your privacy information.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/create_account.php 2.3.1.src/includes/languages/english/create_account.php
--- 2.2rc2a.cp.src/includes/languages/english/create_account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/create_account.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: create_account.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -14,14 +14,14 @@
 
 define('HEADING_TITLE', 'My Account Information');
 
-define('TEXT_ORIGIN_LOGIN', '<font color="#FF0000"><small><b>NOTE:</b></font></small> If you already have an account with us, please login at the <a href="%s"><u>login page</u></a>.');
+define('TEXT_ORIGIN_LOGIN', '<font color="#FF0000"><small><strong>NOTE:</strong></small></font> If you already have an account with us, please login at the <a href="%s"><u>login page</u></a>.');
 
 define('EMAIL_SUBJECT', 'Welcome to ' . STORE_NAME);
 define('EMAIL_GREET_MR', 'Dear Mr. %s,' . "\n\n");
 define('EMAIL_GREET_MS', 'Dear Ms. %s,' . "\n\n");
 define('EMAIL_GREET_NONE', 'Dear %s' . "\n\n");
-define('EMAIL_WELCOME', 'We welcome you to <b>' . STORE_NAME . '</b>.' . "\n\n");
-define('EMAIL_TEXT', 'You can now take part in the <b>various services</b> we have to offer you. Some of these services include:' . "\n\n" . '<li><b>Permanent Cart</b> - Any products added to your online cart remain there until you remove them, or check them out.' . "\n" . '<li><b>Address Book</b> - We can now deliver your products to another address other than yours! This is perfect to send birthday gifts direct to the birthday-person themselves.' . "\n" . '<li><b>Order History</b> - View your history of purchases that you have made with us.' . "\n" . '<li><b>Products Reviews</b> - Share your opinions on products with our other customers.' . "\n\n");
+define('EMAIL_WELCOME', 'We welcome you to <strong>' . STORE_NAME . '</strong>.' . "\n\n");
+define('EMAIL_TEXT', 'You can now take part in the <strong>various services</strong> we have to offer you. Some of these services include:' . "\n\n" . '<li><strong>Permanent Cart</strong> - Any products added to your online cart remain there until you remove them, or check them out.' . "\n" . '<li><strong>Address Book</strong> - We can now deliver your products to another address other than yours! This is perfect to send birthday gifts direct to the birthday-person themselves.' . "\n" . '<li><strong>Order History</strong> - View your history of purchases that you have made with us.' . "\n" . '<li><strong>Products Reviews</strong> - Share your opinions on products with our other customers.' . "\n\n");
 define('EMAIL_CONTACT', 'For help with any of our online services, please email the store-owner: ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n\n");
-define('EMAIL_WARNING', '<b>Note:</b> This email address was given to us by one of our customers. If you did not signup to be a member, please send an email to ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n");
+define('EMAIL_WARNING', '<strong>Note:</strong> This email address was given to us by one of our customers. If you did not signup to be a member, please send an email to ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n");
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/create_account_success.php 2.3.1.src/includes/languages/english/create_account_success.php
--- 2.2rc2a.cp.src/includes/languages/english/create_account_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/create_account_success.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: create_account_success.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -13,5 +13,5 @@
 define('NAVBAR_TITLE_1', 'Create an Account');
 define('NAVBAR_TITLE_2', 'Success');
 define('HEADING_TITLE', 'Your Account Has Been Created!');
-define('TEXT_ACCOUNT_CREATED', 'Congratulations! Your new account has been successfully created! You can now take advantage of member priviledges to enhance your online shopping experience with us. If you have <small><b>ANY</b></small> questions about the operation of this online shop, please email the <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">store owner</a>.<br><br>A confirmation has been sent to the provided email address. If you have not received it within the hour, please <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">contact us</a>.');
-?>
\ No newline at end of file
+define('TEXT_ACCOUNT_CREATED', 'Congratulations! Your new account has been successfully created! You can now take advantage of member priviledges to enhance your online shopping experience with us. If you have <small><strong>ANY</strong></small> questions about the operation of this online shop, please email the <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">store owner</a>.<br /><br />A confirmation has been sent to the provided email address. If you have not received it within the hour, please <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">contact us</a>.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/download.php 2.3.1.src/includes/languages/english/download.php
--- 2.2rc2a.cp.src/includes/languages/english/download.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/download.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: download.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/index.php 2.3.1.src/includes/languages/english/index.php
--- 2.2rc2a.cp.src/includes/languages/english/index.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/index.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -10,32 +10,24 @@
   Released under the GNU General Public License
 */
 
-define('TEXT_MAIN', 'This is a default setup of osCommerce Online Merchant. Products shown are for demonstrational purposes. <b>Any products purchased will not be delivered nor will the customer be billed</b>. Any information seen on these products is to be treated as fictional.<br><br><table border="0" width="100%" cellspacing="5" cellpadding="2"><tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/1.gif') . '</td><td class="main" valign="top"><b>Error Messages</b><br><br>If there are any error or warning messages shown above, please correct them first before proceeding.<br><br>Error messages are displayed at the very top of the page with a complete <span class="messageStackError">background</span> color.<br><br>Several checks are performed to ensure a healthy setup of your online store - these checks can be disabled by editing the appropriate parameters at the bottom of the includes/application_top.php file.</td></tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/2.gif') . '</td><td class="main" valign="top"><b>Editing Page Texts</b><br><br>The text shown here can be modified in the following file, on each language basis:<br><br><nobr class="messageStackSuccess">[path to catalog]/includes/languages/' . $language . '/' . FILENAME_DEFAULT . '</nobr><br><br>That file can be edited manually, or via the Administration Tool with the <nobr class="messageStackSuccess">Languages->' . ucfirst($language) . '->Define</nobr> or <nobr class="messageStackSuccess">Tools->File Manager</nobr> modules.<br><br>The text is set in the following manner:<br><br><nobr>define(\'TEXT_MAIN\', \'<span class="messageStackSuccess">This is a default setup of the osCommerce project...</span>\');</nobr><br><br>The text highlighted in green may be modified - it is important to keep the define() of the TEXT_MAIN keyword. To remove the text for TEXT_MAIN completely, the following example is used where only two single quote characters exist:<br><br><nobr>define(\'TEXT_MAIN\', \'\');</nobr><br><br>More information concerning the PHP define() function can be read <a href="http://www.php.net/define" target="_blank"><u>here</u></a>.</td></tr><tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/3.gif') . '</td><td class="main" valign="top"><b>Online Documentation</b><br><br>Online documentation can be read at the <a href="http://www.oscommerce.info" target="_blank"><u>osCommerce Knowledge Base</u></a> site.<br><br>Support is available at the <a href="http://www.oscommerce.com/support" target="_blank"><u>osCommerce Support Site</u></a>.</td></tr></table><br>If you wish to download the solution powering this shop, or if you wish to contribute to the osCommerce project, please visit the <a href="http://www.oscommerce.com" target="_blank"><u>support site of osCommerce</u></a>. This shop is running on <font color="#f0000"><b>' . PROJECT_VERSION . '</b></font>.');
+define('TEXT_MAIN', '');
 define('TABLE_HEADING_NEW_PRODUCTS', 'New Products For %s');
 define('TABLE_HEADING_UPCOMING_PRODUCTS', 'Upcoming Products');
 define('TABLE_HEADING_DATE_EXPECTED', 'Date Expected');
-
-if ( ($category_depth == 'products') || (isset($HTTP_GET_VARS['manufacturers_id'])) ) {
-  define('HEADING_TITLE', 'Let\'s See What We Have Here');
-  define('TABLE_HEADING_IMAGE', '');
-  define('TABLE_HEADING_MODEL', 'Model');
-  define('TABLE_HEADING_PRODUCTS', 'Product Name');
-  define('TABLE_HEADING_MANUFACTURER', 'Manufacturer');
-  define('TABLE_HEADING_QUANTITY', 'Quantity');
-  define('TABLE_HEADING_PRICE', 'Price');
-  define('TABLE_HEADING_WEIGHT', 'Weight');
-  define('TABLE_HEADING_BUY_NOW', 'Buy Now');
-  define('TEXT_NO_PRODUCTS', 'There are no products to list in this category.');
-  define('TEXT_NO_PRODUCTS2', 'There is no product available from this manufacturer.');
-  define('TEXT_NUMBER_OF_PRODUCTS', 'Number of Products: ');
-  define('TEXT_SHOW', '<b>Show:</b>');
-  define('TEXT_BUY', 'Buy 1 \'');
-  define('TEXT_NOW', '\' now');
-  define('TEXT_ALL_CATEGORIES', 'All Categories');
-  define('TEXT_ALL_MANUFACTURERS', 'All Manufacturers');
-} elseif ($category_depth == 'top') {
-  define('HEADING_TITLE', 'What\'s New Here?');
-} elseif ($category_depth == 'nested') {
-  define('HEADING_TITLE', 'Categories');
-}
+define('HEADING_TITLE', 'Welcome to ' . STORE_NAME);
+define('TABLE_HEADING_IMAGE', '');
+define('TABLE_HEADING_MODEL', 'Model');
+define('TABLE_HEADING_PRODUCTS', 'Product Name');
+define('TABLE_HEADING_MANUFACTURER', 'Manufacturer');
+define('TABLE_HEADING_QUANTITY', 'Quantity');
+define('TABLE_HEADING_PRICE', 'Price');
+define('TABLE_HEADING_WEIGHT', 'Weight');
+define('TABLE_HEADING_BUY_NOW', 'Buy Now');
+define('TEXT_NO_PRODUCTS', 'There are no products available in this category.');
+define('TEXT_NUMBER_OF_PRODUCTS', 'Number of Products: ');
+define('TEXT_SHOW', '<strong>Show:</strong>');
+define('TEXT_BUY', 'Buy 1 \'');
+define('TEXT_NOW', '\' now');
+define('TEXT_ALL_CATEGORIES', 'All Categories');
+define('TEXT_ALL_MANUFACTURERS', 'All Manufacturers');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/info_shopping_cart.php 2.3.1.src/includes/languages/english/info_shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/english/info_shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/info_shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: info_shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/login.php 2.3.1.src/includes/languages/english/login.php
--- 2.2rc2a.cp.src/includes/languages/english/login.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/login.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -23,5 +23,5 @@
 define('TEXT_PASSWORD_FORGOTTEN', 'Password forgotten? Click here.');
 
 define('TEXT_LOGIN_ERROR', 'Error: No match for E-Mail Address and/or Password.');
-define('TEXT_VISITORS_CART', '<font color="#ff0000"><b>Note:</b></font> Your &quot;Visitors Cart&quot; contents will be merged with your &quot;Members Cart&quot; contents once you have logged on. <a href="javascript:session_win();">[More Info]</a>');
+define('TEXT_VISITORS_CART', '<font color="#ff0000"><strong>Note:</strong></font> Your &quot;Visitors Cart&quot; contents will be merged with your &quot;Members Cart&quot; contents once you have logged on. <a href="javascript:session_win();">[More Info]</a>');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/logoff.php 2.3.1.src/includes/languages/english/logoff.php
--- 2.2rc2a.cp.src/includes/languages/english/logoff.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/logoff.php	2010-11-15 03:42:36.000000000 -0600
@@ -12,5 +12,5 @@
 
 define('HEADING_TITLE', 'Log Off');
 define('NAVBAR_TITLE', 'Log Off');
-define('TEXT_MAIN', 'You have been logged off your account. It is now safe to leave the computer.<br><br>Your shopping cart has been saved, the items inside it will be restored whenever you log back into your account.');
+define('TEXT_MAIN', 'You have been logged off your account. It is now safe to leave the computer.<br /><br />Your shopping cart has been saved, the items inside it will be restored whenever you log back into your account.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_admin_login.php 2.3.1.src/includes/languages/english/modules/action_recorder/ar_admin_login.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_admin_login.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/action_recorder/ar_admin_login.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_ACTION_RECORDER_ADMIN_LOGIN_TITLE', 'Administration Tool Login');
+  define('MODULE_ACTION_RECORDER_ADMIN_LOGIN_DESCRIPTION', 'Record usage of Administration Tool logins.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_contact_us.php 2.3.1.src/includes/languages/english/modules/action_recorder/ar_contact_us.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_contact_us.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/action_recorder/ar_contact_us.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_ACTION_RECORDER_CONTACT_US_TITLE', 'Contact Us');
+  define('MODULE_ACTION_RECORDER_CONTACT_US_DESCRIPTION', 'Record usage of the Contact Us feature.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_tell_a_friend.php 2.3.1.src/includes/languages/english/modules/action_recorder/ar_tell_a_friend.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/action_recorder/ar_tell_a_friend.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/action_recorder/ar_tell_a_friend.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_ACTION_RECORDER_TELL_A_FRIEND_TITLE', 'Tell A Friend');
+  define('MODULE_ACTION_RECORDER_TELL_A_FRIEND_DESCRIPTION', 'Record usage of the Tell A Friend feature.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_best_sellers.php 2.3.1.src/includes/languages/english/modules/boxes/bm_best_sellers.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_best_sellers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_best_sellers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_BEST_SELLERS_TITLE', 'Best Sellers');
+  define('MODULE_BOXES_BEST_SELLERS_DESCRIPTION', 'Show global and category best sellers');
+  define('MODULE_BOXES_BEST_SELLERS_BOX_TITLE', 'Bestsellers');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_categories.php 2.3.1.src/includes/languages/english/modules/boxes/bm_categories.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_categories.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_categories.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_CATEGORIES_TITLE', 'Categories');
+  define('MODULE_BOXES_CATEGORIES_DESCRIPTION', 'Show the category navigation tree');
+  define('MODULE_BOXES_CATEGORIES_BOX_TITLE', 'Categories');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_currencies.php 2.3.1.src/includes/languages/english/modules/boxes/bm_currencies.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_currencies.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_CURRENCIES_TITLE', 'Currencies');
+  define('MODULE_BOXES_CURRENCIES_DESCRIPTION', 'Show available currencies');
+  define('MODULE_BOXES_CURRENCIES_BOX_TITLE', 'Currencies');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_information.php 2.3.1.src/includes/languages/english/modules/boxes/bm_information.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_information.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_information.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,20 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_INFORMATION_TITLE', 'Information');
+  define('MODULE_BOXES_INFORMATION_DESCRIPTION', 'Show information page links');
+  define('MODULE_BOXES_INFORMATION_BOX_TITLE', 'Information');
+  define('MODULE_BOXES_INFORMATION_BOX_PRIVACY', 'Privacy Notice');
+  define('MODULE_BOXES_INFORMATION_BOX_CONDITIONS', 'Conditions of Use');
+  define('MODULE_BOXES_INFORMATION_BOX_SHIPPING', 'Shipping &amp; Returns');
+  define('MODULE_BOXES_INFORMATION_BOX_CONTACT', 'Contact Us');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_languages.php 2.3.1.src/includes/languages/english/modules/boxes/bm_languages.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_languages.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_languages.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_LANGUAGES_TITLE', 'Languages');
+  define('MODULE_BOXES_LANGUAGES_DESCRIPTION', 'Show available languages');
+  define('MODULE_BOXES_LANGUAGES_BOX_TITLE', 'Languages');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_manufacturer_info.php 2.3.1.src/includes/languages/english/modules/boxes/bm_manufacturer_info.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_manufacturer_info.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_manufacturer_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_MANUFACTURER_INFO_TITLE', 'Manufacturer Info');
+  define('MODULE_BOXES_MANUFACTURER_INFO_DESCRIPTION', 'Show manufacturer information on the product information page');
+  define('MODULE_BOXES_MANUFACTURER_INFO_BOX_TITLE', 'Manufacturer Info');
+  define('MODULE_BOXES_MANUFACTURER_INFO_BOX_HOMEPAGE', '%s Homepage');
+  define('MODULE_BOXES_MANUFACTURER_INFO_BOX_OTHER_PRODUCTS', 'Other products');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_manufacturers.php 2.3.1.src/includes/languages/english/modules/boxes/bm_manufacturers.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_manufacturers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_manufacturers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_MANUFACTURERS_TITLE', 'Manufacturers');
+  define('MODULE_BOXES_MANUFACTURERS_DESCRIPTION', 'Show a list of manufacturers');
+  define('MODULE_BOXES_MANUFACTURERS_BOX_TITLE', 'Manufacturers');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_order_history.php 2.3.1.src/includes/languages/english/modules/boxes/bm_order_history.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_order_history.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_order_history.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_ORDER_HISTORY_TITLE', 'Order History');
+  define('MODULE_BOXES_ORDER_HISTORY_DESCRIPTION', 'Show previously ordered products to signed in customers');
+  define('MODULE_BOXES_ORDER_HISTORY_BOX_TITLE', 'Order History');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_product_notifications.php 2.3.1.src/includes/languages/english/modules/boxes/bm_product_notifications.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_product_notifications.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_product_notifications.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_PRODUCT_NOTIFICATIONS_TITLE', 'Product Notifications');
+  define('MODULE_BOXES_PRODUCT_NOTIFICATIONS_DESCRIPTION', 'Show product notifications on the product information page');
+  define('MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_TITLE', 'Notifications');
+  define('MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY', 'Notify me of updates to <strong>%s</strong>');
+  define('MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY_REMOVE', 'Do not notify me of updates to <strong>%s</strong>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_product_social_bookmarks.php 2.3.1.src/includes/languages/english/modules/boxes/bm_product_social_bookmarks.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_product_social_bookmarks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_product_social_bookmarks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_TITLE', 'Product Social Bookmarks');
+  define('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_DESCRIPTION', 'Show social bookmarks on the product information page');
+  define('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_BOX_TITLE', 'Share Product');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_reviews.php 2.3.1.src/includes/languages/english/modules/boxes/bm_reviews.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_reviews.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,19 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_REVIEWS_TITLE', 'Reviews');
+  define('MODULE_BOXES_REVIEWS_DESCRIPTION', 'Show product reviews');
+  define('MODULE_BOXES_REVIEWS_BOX_TITLE', 'Reviews');
+  define('MODULE_BOXES_REVIEWS_BOX_WRITE_REVIEW', 'Write a review on this product!');
+  define('MODULE_BOXES_REVIEWS_BOX_NO_REVIEWS', 'There are currently no product reviews');
+  define('MODULE_BOXES_REVIEWS_BOX_TEXT_OF_5_STARS', '%s of 5 Stars!');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_search.php 2.3.1.src/includes/languages/english/modules/boxes/bm_search.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_search.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_search.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_SEARCH_TITLE', 'Search');
+  define('MODULE_BOXES_SEARCH_DESCRIPTION', 'Show search field');
+  define('MODULE_BOXES_SEARCH_BOX_TITLE', 'Quick Find');
+  define('MODULE_BOXES_SEARCH_BOX_TEXT', 'Use keywords to find the product you are looking for.');
+  define('MODULE_BOXES_SEARCH_BOX_ADVANCED_SEARCH', 'Advanced Search');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_shopping_cart.php 2.3.1.src/includes/languages/english/modules/boxes/bm_shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,17 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_SHOPPING_CART_TITLE', 'Shopping Cart');
+  define('MODULE_BOXES_SHOPPING_CART_DESCRIPTION', 'Show shopping cart contents');
+  define('MODULE_BOXES_SHOPPING_CART_BOX_TITLE', 'Shopping Cart');
+  define('MODULE_BOXES_SHOPPING_CART_BOX_CART_EMPTY', '0 items');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_specials.php 2.3.1.src/includes/languages/english/modules/boxes/bm_specials.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_specials.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_SPECIALS_TITLE', 'Specials');
+  define('MODULE_BOXES_SPECIALS_DESCRIPTION', 'Show products on special');
+  define('MODULE_BOXES_SPECIALS_BOX_TITLE', 'Specials');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_whats_new.php 2.3.1.src/includes/languages/english/modules/boxes/bm_whats_new.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/boxes/bm_whats_new.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/boxes/bm_whats_new.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_BOXES_WHATS_NEW_TITLE', 'What\'s New');
+  define('MODULE_BOXES_WHATS_NEW_DESCRIPTION', 'Show the newest products');
+  define('MODULE_BOXES_WHATS_NEW_BOX_TITLE', 'What\'s New?');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_category_title.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_category_title.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_category_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_category_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_CATEGORY_TITLE_TITLE', 'Category Title');
+  define('MODULE_HEADER_TAGS_CATEGORY_TITLE_DESCRIPTION', 'Add the title of the current category to the page title');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_google_analytics.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_google_analytics.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_google_analytics.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_google_analytics.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_TITLE', 'Google Analytics');
+  define('MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_DESCRIPTION', 'Add Google Analytics to the shop');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_mailchimp_360.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_mailchimp_360.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_mailchimp_360.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_mailchimp_360.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_MAILCHIMP_360_TITLE', 'MailChimp E-Commerce 360');
+  define('MODULE_HEADER_TAGS_MAILCHIMP_360_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://eepurl.com/bxza1" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit MailChimp Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'mailchimpInfo\');">(info)</a><span id="mailchimpInfo" style="display: none;"><br /><i>Using the above link to signup at MailChimp grants osCommerce a small financial bonus for referring a customer.</i></span><br /><br />The MailChimp E-Commerce 360 module measures the ROI of your MailChimp e-mail campaigns');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_manufacturer_title.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_manufacturer_title.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_manufacturer_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_manufacturer_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_MANUFACTURER_TITLE_TITLE', 'Manufacturer Title');
+  define('MODULE_HEADER_TAGS_MANUFACTURER_TITLE_DESCRIPTION', 'Add the title of the current manufacturer to the page title');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_opensearch.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_opensearch.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_opensearch.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_opensearch.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_OPENSEARCH_TITLE', 'OpenSearch');
+  define('MODULE_HEADER_TAGS_OPENSEARCH_DESCRIPTION', 'Allow the browser to search the shop via OpenSearch');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_product_title.php 2.3.1.src/includes/languages/english/modules/header_tags/ht_product_title.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/header_tags/ht_product_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/header_tags/ht_product_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,15 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_HEADER_TAGS_PRODUCT_TITLE_TITLE', 'Product Title');
+  define('MODULE_HEADER_TAGS_PRODUCT_TITLE_DESCRIPTION', 'Add the title of the current product to the page title');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_loworderfee.php 2.3.1.src/includes/languages/english/modules/order_total/ot_loworderfee.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_loworderfee.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/order_total/ot_loworderfee.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_loworderfee.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_shipping.php 2.3.1.src/includes/languages/english/modules/order_total/ot_shipping.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/order_total/ot_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_subtotal.php 2.3.1.src/includes/languages/english/modules/order_total/ot_subtotal.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_subtotal.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/order_total/ot_subtotal.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_subtotal.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_tax.php 2.3.1.src/includes/languages/english/modules/order_total/ot_tax.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_tax.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/order_total/ot_tax.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_tax.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_total.php 2.3.1.src/includes/languages/english/modules/order_total/ot_total.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/order_total/ot_total.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/order_total/ot_total.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_total.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/authorizenet_cc_aim.php 2.3.1.src/includes/languages/english/modules/payment/authorizenet_cc_aim.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/authorizenet_cc_aim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/authorizenet_cc_aim.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: authorizenet_cc_aim.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/authorizenet_cc_sim.php 2.3.1.src/includes/languages/english/modules/payment/authorizenet_cc_sim.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/authorizenet_cc_sim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/authorizenet_cc_sim.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: authorizenet_cc_sim.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/cc.php 2.3.1.src/includes/languages/english/modules/payment/cc.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: cc.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_CC_TEXT_TITLE', 'Credit Card (Not For Production Use)');
-  define('MODULE_PAYMENT_CC_TEXT_PUBLIC_TITLE', 'Credit Card');
-  define('MODULE_PAYMENT_CC_TEXT_DESCRIPTION', 'This module stores the credit card number in the database without encryption and is not recommended for production use.<br><br>Credit Card Test Info:<br><br>CC#: 4111111111111111<br>Expiry: Any');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_OWNER', 'Credit Card Owner:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_NUMBER', 'Credit Card Number:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES', 'Credit Card Expiry Date:');
-  define('MODULE_PAYMENT_CC_TEXT_ERROR', 'Credit Card Error!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/chronopay.php 2.3.1.src/includes/languages/english/modules/payment/chronopay.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/chronopay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/chronopay.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: chronopay.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/cod.php 2.3.1.src/includes/languages/english/modules/payment/cod.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/cod.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/cod.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cod.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/inpay.php 2.3.1.src/includes/languages/english/modules/payment/inpay.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/inpay.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/inpay.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,46 @@
+<?php
+/*
+ $Id: inpay.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+  define('MODULE_PAYMENT_INPAY_TEXT_TITLE', 'Inpay - instant online bank transfers');
+  define('MODULE_PAYMENT_INPAY_TEXT_PUBLIC_TITLE', 'Pay with your online bank - instant and 100% secure');
+  define('MODULE_PAYMENT_INPAY_TEXT_PUBLIC_HTML', '<img src="https://resources.inpay.com/images/oscommerce/inpay_checkout.png" alt="Secure checkouts using inpay" /><br /><br />
+  <table cellspacing="5">
+  	  <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="100% Secure payments using inpay" /></td><td class="main">100% Secure payments using inpay <span style="color: #666;">- our security level matches the security of your online bank.</span></td></tr>
+  	  <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="Instant payments using inpay" /></td><td class="main">Instant payments using inpay <span style="color: #666;">- our system ensures you will receive your order as soon as possible.</span></td></tr>
+  	  <tr><td><img src="https://resources.inpay.com/images/oscommerce/inpay_check.png" alt="Anonymous payment using inpay" /></td><td class="main">Anonymous payment using inpay <span style="color: #666;">- no need to share your credit card number or any other personal information.</span></td></tr>
+  </table><a href="http://inpay.com/shoppers" style="text-decoration: underline;" target="_blank" class="main">Click here to read more about inpay</a><br />');
+  define('MODULE_PAYMENT_INPAY_TEXT_DESCRIPTION', '<strong>What is inpay?</strong><br />
+  	  inpay is an extra payment option for webshops, that allows customers to pay using their online bank - instantly and worldwide.<br />
+  	  <br />
+  	  <strong>Increase profits</strong><br />
+	By allowing shoppers to pay using their online bank, you can now sell to customers that are otherwise unable or unwilling to pay today.<br />
+<br />
+<strong>Increase market size</strong><br />
+By offering your customers the inpay payment option you increase your market share to not only credit and debit card owners, but also online bank users from all over the world.<br />
+<br />
+<strong>No risk</strong><br />
+With inpay there is no risk of credit card fraud or any kind of chargebacks. This means that when you get paid you stay paid! With inpay you can even sell to customers from \'high risk\' regions including all parts of Asia and Eastern Europe.<br /><br />
+  <a href="http://inpay.com/" style="text-decoration: underline;" target="_blank">Read more or signup at inpay.com</a><br />');
+  // ------------- e-mail settings ---------------------------------
+  define('EMAIL_TEXT_SUBJECT', 'Payment confirmed by inpay');
+  define('EMAIL_TEXT_ORDER_NUMBER', 'Order Number:');
+  define('EMAIL_TEXT_INVOICE_URL', 'Detailed Invoice:');
+  define('EMAIL_TEXT_DATE_ORDERED', 'Date Ordered:');
+  define('EMAIL_TEXT_PRODUCTS', 'Products');
+  define('EMAIL_TEXT_SUBTOTAL', 'Sub-Total:');
+  define('EMAIL_TEXT_TAX', 'Tax:        ');
+  define('EMAIL_TEXT_SHIPPING', 'Shipping: ');
+  define('EMAIL_TEXT_TOTAL', 'Total:    ');
+  define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Delivery Address');
+  define('EMAIL_TEXT_BILLING_ADDRESS', 'Billing Address');
+  define('EMAIL_TEXT_PAYMENT_METHOD', 'Payment Method');
+  define('EMAIL_SEPARATOR', '------------------------------------------------------');
+  define('TEXT_EMAIL_VIA', 'via'); 
+  
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_cc.php 2.3.1.src/includes/languages/english/modules/payment/ipayment_cc.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/ipayment_cc.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,16 +1,16 @@
 <?php
 /*
-  $Id: ipayment_cc.php 1811 2008-01-13 12:25:10Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_TITLE', 'iPayment');
+  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_TITLE', 'iPayment (Credit Card)');
   define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_PUBLIC_TITLE', 'Credit Card');
   define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.ipayment.de" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit iPayment Website</a>');
   define('MODULE_PAYMENT_IPAYMENT_CC_ERROR_HEADING', 'There has been an error processing your credit card');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_elv.php 2.3.1.src/includes/languages/english/modules/payment/ipayment_elv.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_elv.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/ipayment_elv.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,22 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_TITLE', 'iPayment (ELV)');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_PUBLIC_TITLE', 'Bank Transfer');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.ipayment.de" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit iPayment Website</a>');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_ERROR_HEADING', 'There has been an error processing your bank card');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_ERROR_MESSAGE', 'Please check your bank card details!');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_ACCOUNT_OWNER', 'Bank Account Owner:');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_ACCOUNT_NUMBER', 'Bank Account Number:');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_CODE', 'Bank Code:');
+  define('MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_NAME', 'Bank Name:');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_pp.php 2.3.1.src/includes/languages/english/modules/payment/ipayment_pp.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/ipayment_pp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/ipayment_pp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_IPAYMENT_PP_TEXT_TITLE', 'iPayment (Prepaid)');
+  define('MODULE_PAYMENT_IPAYMENT_PP_TEXT_PUBLIC_TITLE', 'Prepaid (Paysafecard)');
+  define('MODULE_PAYMENT_IPAYMENT_PP_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.ipayment.de" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit iPayment Website</a>');
+  define('MODULE_PAYMENT_IPAYMENT_PP_ERROR_HEADING', 'There has been an error processing your prepaid card');
+  define('MODULE_PAYMENT_IPAYMENT_PP_ERROR_MESSAGE', 'Please check your prepaid card details!');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_acc.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_acc.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_acc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_acc.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_TITLE', 'Moneybookers - Credit Cards');
+  define('MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_PUBLIC_TITLE', 'Credit and Debit Cards');
+  define('MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_bwi.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_bwi.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_bwi.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_bwi.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_TITLE', 'Moneybookers - Bank Transfer');
+  define('MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_PUBLIC_TITLE', 'Bank Transfer');
+  define('MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_csi.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_csi.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_csi.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_csi.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_TITLE', 'Moneybookers - CartaSi (Italy)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_PUBLIC_TITLE', 'CartaSi');
+  define('MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_did.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_did.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_did.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_did.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_TITLE', 'Moneybookers - Lastschrift (Germany)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_PUBLIC_TITLE', 'Lastschrift');
+  define('MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_dnk.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_dnk.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_dnk.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_dnk.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_TITLE', 'Moneybookers - Dankort (Denmark)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_PUBLIC_TITLE', 'Dankort');
+  define('MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ebt.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ebt.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ebt.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ebt.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_TITLE', 'Moneybookers - Nordea Solo (Sweden)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_PUBLIC_TITLE', 'Nordea Solo');
+  define('MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ent.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ent.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ent.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ent.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_TITLE', 'Moneybookers - eNETS (Singapore)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_PUBLIC_TITLE', 'eNETS');
+  define('MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_gcb.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_gcb.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_gcb.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_gcb.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_TITLE', 'Moneybookers - Carte Bleue (France)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_PUBLIC_TITLE', 'Carte Bleue');
+  define('MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_gir.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_gir.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_gir.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_gir.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_TITLE', 'Moneybookers - Giropay (Germany)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_PUBLIC_TITLE', 'Giropay');
+  define('MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_idl.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_idl.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_idl.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_idl.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_TITLE', 'Moneybookers - iDeal (Netherlands)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_PUBLIC_TITLE', 'iDeal');
+  define('MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_lsr.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_lsr.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_lsr.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_lsr.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_TITLE', 'Moneybookers - Laser (Ireland)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_PUBLIC_TITLE', 'Laser');
+  define('MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_mae.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_mae.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_mae.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_mae.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_TITLE', 'Moneybookers - Maestro (Austria, Spain, United Kingdom)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_PUBLIC_TITLE', 'Maestro');
+  define('MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_msc.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_msc.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_msc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_msc.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_TITLE', 'Moneybookers - Mastercard (Euro 6000/4B) (Spain)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_PUBLIC_TITLE', 'Mastercard (Euro 6000/4B)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ngp.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ngp.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_ngp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_ngp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_TITLE', 'Moneybookers - OnlineBank Transfer (Germany, United Kingdom)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_PUBLIC_TITLE', 'Online Bank Transfer');
+  define('MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_npy.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_npy.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_npy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_npy.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_TITLE', 'Moneybookers - EPS (Austria)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_PUBLIC_TITLE', 'EPS');
+  define('MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,43 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  $moneybookers_ping_button = '';
+  if (defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS') && tep_not_null(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD)) {
+    $moneybookers_ping_button = '<p><img src="images/icons/locked.gif" border="0">&nbsp;<a href=' . tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=testSecretWord', 'SSL') . ' style="text-decoration: underline; font-weight: bold;">Test Secret Word</a></p>';
+  }
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_TEXT_TITLE', 'Moneybookers - Core Module');
+  define('MODULE_PAYMENT_MONEYBOOKERS_TEXT_PUBLIC_TITLE', 'Moneybookers eWallet');
+  define('MODULE_PAYMENT_MONEYBOOKERS_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>' . $moneybookers_ping_button);
+  define('MODULE_PAYMENT_MONEYBOOKERS_RETURN_TEXT', 'Continue and return to ' . STORE_NAME);
+  define('MODULE_PAYMENT_MONEYBOOKERS_LANGUAGE_CODE', 'EN');
+
+  define('MB_ACTIVATION_TITLE', 'Moneybookers Account Activation');
+  define('MB_ACTIVATION_ACCOUNT_TITLE', 'Verify Account');
+  define('MB_ACTIVATION_ACCOUNT_TEXT', 'Activating Moneybookers Quick Checkout enables you to take direct payments from credit cards, debit cards and over 60 other local payment options in over 200 countries as well as the Moneybookers eWallet.<br /><br />To have access to the international payment network of Moneybookers <a href="http://www.moneybookers.com/partners/oscommerce" target="_blank">please register here</a> for a free account if you don\'t have one yet.');
+  define('MB_ACTIVATION_EMAIL_ADDRESS', 'Moneybookers Account E-Mail Address:');
+  define('MB_ACTIVATION_ACTIVATE_TITLE', 'Account Activation');
+  define('MB_ACTIVATION_ACTIVATE_TEXT', 'An activation request has been sent to Moneybookers. Please be aware that the verification process to use Moneybookers Quick Checkout could take up to 72 hours. <strong>You will be contacted by Moneybookers when the verification process has been completed.</strong><br /><br /><i>After activation Moneybookers will give you access to a new section in your Moneybookers account called "Merchant Tools". Please choose a secret word (do not use your password for this) and enter it into the merchant tools section and in the configuration of the payment module on the next page.</i>');
+  define('MB_ACTIVATION_NONEXISTING_ACCOUNT_TITLE', 'Account Error');
+  define('MB_ACTIVATION_NONEXISTING_ACCOUNT_TEXT', 'The e-mail address is not a registered Moneybookers account. Please <a href="http://www.moneybookers.com/partners/oscommerce" target="_blank">register here</a> to begin selling with Moneybookers.');
+  define('MB_ACTIVATION_SECRET_WORD_TITLE', 'Secret Word Test');
+  define('MB_ACTIVATION_SECRET_WORD_SUCCESS_TEXT', 'The secret word has been setup <strong>correctly</strong>! Transactions can now be securely verified with the payment gateway.');
+  define('MB_ACTIVATION_SECRET_WORD_FAIL_TEXT', 'The secret word configuration has <strong>failed</strong>! Please review the secret word at your Moneybookers "Merchant Tools" account and the configuration of the payment module.');
+  define('MB_ACTIVATION_SECRET_WORD_ERROR_TITLE', 'Error');
+  define('MB_ACTIVATION_SECRET_WORD_ERROR_EXCEEDED', 'The maximum number of tries has been exceeded. Please try again in an hour.');
+  define('MB_ACTIVATION_CORE_REQUIRED_TITLE', 'Core Moneybookers Module Required');
+  define('MB_ACTIVATION_CORE_REQUIRED_TEXT', 'The core Moneybookers payment module is required to support the Moneybookers Quick Checkout payment options. Please continue to install and configure the core payment module.');
+  define('MB_ACTIVATION_VERIFY_ACCOUNT_BUTTON', 'Verify Account');
+  define('MB_ACTIVATION_CONTINUE_BUTTON', 'Continue and configure payment module');
+  define('MB_ACTIVATION_SUPPORT_TITLE', 'Support');
+  define('MB_ACTIVATION_SUPPORT_TEXT', 'Do you have questions? Contact Moneybookers by e-mail at <a href="mailto:ecommerce@moneybookers.com">ecommerce@moneybookers.com</a> or by phone +44 (0) 870 383 0762. Your question may also already be answered on the <a href="http://forums.oscommerce.com/forum/78-moneybookers/" target="_blank">osCommerce Community Support forum</a>.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_pli.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_pli.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_pli.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_pli.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_TITLE', 'Moneybookers - POLi (Australia)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_PUBLIC_TITLE', 'POLi');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_psp.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_psp.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_psp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_psp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_TITLE', 'Moneybookers - Postepay (Italy)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_PUBLIC_TITLE', 'Postepay');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_pwy.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_pwy.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_pwy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_pwy.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_TITLE', 'Moneybookers - Przelewy (Poland)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_PUBLIC_TITLE', 'Przelewy');
+  define('MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_sft.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_sft.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_sft.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_sft.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_TITLE', 'Moneybookers - Sofortüberweisung (Germany)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_PUBLIC_TITLE', 'Sofortüberweisung');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_slo.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_slo.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_slo.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_slo.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_TITLE', 'Moneybookers - Solo (United Kingdom)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_PUBLIC_TITLE', 'Solo');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_so2.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_so2.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_so2.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_so2.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_TITLE', 'Moneybookers - Nordea Solo (Finland)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_PUBLIC_TITLE', 'Nordea Solo');
+  define('MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_vsa.php 2.3.1.src/includes/languages/english/modules/payment/moneybookers_vsa.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneybookers_vsa.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneybookers_vsa.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_TITLE', 'Moneybookers - Visa (Euro 6000) (Spain)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_PUBLIC_TITLE', 'Visa (Euro 6000)');
+  define('MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.moneybookers.com/partners/oscommerce" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Moneybookers Website</a>');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneyorder.php 2.3.1.src/includes/languages/english/modules/payment/moneyorder.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/moneyorder.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/moneyorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: moneyorder.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,6 @@
 */
 
   define('MODULE_PAYMENT_MONEYORDER_TEXT_TITLE', 'Check/Money Order');
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_DESCRIPTION', 'Make Payable To:&nbsp;' . MODULE_PAYMENT_MONEYORDER_PAYTO . '<br><br>Send To:<br>' . nl2br(STORE_NAME_ADDRESS) . '<br><br>' . 'Your order will not ship until we receive payment.');
+  define('MODULE_PAYMENT_MONEYORDER_TEXT_DESCRIPTION', 'Make Payable To:&nbsp;' . MODULE_PAYMENT_MONEYORDER_PAYTO . '<br /><br />Send To:<br />' . nl2br(STORE_NAME_ADDRESS) . '<br /><br />' . 'Your order will not ship until we receive payment.');
   define('MODULE_PAYMENT_MONEYORDER_TEXT_EMAIL_FOOTER', "Make Payable To: ". MODULE_PAYMENT_MONEYORDER_PAYTO . "\n\nSend To:\n" . STORE_NAME_ADDRESS . "\n\n" . 'Your order will not ship until we receive payment.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/nochex.php 2.3.1.src/includes/languages/english/modules/payment/nochex.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/nochex.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/nochex.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: nochex.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,5 +11,5 @@
 */
 
   define('MODULE_PAYMENT_NOCHEX_TEXT_TITLE', 'NOCHEX');
-  define('MODULE_PAYMENT_NOCHEX_TEXT_DESCRIPTION', 'NOCHEX<br>Requires the GBP currency.');
-?>
\ No newline at end of file
+  define('MODULE_PAYMENT_NOCHEX_TEXT_DESCRIPTION', 'NOCHEX<br />Requires the GBP currency.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_direct.php 2.3.1.src/includes/languages/english/modules/payment/paypal_direct.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: paypal_direct.php 1801 2008-01-11 16:49:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (US) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_PUBLIC_TITLE', 'Credit or Debit Card (Processed securely by PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_DESCRIPTION', '<b>Note: PayPal requires the PayPal Express Checkout payment module to be enabled if this module is activated.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectInfo\');">(info)</a><span id="paypalDirectInfo" style="display: none;"><br><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_OWNER', 'Card Owner:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_TYPE', 'Card Type:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_NUMBER', 'Card Number:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM', 'Card Valid From Date:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM_INFO', '(if available)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_EXPIRES', 'Card Expiry Date:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_CVC', 'Card Security Code (CVV2):');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER', 'Card Issue Number:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER_INFO', '(for Maestro and Solo cards only)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Error: All payment information fields are required.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_express.php 2.3.1.src/includes/languages/english/modules/payment/paypal_express.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_express.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,18 +1,28 @@
 <?php
 /*
-  $Id: paypal_express.php 1798 2008-01-11 15:40:58Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2009 osCommerce
 
   Released under the GNU General Public License
 */
 
+  $paypal_express_ping_button = '';
+  if (defined('MODULE_PAYMENT_PAYPAL_EXPRESS_STATUS')) {
+    $paypal_express_ping_button = '<p><img src="images/icons/locked.gif" border="0">&nbsp;<a href=' . tep_href_link('ext/modules/payment/paypal/paypal_express.php', 'action=test', 'SSL') . ' target="_blank" style="text-decoration: underline; font-weight: bold;">Test API Credentials</a></p>';
+  }
+
   define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_TITLE', 'PayPal Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express (including Credit Cards and Debit Cards)');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressInfo\');">(info)</a><span id="paypalExpressInfo" style="display: none;"><br><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal (including Credit and Debit Cards)');
+  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressInfo\');">(info)</a><span id="paypalExpressInfo" style="display: none;"><br /><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>' . $paypal_express_ping_button);
   define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_BUTTON', 'Checkout with PayPal');
   define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_COMMENTS', 'Comments:');
-?>
\ No newline at end of file
+  define('MODULE_PAYMENT_PAYPAL_EXPRESS_EMAIL_PASSWORD', 'An account has automatically been created for you with the following e-mail address and password:' . "\n\n" . 'Store Account E-Mail Address: %s' . "\n" . 'Store Account Password: %s' . "\n\n");
+  define('MODULE_PAYMENT_PAYPAL_EXPRESS_BUTTON', 'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif');
+  define('MODULE_PAYMENT_PAYPAL_EXPRESS_LANGUAGE_LOCALE', 'en_US');
+
+  unset($paypal_express_ping_button);
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_dp.php 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_dp.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_dp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_dp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,26 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_TITLE', 'PayPal Website Payments Pro - Direct Payments');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_PUBLIC_TITLE', 'Credit or Debit Card');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_DESCRIPTION', '<strong>Note: PayPal requires the PayPal Express Checkout payment module to be enabled if this module is activated.</strong><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectInfo\');">(info)</a><span id="paypalDirectInfo" style="display: none;"><br /><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_OWNER', 'Card Owner:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_TYPE', 'Card Type:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_NUMBER', 'Card Number:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM', 'Card Valid From Date:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM_INFO', '(if available)');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_EXPIRES', 'Card Expiry Date:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_CVC', 'Card Security Code (CVV2):');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER', 'Card Issue Number:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER_INFO', '(for Maestro and Solo cards only)');
+  define('MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_ALL_FIELDS_REQUIRED', 'Error: All payment information fields are required.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_payflow_dp.php 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_payflow_dp.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_payflow_dp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_payflow_dp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,33 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_TITLE', 'PayPal Website Payments Pro (Payflow Edition) - Direct Payments');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_PUBLIC_TITLE', 'Credit or Debit Card');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_DESCRIPTION', '<strong>Note: PayPal requires the PayPal Website Payments Pro (Payflow Edition) - Express Checkout payment module to be enabled if this module is activated.</strong><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectUKInfo\');">(info)</a><span id="paypalDirectUKInfo" style="display: none;"><br /><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER', 'Card Owner:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_FIRSTNAME', 'Card Owner First Name:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_LASTNAME', 'Card Owner Last Name:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_TYPE', 'Card Type:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_NUMBER', 'Card Number:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM', 'Card Valid From Date:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM_INFO', '(if available)');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_EXPIRES', 'Card Expiry Date:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_CVC', 'Card Security Code (CVV2):');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER', 'Card Issue Number:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER_INFO', '(for Maestro and Solo cards only)');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ALL_FIELDS_REQUIRED', 'Error: All payment information fields are required.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_INVALID_CREDIT_CARD', 'Error: The provided credit card information is invalid. Please try again.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_payflow_ec.php 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_payflow_ec.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_pro_payflow_ec.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_pro_payflow_ec.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,23 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_TITLE', 'PayPal Website Payments Pro (Payflow Edition) - Express Checkout');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_PUBLIC_TITLE', 'PayPal (including Credit and Debit Cards)');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_DESCRIPTION', '<strong>Note: PayPal requires the PayPal Website Payments Pro (Payflow Edition) - Direct Payments payment module to be enabled if this module is activated.</strong><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressUKInfo\');">(info)</a><span id="paypalExpressUKInfo" style="display: none;"><br /><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_BUTTON', 'Checkout with PayPal');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_COMMENTS', 'Comments:');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
+  define('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_EXPRESS_DISABLED', 'Error: PayPal Express Checkout has been disabled for this merchant. Please contact PayPal Customer Service.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_standard.php 2.3.1.src/includes/languages/english/modules/payment/paypal_standard.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_standard.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_standard.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: paypal_standard.php 1778 2008-01-09 23:37:44Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,6 +11,6 @@
 */
 
   define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_TITLE', 'PayPal Website Payments Standard');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PUBLIC_TITLE', 'PayPal (including Credit Cards and Debit Cards)');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalStdInfo\');">(info)</a><span id="paypalStdInfo" style="display: none;"><br><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PUBLIC_TITLE', 'PayPal (including Credit and Debit Cards)');
+  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalStdInfo\');">(info)</a><span id="paypalStdInfo" style="display: none;"><br /><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_uk_direct.php 2.3.1.src/includes/languages/english/modules/payment/paypal_uk_direct.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_uk_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_uk_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_direct.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_PUBLIC_TITLE', 'Credit or Debit Card (Processed securely by PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_DESCRIPTION', '<b>Note: PayPal requires the PayPal Website Payments Pro (UK) Express Checkout payment module to be enabled if this module is activated.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectUKInfo\');">(info)</a><span id="paypalDirectUKInfo" style="display: none;"><br><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_OWNER', 'Card Owner:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_TYPE', 'Card Type:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_NUMBER', 'Card Number:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM', 'Card Valid From Date:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM_INFO', '(if available)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_EXPIRES', 'Card Expiry Date:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_CVC', 'Card Security Code (CVV2):');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER', 'Card Issue Number:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER_INFO', '(for Maestro and Solo cards only)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Error: All payment information fields are required.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_INVALID_CREDIT_CARD', 'Error: The provided credit card information is invalid. Please try again.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_uk_express.php 2.3.1.src/includes/languages/english/modules/payment/paypal_uk_express.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypal_uk_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypal_uk_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_express.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express (including Credit Cards and Debit Cards)');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_DESCRIPTION', '<b>Note: PayPal requires the PayPal Website Payments Pro (UK) Direct Payments payment module to be enabled if this module is activated.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit PayPal Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressUKInfo\');">(info)</a><span id="paypalExpressUKInfo" style="display: none;"><br><i>Using the above link to signup at PayPal grants osCommerce a small financial bonus for referring a customer.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_BUTTON', 'Checkout with PayPal');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_COMMENTS', 'Comments:');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED', 'Error: PayPal Express Checkout has been disabled for this merchant. Please contact PayPal Customer Service.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypoint_secpay.php 2.3.1.src/includes/languages/english/modules/payment/paypoint_secpay.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/paypoint_secpay.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/paypoint_secpay.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,20 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_TITLE', 'PayPoint.net SECPay');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_PUBLIC_TITLE', 'Credit Card');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_DESCRIPTION', 'Credit Card Test Info:<br /><br />CC#: 4444333322221111<br />Expiry: Any');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR', 'Credit Card Error!');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE', 'There has been an error processing your credit card. Please try again.');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE_N', 'Transaction was not authorised. Please try another card.');
+  define('MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE_C', 'There was a communications problem in contacing the bank, please try again.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/pm2checkout.php 2.3.1.src/includes/languages/english/modules/payment/pm2checkout.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/pm2checkout.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/pm2checkout.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: pm2checkout.php 1793 2008-01-11 13:48:20Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -13,7 +13,7 @@
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_TITLE', '2Checkout');
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_TITLE', '2Checkout');
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_DESCRIPTION', 'Credit Cards and Alternatives');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.2checkout.com/2co/signup?affiliate=1255821" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit 2Checkout Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'pm2checkoutInfo\');">(info)</a><span id="pm2checkoutInfo" style="display: none;"><br><i>Using the above link to signup at 2Checkout grants osCommerce a small financial bonus for referring a customer.</i></span><br><br>Credit Card Test Info:<br><br>CC#: 4111111111111111<br>Expiry: Any');
+  define('MODULE_PAYMENT_2CHECKOUT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.2checkout.com/2co/signup?affiliate=1255821" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit 2Checkout Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'pm2checkoutInfo\');">(info)</a><span id="pm2checkoutInfo" style="display: none;"><br /><i>Using the above link to signup at 2Checkout grants osCommerce a small financial bonus for referring a customer.</i></span><br /><br />Credit Card Test Info:<br /><br />CC#: 4111111111111111<br />Expiry: Any');
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_ERROR_MESSAGE', 'There has been an error processing your credit card. Please try again.');
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
   define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_TRANSACTION_ORDER', 'In Review: Transaction total did not match order total.');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/psigate.php 2.3.1.src/includes/languages/english/modules/payment/psigate.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/psigate.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/psigate.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: psigate.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,7 +11,7 @@
 */
 
   define('MODULE_PAYMENT_PSIGATE_TEXT_TITLE', 'PSiGate');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_DESCRIPTION', 'Credit Card Test Info:<br><br>CC#: 4111111111111111<br>Expiry: Any');
+  define('MODULE_PAYMENT_PSIGATE_TEXT_DESCRIPTION', 'Credit Card Test Info:<br /><br />CC#: 4111111111111111<br />Expiry: Any');
   define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_OWNER', 'Credit Card Owner:');
   define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_NUMBER', 'Credit Card Number:');
   define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_EXPIRES', 'Credit Card Expiry Date:');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/rbsworldpay_hosted.php 2.3.1.src/includes/languages/english/modules/payment/rbsworldpay_hosted.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/rbsworldpay_hosted.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/rbsworldpay_hosted.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,19 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_TITLE', 'RBS WorldPay Hosted');
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_PUBLIC_TITLE', 'Credit Card');
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.rbsworldpay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit RBS WorldPay Website</a>');
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_SUCCESSFUL_TRANSACTION', 'The payment transaction has been successfully performed!');
+  define('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_CONTINUE_BUTTON', 'Click here to continue to %s');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_direct.php 2.3.1.src/includes/languages/english/modules/payment/sage_pay_direct.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_direct.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/sage_pay_direct.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,37 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_TITLE', 'Sage Pay Direct');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_PUBLIC_TITLE', 'Credit Card (Processed by Sage Pay)');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://support.sagepay.com/apply/default.aspx?PartnerID=C74D7B82-E9EB-4FBD-93DB-76F0F551C802&PromotionCode=osc223" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Sage Pay Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'sagePayInfo\');">(info)</a><span id="sagePayInfo" style="display: none;"><br /><i>Using the above link to signup at Sage Pay grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_TYPE', 'Credit Card Type:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_OWNER', 'Credit Card Owner:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_NUMBER', 'Credit Card Number:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_STARTS', 'Credit Card Start Date:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_STARTS_INFO', '(for Maestro, Solo, and American Express cards only)');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_EXPIRES', 'Credit Card Expiry Date:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_ISSUE_NUMBER', 'Credit Card Issue Number:');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_ISSUE_NUMBER_INFO', '(for Maestro and Solo cards only)');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_CVC', 'Credit Card Check Number (CVC):');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_TITLE', '3D Secure Verification');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_INFO', 'Please click on the CONTINUE button to authenticate your card at the website of your bank.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_3DAUTH_BUTTON', 'CONTINUE');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_TITLE', 'There has been an error processing your credit card');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_GENERAL', 'Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDTYPE', 'The card type is not supported. Please try again with another card and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDOWNER', 'The card owners name must be provided to complete the order. Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDNUMBER', 'The card number was not able to be processed. Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDSTART', 'The card start date was not able to be processed. Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDEXPIRES', 'The card expiry date was not able to be processed. Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDISSUE', 'The card issue number was not able to be processed. Please try again and if problems persist, please try another payment method.');
+  define('MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDCVC', 'The card check number (CVC) was not able to be processed. Please try again and if problems persist, please try another payment method.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_form.php 2.3.1.src/includes/languages/english/modules/payment/sage_pay_form.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_form.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/sage_pay_form.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_TITLE', 'Sage Pay Form');
+  define('MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_PUBLIC_TITLE', 'Credit Card or Bank Card (Processed by Sage Pay)');
+  define('MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://support.sagepay.com/apply/default.aspx?PartnerID=C74D7B82-E9EB-4FBD-93DB-76F0F551C802&PromotionCode=osc223" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Sage Pay Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'sagePayInfo\');">(info)</a><span id="sagePayInfo" style="display: none;"><br /><i>Using the above link to signup at Sage Pay grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_TITLE', 'There has been an error processing your order transaction');
+  define('MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_GENERAL', 'Please try again and if problems persist, please try another payment method.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_server.php 2.3.1.src/includes/languages/english/modules/payment/sage_pay_server.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/sage_pay_server.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/sage_pay_server.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,18 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_TITLE', 'Sage Pay Server');
+  define('MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_PUBLIC_TITLE', 'Credit Card or Bank Card (Processed by Sage Pay)');
+  define('MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://support.sagepay.com/apply/default.aspx?PartnerID=C74D7B82-E9EB-4FBD-93DB-76F0F551C802&PromotionCode=osc223" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit Sage Pay Website</a>&nbsp;<a href="javascript:toggleDivBlock(\'sagePayInfo\');">(info)</a><span id="sagePayInfo" style="display: none;"><br /><i>Using the above link to signup at Sage Pay grants osCommerce a small financial bonus for referring a customer.</i></span>');
+  define('MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_TITLE', 'There has been an error processing your credit card');
+  define('MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_GENERAL', 'Please try again and if problems persist, please try another payment method.');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/secpay.php 2.3.1.src/includes/languages/english/modules/payment/secpay.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/secpay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/secpay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: secpay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_SECPAY_TEXT_TITLE', 'SECPay');
-  define('MODULE_PAYMENT_SECPAY_TEXT_DESCRIPTION', 'Credit Card Test Info:<br><br>CC#: 4444333322221111<br>Expiry: Any');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR', 'Credit Card Error!');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR_MESSAGE', 'There has been an error processing your credit card. Please try again.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/sofortueberweisung_direct.php 2.3.1.src/includes/languages/english/modules/payment/sofortueberweisung_direct.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/sofortueberweisung_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/sofortueberweisung_direct.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: sofortueberweisung_direct.php 1797 2008-01-11 14:55:19Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -12,9 +12,9 @@
 */
 
   if (!defined('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS')) {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<div align="center"><a href=' . tep_href_link('ext/modules/payment/sofortueberweisung/install.php', 'install=sofortueberweisung_direct', 'SSL') . '>' . tep_image('ext/modules/payment/sofortueberweisung/autoinstaller.gif', 'Autoinstaller (empfohlen)') . '</a></div><br><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
+    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<div align="center"><a href=' . tep_href_link('ext/modules/payment/sofortueberweisung/install.php', 'install=sofortueberweisung_direct', 'SSL') . '>' . tep_image('ext/modules/payment/sofortueberweisung/autoinstaller.gif', 'Autoinstaller (empfohlen)') . '</a></div><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br /><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br /><br />Kontonummer Test Info:<br /><br />BLZ#: 88888888');
   } else {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
+    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br /><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br /><br />Kontonummer Test Info:<br /><br />BLZ#: 88888888');
   }
 
   define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_TITLE', 'Sofortberweisung Direkt');
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/payment/worldpay_junior.php 2.3.1.src/includes/languages/english/modules/payment/worldpay_junior.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/payment/worldpay_junior.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/payment/worldpay_junior.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: worldpay_junior.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_TITLE', 'WorldPay Junior');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_PUBLIC_TITLE', 'Credit Card');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.worldpay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">Visit WorldPay Website</a>');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_SUCCESSFUL_TRANSACTION', 'The payment transaction has been successfully performed!');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_CONTINUE_BUTTON', 'Click here to continue to %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/shipping/flat.php 2.3.1.src/includes/languages/english/modules/shipping/flat.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/shipping/flat.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/shipping/flat.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: flat.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/shipping/item.php 2.3.1.src/includes/languages/english/modules/shipping/item.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/shipping/item.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/shipping/item.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: item.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/shipping/table.php 2.3.1.src/includes/languages/english/modules/shipping/table.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/shipping/table.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/shipping/table.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: table.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/shipping/usps.php 2.3.1.src/includes/languages/english/modules/shipping/usps.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/shipping/usps.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/shipping/usps.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: usps.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -11,9 +11,9 @@
 */
 
 define('MODULE_SHIPPING_USPS_TEXT_TITLE', 'United States Postal Service');
-define('MODULE_SHIPPING_USPS_TEXT_DESCRIPTION', 'United States Postal Service<br><br>You will need to have registered an account with USPS at http://www.uspsprioritymail.com/et_regcert.html to use this module<br><br>USPS expects you to use pounds as weight measure for your products.');
+define('MODULE_SHIPPING_USPS_TEXT_DESCRIPTION', 'United States Postal Service<br /><br />You will need to have registered an account with USPS at http://www.uspsprioritymail.com/et_regcert.html to use this module<br /><br />USPS expects you to use pounds as weight measure for your products.');
 define('MODULE_SHIPPING_USPS_TEXT_OPT_PP', 'Parcel Post');
 define('MODULE_SHIPPING_USPS_TEXT_OPT_PM', 'Priority Mail');
 define('MODULE_SHIPPING_USPS_TEXT_OPT_EX', 'Express Mail');
-define('MODULE_SHIPPING_USPS_TEXT_ERROR', 'An error occured with the USPS shipping calculations.<br>If you prefer to use USPS as your shipping method, please contact the store owner.');
+define('MODULE_SHIPPING_USPS_TEXT_ERROR', 'An error occured with the USPS shipping calculations.<br />If you prefer to use USPS as your shipping method, please contact the store owner.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/shipping/zones.php 2.3.1.src/includes/languages/english/modules/shipping/zones.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/shipping/zones.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/shipping/zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_digg.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_digg.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_digg.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_digg.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_DIGG_TITLE', 'Digg');
+  define('MODULE_SOCIAL_BOOKMARKS_DIGG_DESCRIPTION', 'Share products on Digg.');
+  define('MODULE_SOCIAL_BOOKMARKS_DIGG_PUBLIC_TITLE', 'Share on Digg');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_email.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_email.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_email.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_email.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_EMAIL_TITLE', 'E-Mail');
+  define('MODULE_SOCIAL_BOOKMARKS_EMAIL_DESCRIPTION', 'Share products via e-mail.');
+  define('MODULE_SOCIAL_BOOKMARKS_EMAIL_PUBLIC_TITLE', 'Share via E-Mail');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_facebook_like.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_facebook_like.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_facebook_like.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_facebook_like.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_TITLE', 'Facebook Like');
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_DESCRIPTION', 'Share products on Facebook Like.');
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_PUBLIC_TITLE', 'Share on Facebook');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_facebook.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_facebook.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_facebook.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_facebook.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_TITLE', 'Facebook');
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_DESCRIPTION', 'Share products on Facebook.');
+  define('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_PUBLIC_TITLE', 'Share on Facebook');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_google_buzz.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_google_buzz.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_google_buzz.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_google_buzz.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_TITLE', 'Google Buzz');
+  define('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_DESCRIPTION', 'Share products on Google Buzz.');
+  define('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_PUBLIC_TITLE', 'Share on Google Buzz');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_twitter_button.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_twitter_button.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_twitter_button.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_twitter_button.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_TITLE', 'Twitter Button');
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_DESCRIPTION', 'Share products with Twitter Button.');
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_PUBLIC_TITLE', 'Tweet');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_twitter.php 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_twitter.php
--- 2.2rc2a.cp.src/includes/languages/english/modules/social_bookmarks/sb_twitter.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/languages/english/modules/social_bookmarks/sb_twitter.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,16 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_TITLE', 'Twitter');
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_DESCRIPTION', 'Share products on Twitter.');
+  define('MODULE_SOCIAL_BOOKMARKS_TWITTER_PUBLIC_TITLE', 'Share on Twitter');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/password_forgotten.php 2.3.1.src/includes/languages/english/password_forgotten.php
--- 2.2rc2a.cp.src/includes/languages/english/password_forgotten.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/password_forgotten.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: password_forgotten.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -20,7 +20,7 @@
 define('TEXT_NO_EMAIL_ADDRESS_FOUND', 'Error: The E-Mail Address was not found in our records, please try again.');
 
 define('EMAIL_PASSWORD_REMINDER_SUBJECT', STORE_NAME . ' - New Password');
-define('EMAIL_PASSWORD_REMINDER_BODY', 'A new password was requested from ' . $REMOTE_ADDR . '.' . "\n\n" . 'Your new password to \'' . STORE_NAME . '\' is:' . "\n\n" . '   %s' . "\n\n");
+define('EMAIL_PASSWORD_REMINDER_BODY', 'A new password was requested from ' . tep_get_ip_address() . '.' . "\n\n" . 'Your new password to \'' . STORE_NAME . '\' is:' . "\n\n" . '   %s' . "\n\n");
 
 define('SUCCESS_PASSWORD_SENT', 'Success: A new password has been sent to your e-mail address.');
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/privacy.php 2.3.1.src/includes/languages/english/privacy.php
--- 2.2rc2a.cp.src/includes/languages/english/privacy.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/privacy.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: privacy.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/product_info.php 2.3.1.src/includes/languages/english/product_info.php
--- 2.2rc2a.cp.src/includes/languages/english/product_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/product_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/product_reviews_info.php 2.3.1.src/includes/languages/english/product_reviews_info.php
--- 2.2rc2a.cp.src/includes/languages/english/product_reviews_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/product_reviews_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_reviews_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/product_reviews.php 2.3.1.src/includes/languages/english/product_reviews.php
--- 2.2rc2a.cp.src/includes/languages/english/product_reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/product_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/product_reviews_write.php 2.3.1.src/includes/languages/english/product_reviews_write.php
--- 2.2rc2a.cp.src/includes/languages/english/product_reviews_write.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/product_reviews_write.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: product_reviews_write.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,9 +16,11 @@
 define('SUB_TITLE_REVIEW', 'Your Review:');
 define('SUB_TITLE_RATING', 'Rating:');
 
-define('TEXT_NO_HTML', '<small><font color="#ff0000"><b>NOTE:</b></font></small>&nbsp;HTML is not translated!');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>BAD</b></font></small>');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>GOOD</b></font></small>');
+define('TEXT_NO_HTML', '<small><font color="#ff0000"><strong>NOTE:</strong></font></small>&nbsp;HTML is not translated!');
+define('TEXT_BAD', '<small><font color="#ff0000"><strong>BAD</strong></font></small>');
+define('TEXT_GOOD', '<small><font color="#ff0000"><strong>GOOD</strong></font></small>');
+
+define('TEXT_REVIEW_RECEIVED', 'Thank you for your review. It has been submitted to the store owner for approval and should appear shortly.');
 
 define('TEXT_CLICK_TO_ENLARGE', 'Click to enlarge');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/products_new.php 2.3.1.src/includes/languages/english/products_new.php
--- 2.2rc2a.cp.src/includes/languages/english/products_new.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/products_new.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: products_new.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/reviews.php 2.3.1.src/includes/languages/english/reviews.php
--- 2.2rc2a.cp.src/includes/languages/english/reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/shipping.php 2.3.1.src/includes/languages/english/shipping.php
--- 2.2rc2a.cp.src/includes/languages/english/shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/shopping_cart.php 2.3.1.src/includes/languages/english/shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/english/shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -21,8 +21,8 @@
 define('SUB_TITLE_SUB_TOTAL', 'Sub-Total:');
 define('SUB_TITLE_TOTAL', 'Total:');
 
-define('OUT_OF_STOCK_CANT_CHECKOUT', 'Products marked with ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' dont exist in desired quantity in our stock.<br>Please alter the quantity of products marked with (' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '), Thank you');
-define('OUT_OF_STOCK_CAN_CHECKOUT', 'Products marked with ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' dont exist in desired quantity in our stock.<br>You can buy them anyway and check the quantity we have in stock for immediate deliver in the checkout process.');
+define('OUT_OF_STOCK_CANT_CHECKOUT', 'Products marked with ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' dont exist in desired quantity in our stock.<br />Please alter the quantity of products marked with (' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '), Thank you');
+define('OUT_OF_STOCK_CAN_CHECKOUT', 'Products marked with ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' dont exist in desired quantity in our stock.<br />You can buy them anyway and check the quantity we have in stock for immediate deliver in the checkout process.');
 
 define('TEXT_ALTERNATIVE_CHECKOUT_METHODS', '- OR -');
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/specials.php 2.3.1.src/includes/languages/english/specials.php
--- 2.2rc2a.cp.src/includes/languages/english/specials.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/ssl_check.php 2.3.1.src/includes/languages/english/ssl_check.php
--- 2.2rc2a.cp.src/includes/languages/english/ssl_check.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/ssl_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ssl_check.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -13,8 +13,8 @@
 define('NAVBAR_TITLE', 'Security Check');
 define('HEADING_TITLE', 'Security Check');
 
-define('TEXT_INFORMATION', 'We have detected that your browser has generated a different SSL Session ID used throughout our secure pages.<br><br>For security measures you will need to logon to your account again to continue shopping online.<br><br>Some browsers such as Konqueror 3.1 does not have the capability of generating a secure SSL Session ID automatically which we require. If you use such a browser, we recommend switching to another browser such as <a href="http://www.microsoft.com/ie/" target="_blank">Microsoft Internet Explorer</a>, <a href="http://channels.netscape.com/ns/browsers/download_other.jsp" target="_blank">Netscape</a>, or <a href="http://www.mozilla.org/releases/" target="_blank">Mozilla</a>, to continue your online shopping experience.<br><br>We have taken this measurement of security for your benefit, and apologize upfront if any inconveniences are caused.<br><br>Please contact the store owner if you have any questions relating to this requirement, or to continue purchasing products offline.');
+define('TEXT_INFORMATION', 'We have detected that your browser has generated a different SSL Session ID used throughout our secure pages.<br /><br />For security measures you will need to logon to your account again to continue shopping online.<br /><br />Some browsers such as Konqueror 3.1 does not have the capability of generating a secure SSL Session ID automatically which we require. If you use such a browser, we recommend switching to another browser such as <a href="http://www.microsoft.com/ie/" target="_blank">Microsoft Internet Explorer</a>, <a href="http://channels.netscape.com/ns/browsers/download_other.jsp" target="_blank">Netscape</a>, or <a href="http://www.mozilla.org/releases/" target="_blank">Mozilla</a>, to continue your online shopping experience.<br /><br />We have taken this measurement of security for your benefit, and apologize upfront if any inconveniences are caused.<br /><br />Please contact the store owner if you have any questions relating to this requirement, or to continue purchasing products offline.');
 
 define('BOX_INFORMATION_HEADING', 'Privacy and Security');
-define('BOX_INFORMATION', 'We validate the SSL Session ID automatically generated by your browser on every secure page request made to this server.<br><br>This validation assures that it is you who is navigating on this site with your account and not somebody else.');
+define('BOX_INFORMATION', 'We validate the SSL Session ID automatically generated by your browser on every secure page request made to this server.<br /><br />This validation assures that it is you who is navigating on this site with your account and not somebody else.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english/tell_a_friend.php 2.3.1.src/includes/languages/english/tell_a_friend.php
--- 2.2rc2a.cp.src/includes/languages/english/tell_a_friend.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english/tell_a_friend.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: tell_a_friend.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -23,7 +23,7 @@
 define('FORM_FIELD_FRIEND_NAME', 'Your Friends Name:');
 define('FORM_FIELD_FRIEND_EMAIL', 'Your Friends E-Mail Address:');
 
-define('TEXT_EMAIL_SUCCESSFUL_SENT', 'Your email about <b>%s</b> has been successfully sent to <b>%s</b>.');
+define('TEXT_EMAIL_SUCCESSFUL_SENT', 'Your email about <strong>%s</strong> has been successfully sent to <strong>%s</strong>.');
 
 define('TEXT_EMAIL_SUBJECT', 'Your friend %s has recommended this great product from %s');
 define('TEXT_EMAIL_INTRO', 'Hi %s!' . "\n\n" . 'Your friend, %s, thought that you would be interested in %s from %s.');
@@ -34,4 +34,5 @@
 define('ERROR_TO_ADDRESS', 'Error: Your friends e-mail address must be a valid e-mail address.');
 define('ERROR_FROM_NAME', 'Error: Your name must not be empty.');
 define('ERROR_FROM_ADDRESS', 'Error: Your e-mail address must be a valid e-mail address.');
+define('ERROR_ACTION_RECORDER', 'Error: An e-mail has already been sent. Please try again in %s minutes.');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/english.php 2.3.1.src/includes/languages/english.php
--- 2.2rc2a.cp.src/includes/languages/english.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/english.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: english.php 1743 2007-12-20 18:02:36Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -22,6 +22,8 @@
 define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
 define('DATE_FORMAT', 'm/d/Y'); // this is used for date()
 define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
+define('JQUERY_DATEPICKER_I18N_CODE', ''); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
+define('JQUERY_DATEPICKER_FORMAT', 'mm/dd/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate
 
 ////
 // Return date in raw format
@@ -39,10 +41,10 @@
 define('LANGUAGE_CURRENCY', 'USD');
 
 // Global entries for the <html> tag
-define('HTML_PARAMS','dir="LTR" lang="en"');
+define('HTML_PARAMS', 'dir="ltr" lang="en"');
 
 // charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
+define('CHARSET', 'utf-8');
 
 // page title
 define('TITLE', STORE_NAME);
@@ -69,67 +71,6 @@
 // text for date of birth example
 define('DOB_FORMAT_STRING', 'mm/dd/yyyy');
 
-// categories box text in includes/boxes/categories.php
-define('BOX_HEADING_CATEGORIES', 'Categories');
-
-// manufacturers box text in includes/boxes/manufacturers.php
-define('BOX_HEADING_MANUFACTURERS', 'Manufacturers');
-
-// whats_new box text in includes/boxes/whats_new.php
-define('BOX_HEADING_WHATS_NEW', 'What\'s New?');
-
-// quick_find box text in includes/boxes/quick_find.php
-define('BOX_HEADING_SEARCH', 'Quick Find');
-define('BOX_SEARCH_TEXT', 'Use keywords to find the product you are looking for.');
-define('BOX_SEARCH_ADVANCED_SEARCH', 'Advanced Search');
-
-// specials box text in includes/boxes/specials.php
-define('BOX_HEADING_SPECIALS', 'Specials');
-
-// reviews box text in includes/boxes/reviews.php
-define('BOX_HEADING_REVIEWS', 'Reviews');
-define('BOX_REVIEWS_WRITE_REVIEW', 'Write a review on this product!');
-define('BOX_REVIEWS_NO_REVIEWS', 'There are currently no product reviews');
-define('BOX_REVIEWS_TEXT_OF_5_STARS', '%s of 5 Stars!');
-
-// shopping_cart box text in includes/boxes/shopping_cart.php
-define('BOX_HEADING_SHOPPING_CART', 'Shopping Cart');
-define('BOX_SHOPPING_CART_EMPTY', '0 items');
-
-// order_history box text in includes/boxes/order_history.php
-define('BOX_HEADING_CUSTOMER_ORDERS', 'Order History');
-
-// best_sellers box text in includes/boxes/best_sellers.php
-define('BOX_HEADING_BESTSELLERS', 'Bestsellers');
-define('BOX_HEADING_BESTSELLERS_IN', 'Bestsellers in<br>&nbsp;&nbsp;');
-
-// notifications box text in includes/boxes/products_notifications.php
-define('BOX_HEADING_NOTIFICATIONS', 'Notifications');
-define('BOX_NOTIFICATIONS_NOTIFY', 'Notify me of updates to <b>%s</b>');
-define('BOX_NOTIFICATIONS_NOTIFY_REMOVE', 'Do not notify me of updates to <b>%s</b>');
-
-// manufacturer box text
-define('BOX_HEADING_MANUFACTURER_INFO', 'Manufacturer Info');
-define('BOX_MANUFACTURER_INFO_HOMEPAGE', '%s Homepage');
-define('BOX_MANUFACTURER_INFO_OTHER_PRODUCTS', 'Other products');
-
-// languages box text in includes/boxes/languages.php
-define('BOX_HEADING_LANGUAGES', 'Languages');
-
-// currencies box text in includes/boxes/currencies.php
-define('BOX_HEADING_CURRENCIES', 'Currencies');
-
-// information box text in includes/boxes/information.php
-define('BOX_HEADING_INFORMATION', 'Information');
-define('BOX_INFORMATION_PRIVACY', 'Privacy Notice');
-define('BOX_INFORMATION_CONDITIONS', 'Conditions of Use');
-define('BOX_INFORMATION_SHIPPING', 'Shipping & Returns');
-define('BOX_INFORMATION_CONTACT', 'Contact Us');
-
-// tell a friend box text in includes/boxes/tell_a_friend.php
-define('BOX_HEADING_TELL_A_FRIEND', 'Tell A Friend');
-define('BOX_TELL_A_FRIEND_TEXT', 'Tell someone you know about this product.');
-
 // checkout procedure text
 define('CHECKOUT_BAR_DELIVERY', 'Delivery Information');
 define('CHECKOUT_BAR_PAYMENT', 'Payment Information');
@@ -160,7 +101,6 @@
 define('CATEGORY_PASSWORD', 'Your Password');
 
 define('ENTRY_COMPANY', 'Company Name:');
-define('ENTRY_COMPANY_ERROR', '');
 define('ENTRY_COMPANY_TEXT', '');
 define('ENTRY_GENDER', 'Gender:');
 define('ENTRY_GENDER_ERROR', 'Please select your Gender.');
@@ -183,7 +123,6 @@
 define('ENTRY_STREET_ADDRESS_ERROR', 'Your Street Address must contain a minimum of ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' characters.');
 define('ENTRY_STREET_ADDRESS_TEXT', '*');
 define('ENTRY_SUBURB', 'Suburb:');
-define('ENTRY_SUBURB_ERROR', '');
 define('ENTRY_SUBURB_TEXT', '');
 define('ENTRY_POST_CODE', 'Post Code:');
 define('ENTRY_POST_CODE_ERROR', 'Your Post Code must contain a minimum of ' . ENTRY_POSTCODE_MIN_LENGTH . ' characters.');
@@ -202,13 +141,11 @@
 define('ENTRY_TELEPHONE_NUMBER_ERROR', 'Your Telephone Number must contain a minimum of ' . ENTRY_TELEPHONE_MIN_LENGTH . ' characters.');
 define('ENTRY_TELEPHONE_NUMBER_TEXT', '*');
 define('ENTRY_FAX_NUMBER', 'Fax Number:');
-define('ENTRY_FAX_NUMBER_ERROR', '');
 define('ENTRY_FAX_NUMBER_TEXT', '');
 define('ENTRY_NEWSLETTER', 'Newsletter:');
 define('ENTRY_NEWSLETTER_TEXT', '');
 define('ENTRY_NEWSLETTER_YES', 'Subscribed');
 define('ENTRY_NEWSLETTER_NO', 'Unsubscribed');
-define('ENTRY_NEWSLETTER_ERROR', '');
 define('ENTRY_PASSWORD', 'Password:');
 define('ENTRY_PASSWORD_ERROR', 'Your Password must contain a minimum of ' . ENTRY_PASSWORD_MIN_LENGTH . ' characters.');
 define('ENTRY_PASSWORD_ERROR_NOT_MATCHING', 'The Password Confirmation must match your Password.');
@@ -228,11 +165,11 @@
 
 // constants for use in tep_prev_next_display function
 define('TEXT_RESULT_PAGE', 'Result Pages:');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> products)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> orders)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> reviews)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> new products)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> specials)');
+define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> products)');
+define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> orders)');
+define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> reviews)');
+define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> new products)');
+define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Displaying <strong>%d</strong> to <strong>%d</strong> (of <strong>%d</strong> specials)');
 
 define('PREVNEXT_TITLE_FIRST_PAGE', 'First Page');
 define('PREVNEXT_TITLE_PREVIOUS_PAGE', 'Previous Page');
@@ -302,17 +239,11 @@
 
 define('TEXT_REQUIRED', '<span class="errorText">Required</span>');
 
-define('ERROR_TEP_MAIL', '<font face="Verdana, Arial" size="2" color="#ff0000"><b><small>TEP ERROR:</small> Cannot send the email through the specified SMTP server. Please check your php.ini setting and correct the SMTP server if necessary.</b></font>');
-define('WARNING_INSTALL_DIRECTORY_EXISTS', 'Warning: Installation directory exists at: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/install. Please remove this directory for security reasons.');
-define('WARNING_CONFIG_FILE_WRITEABLE', 'Warning: I am able to write to the configuration file: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/includes/configure.php. This is a potential security risk - please set the right user permissions on this file.');
-define('WARNING_SESSION_DIRECTORY_NON_EXISTENT', 'Warning: The sessions directory does not exist: ' . tep_session_save_path() . '. Sessions will not work until this directory is created.');
-define('WARNING_SESSION_DIRECTORY_NOT_WRITEABLE', 'Warning: I am not able to write to the sessions directory: ' . tep_session_save_path() . '. Sessions will not work until the right user permissions are set.');
-define('WARNING_SESSION_AUTO_START', 'Warning: session.auto_start is enabled - please disable this php feature in php.ini and restart the web server.');
-define('WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT', 'Warning: The downloadable products directory does not exist: ' . DIR_FS_DOWNLOAD . '. Downloadable products will not work until this directory is valid.');
+define('ERROR_TEP_MAIL', '<font face="Verdana, Arial" size="2" color="#ff0000"><strong><small>TEP ERROR:</small> Cannot send the email through the specified SMTP server. Please check your php.ini setting and correct the SMTP server if necessary.</strong></font>');
 
 define('TEXT_CCVAL_ERROR_INVALID_DATE', 'The expiry date entered for the credit card is invalid. Please check the date and try again.');
 define('TEXT_CCVAL_ERROR_INVALID_NUMBER', 'The credit card number entered is invalid. Please check the number and try again.');
 define('TEXT_CCVAL_ERROR_UNKNOWN_CARD', 'The first four digits of the number entered are: %s. If that number is correct, we do not accept that type of credit card. If it is wrong, please try again.');
 
-define('FOOTER_TEXT_BODY', 'Copyright &copy; ' . date('Y') . ' <a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . STORE_NAME . '</a><br>Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');
+define('FOOTER_TEXT_BODY', 'Copyright &copy; ' . date('Y') . ' <a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . STORE_NAME . '</a><br />Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_edit.php 2.3.1.src/includes/languages/espanol/account_edit.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_edit.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_edit.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: account_edit.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Editar Cuenta');
-
-define('HEADING_TITLE', 'Datos de Mi Cuenta');
-
-define('MY_ACCOUNT_TITLE', 'Mi Cuenta');
-
-define('SUCCESS_ACCOUNT_UPDATED', 'Se ha actualizado su cuenta correctamente.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_history_info.php 2.3.1.src/includes/languages/espanol/account_history_info.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_history_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_history_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-<?php
-/*
-  $Id: account_history_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Historial');
-define('NAVBAR_TITLE_3', 'Pedido Num. %s');
-
-define('HEADING_TITLE', 'Datos del Pedido');
-
-define('HEADING_ORDER_NUMBER', 'Pedido Num. %s');
-define('HEADING_ORDER_DATE', 'Fecha del Pedido:');
-define('HEADING_ORDER_TOTAL', 'Total del Pedido:');
-
-define('HEADING_DELIVERY_ADDRESS', 'Direcci&oacute;n de Entrega');
-define('HEADING_SHIPPING_METHOD', 'Gastos de Env&iacute;o');
-
-define('HEADING_PRODUCTS', 'Producto');
-define('HEADING_TAX', 'Impuestos');
-define('HEADING_TOTAL', 'Total');
-
-define('HEADING_BILLING_INFORMATION', 'Datos de Facturaci&oacute;n');
-define('HEADING_BILLING_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n');
-define('HEADING_PAYMENT_METHOD', 'Forma de Pago');
-
-define('HEADING_ORDER_HISTORY', 'Mis Pedidos');
-define('HEADING_COMMENT', 'Comentarios');
-define('TEXT_NO_COMMENTS_AVAILABLE', 'No hay comentarios.');
-
-define('TABLE_HEADING_DOWNLOAD_DATE', 'Fecha Caducidad: ');
-define('TABLE_HEADING_DOWNLOAD_COUNT', ' descargas restantes');
-define('HEADING_DOWNLOAD', 'Descarga tus productos aqui');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_history.php 2.3.1.src/includes/languages/espanol/account_history.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_history.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_history.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: account_history.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Pedidos');
-
-define('HEADING_TITLE', 'Todos Mis Pedidos');
-
-define('TEXT_ORDER_NUMBER', 'N&uacute;mero:');
-define('TEXT_ORDER_STATUS', 'Estado:');
-define('TEXT_ORDER_DATE', 'Fecha:');
-define('TEXT_ORDER_SHIPPED_TO', 'Enviado A:');
-define('TEXT_ORDER_BILLED_TO', 'Facturado A:');
-define('TEXT_ORDER_PRODUCTS', 'Productos:');
-define('TEXT_ORDER_COST', 'Precio:');
-define('TEXT_VIEW_ORDER', 'Ver Pedido');
-
-define('TEXT_NO_PURCHASES', 'No ha realizado ningun pedido a&uacute;n.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_newsletters.php 2.3.1.src/includes/languages/espanol/account_newsletters.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_newsletters.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_newsletters.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-<?php
-/*
-  $Id: account_newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Subscripci&oacute;n a Boletines');
-
-define('HEADING_TITLE', 'Subscripci&oacute;n a Boletines');
-
-define('MY_NEWSLETTERS_TITLE', 'Mis Subscripciones');
-define('MY_NEWSLETTERS_GENERAL_NEWSLETTER', 'Bolet&iacute;n General');
-define('MY_NEWSLETTERS_GENERAL_NEWSLETTER_DESCRIPTION', 'Incluye noticias, nuevos productos, ofertas especiales y otros anuncios promocionales.');
-
-define('SUCCESS_NEWSLETTER_UPDATED', 'Se han actualizado sus subscrictiones correctamente.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_notifications.php 2.3.1.src/includes/languages/espanol/account_notifications.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_notifications.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_notifications.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: account_notifications.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Avisos de Productos');
-
-define('HEADING_TITLE', 'Avisos de Productos');
-
-define('MY_NOTIFICATIONS_TITLE', 'Mis Avisos de Productos');
-define('MY_NOTIFICATIONS_DESCRIPTION', 'La lista de avisos de productos le permite estar al dia sobre los productos de su inter&eacute;s.<br><br>Para estar al d&iacute;a sobre todos los productos seleccione <b>Aviso Global de Productos</b>.');
-
-define('GLOBAL_NOTIFICATIONS_TITLE', 'Aviso Global de Productos');
-define('GLOBAL_NOTIFICATIONS_DESCRIPTION', 'Recibir avisos de todos los productos disponibles.');
-
-define('NOTIFICATIONS_TITLE', 'Avisos de Productos');
-define('NOTIFICATIONS_DESCRIPTION', 'Para quitar un aviso, desmarque la casilla correspondiente y pulse en Continuar.');
-define('NOTIFICATIONS_NON_EXISTING', 'No tiene configurados avisos para ningun producto.<br><br>Para a&ntilde;adir productos a su lista de avisos, vaya a la p&aacute;gina de informaci&oacute;n del producto y use el enlace para activar el aviso.');
-
-define('SUCCESS_NOTIFICATIONS_UPDATED', 'Se han actualizado sus avisos correctamente.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account_password.php 2.3.1.src/includes/languages/espanol/account_password.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account_password.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account_password.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: account_password.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Modificar Contrase&ntilde;a');
-
-define('HEADING_TITLE', 'Mi Contrase&ntilde;a');
-
-define('MY_PASSWORD_TITLE', 'Mi Contrase&ntilde;a');
-
-define('SUCCESS_PASSWORD_UPDATED', 'Se ha actualizado su contrase&ntilde;a correctamente.');
-define('ERROR_CURRENT_PASSWORD_NOT_MATCHING', 'Su contrase&ntilde;a actual no coincide. Por favor int&eacute;ntelo de nuevo.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/account.php 2.3.1.src/includes/languages/espanol/account.php
--- 2.2rc2a.cp.src/includes/languages/espanol/account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/account.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: account.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Mi Cuenta');
-define('HEADING_TITLE', 'Datos de Mi Cuenta');
-
-define('OVERVIEW_TITLE', 'Resumen');
-define('OVERVIEW_SHOW_ALL_ORDERS', '(ver todos mis pedidos)');
-define('OVERVIEW_PREVIOUS_ORDERS', 'Pedidos Anteriores');
-
-define('MY_ACCOUNT_TITLE', 'Mi Cuenta');
-define('MY_ACCOUNT_INFORMATION', 'Ver o modificar datos de mi cuenta.');
-define('MY_ACCOUNT_ADDRESS_BOOK', 'Ver o modificar mis direcciones.');
-define('MY_ACCOUNT_PASSWORD', 'Modificar mi contrase&ntilde;a de acceso.');
-
-define('MY_ORDERS_TITLE', 'Mis Pedidos');
-define('MY_ORDERS_VIEW', 'Ver los pedidos que he realizado.');
-
-define('EMAIL_NOTIFICATIONS_TITLE', 'Notificaciones por E-Mail');
-define('EMAIL_NOTIFICATIONS_NEWSLETTERS', 'Subscribirse or no a los boletines.');
-define('EMAIL_NOTIFICATIONS_PRODUCTS', 'Ver o modificar mis notificaciones de productos.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/address_book.php 2.3.1.src/includes/languages/espanol/address_book.php
--- 2.2rc2a.cp.src/includes/languages/espanol/address_book.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/address_book.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: address_book.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Mis Direcciones');
-
-define('HEADING_TITLE', 'Mis Direcciones Postales');
-
-define('PRIMARY_ADDRESS_TITLE', 'Direcci&oacute;n Principal');
-define('PRIMARY_ADDRESS_DESCRIPTION', 'Esta direcci&oacute;n se seleccionara por defecto para el envio y para la facturaci&oacute;n de sus pedidos.<br><br>Esta direcci&oacute;n tambi&eacute;n se utiliz&aacute; para calcular los impuestos que le corresponden.');
-
-define('ADDRESS_BOOK_TITLE', 'Direcciones');
-
-define('PRIMARY_ADDRESS', '(direcci&oacute;n principal)');
-
-define('TEXT_MAXIMUM_ENTRIES', '<font color="#ff0000"><b>NOTA:</b></font> Se permiten un m&aacute;ximo de %s direcciones.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/address_book_process.php 2.3.1.src/includes/languages/espanol/address_book_process.php
--- 2.2rc2a.cp.src/includes/languages/espanol/address_book_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/address_book_process.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: address_book_process.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Mi Cuenta');
-define('NAVBAR_TITLE_2', 'Mis Direcciones');
-
-define('NAVBAR_TITLE_ADD_ENTRY', 'Nueva Direcci&oacute;n');
-define('NAVBAR_TITLE_MODIFY_ENTRY', 'Modificar Direcci&oacute;n');
-define('NAVBAR_TITLE_DELETE_ENTRY', 'Eliminar Direcci&oacute;n');
-
-define('HEADING_TITLE_ADD_ENTRY', 'Nueva Direcci&oacute;n');
-define('HEADING_TITLE_MODIFY_ENTRY', 'Modificar Direcci&oacute;n');
-define('HEADING_TITLE_DELETE_ENTRY', 'Elminar Direcci&oacute;n');
-
-define('DELETE_ADDRESS_TITLE', 'Eliminar Direcci&oacute;n');
-define('DELETE_ADDRESS_DESCRIPTION', 'Esta seguro de que quiere eliminar la direcci&oacute;n seleccionada?');
-
-define('NEW_ADDRESS_TITLE', 'Nueva Direcci&oacute;n');
-
-define('SELECTED_ADDRESS', 'Direcci&oacute;n Seleccionada');
-define('SET_AS_PRIMARY', 'Direcci&oacute;n Principal.');
-
-define('SUCCESS_ADDRESS_BOOK_ENTRY_DELETED', 'Se ha eliminado la direcci&oacute;n correctamente.');
-define('SUCCESS_ADDRESS_BOOK_ENTRY_UPDATED', 'Se ha actualizado la direcci&oacute;n correctamente.');
-
-define('WARNING_PRIMARY_ADDRESS_DELETION', 'La direcci&oacute;n principal no se puede eliminar. Seleccione otra direcci&oacute;n como la principal e int&eacute;ntelo de nuevo.');
-
-define('ERROR_NONEXISTING_ADDRESS_BOOK_ENTRY', 'No existe la direcci&oacute;n.');
-define('ERROR_ADDRESS_BOOK_FULL', 'Ha llegado al limite de direcciones permitidas. Elimine una direcci&oacute;n que no utilice para poder a&ntilde;adir una nueva.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/advanced_search.php 2.3.1.src/includes/languages/espanol/advanced_search.php
--- 2.2rc2a.cp.src/includes/languages/espanol/advanced_search.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/advanced_search.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,58 +0,0 @@
-<?php
-/*
-  $Id: advanced_search.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'B&uacute;squeda Avanzada');
-define('NAVBAR_TITLE_2', 'Resultados de la B&uacute;squeda');
-
-define('HEADING_TITLE_1', 'B&uacute;squeda Avanzada');
-define('HEADING_TITLE_2', 'Productos que satisfacen los criterios de b&uacute;squeda');
-
-define('HEADING_SEARCH_CRITERIA', 'B&uacute;squeda Avanzada');
-
-define('TEXT_SEARCH_IN_DESCRIPTION', 'Buscar tambien en la descripci&oacute;n');
-define('ENTRY_CATEGORIES', 'Categoras:');
-define('ENTRY_INCLUDE_SUBCATEGORIES', 'Incluir Subcategoras');
-define('ENTRY_MANUFACTURERS', 'Fabricante:');
-define('ENTRY_PRICE_FROM', 'Desde precio:');
-define('ENTRY_PRICE_TO', 'a precio:');
-define('ENTRY_DATE_FROM', 'De fecha de alta:');
-define('ENTRY_DATE_TO', 'a alta:');
-
-define('TEXT_SEARCH_HELP_LINK', '<u>Ayuda</u> [?]');
-
-define('TEXT_ALL_CATEGORIES', 'Todas');
-define('TEXT_ALL_MANUFACTURERS', 'Todos');
-
-define('HEADING_SEARCH_HELP', 'Consejos para B&uacute;squeda Avanzada');
-define('TEXT_SEARCH_HELP', 'El motor de b&uacute;squeda le permite hacer una b&uacute;squeda por palabras clave en el modelo, nombre y descripci&oacute;n del producto y en el nombre del fabricante.<br><br>Cuando haga una busqueda por palabras o frases clave, puede separar estas con los operadores l&oacute;gicos AND y OR. Por ejemplo, puede hacer una busqueda por <u>microsoft AND raton</u>. Esta b&uacute;squeda dar&iacute;a como resultado los productos que contengan ambas palabras. Por el contrario, si teclea  <u>raton OR teclado</u>, conseguir&aacute; una lista de los productos que contengan las dos o solo una de las palabras. Si no se separan las palabras o frases clave con AND o con OR, la b&uacute;squeda se hara usando por defecto el operador logico AND.<br><br>Puede realizar busquedas exactas de varias palabras encerrandolas entre comillas. Por ejemplo, si busca <u>"ordenador portatil"</u>, obtendr&aacute;s una lista de productos que tengan exactamente esa cadena en ellos.<br><br>Se pueden usar paratensis para controlar el orden de las operaciones l&oacute;gicas. Por ejemplo, puede introducir <u>microsoft and (teclado or raton or "visual basic")</u>.');
-define('TEXT_CLOSE_WINDOW', '<u>Cerrar Ventana</u> [x]');
-
-define('TABLE_HEADING_IMAGE', '');
-define('TABLE_HEADING_MODEL', 'Modelo');
-define('TABLE_HEADING_PRODUCTS', 'Descripci&oacute;n');
-define('TABLE_HEADING_MANUFACTURER', 'Fabricante');
-define('TABLE_HEADING_QUANTITY', 'Cantidad');
-define('TABLE_HEADING_PRICE', 'Precio');
-define('TABLE_HEADING_WEIGHT', 'Peso');
-define('TABLE_HEADING_BUY_NOW', 'Compre Ahora');
-
-define('TEXT_NO_PRODUCTS', 'No hay productos que corresponden con los criterios de b&uacute;squeda.');
-
-define('ERROR_AT_LEAST_ONE_INPUT', 'Debe introducir al menos un criterio de b&uacute;squeda.');
-define('ERROR_INVALID_FROM_DATE', 'La Fecha de Alta Desde es inv&aacute;lida');
-define('ERROR_INVALID_TO_DATE', 'La Fecha de Alta Hasta es inv&aacute;lida');
-define('ERROR_TO_DATE_LESS_THAN_FROM_DATE', 'Fecha de Alta Hasta debe ser mayor que Fecha de Alta Desde');
-define('ERROR_PRICE_FROM_MUST_BE_NUM', 'El Precio Desde debe ser n&uacute;merico');
-define('ERROR_PRICE_TO_MUST_BE_NUM', 'El Precio Hasta debe ser n&uacute;merico');
-define('ERROR_PRICE_TO_LESS_THAN_PRICE_FROM', 'Precio Hasta debe ser mayor o igual que Precio Desde');
-define('ERROR_INVALID_KEYWORDS', 'Palabras clave incorrectas');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_confirmation.php 2.3.1.src/includes/languages/espanol/checkout_confirmation.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_confirmation.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_confirmation.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-/*
-  $Id: checkout_confirmation.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Realizar Pedido');
-define('NAVBAR_TITLE_2', 'Confirmaci&oacute;n');
-
-define('HEADING_TITLE', 'Estoy preparado para Comprar!');
-
-define('HEADING_DELIVERY_ADDRESS', 'Direcci&oacute;n de Entrega');
-define('HEADING_SHIPPING_METHOD', 'Forma de Envio');
-define('HEADING_PRODUCTS', 'Producto');
-define('HEADING_TAX', 'Impuestos');
-define('HEADING_TOTAL', 'Total');
-define('HEADING_BILLING_INFORMATION', 'Datos de Facturaci&oacute;n');
-define('HEADING_BILLING_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n');
-define('HEADING_PAYMENT_METHOD', 'Forma de Pago');
-define('HEADING_PAYMENT_INFORMATION', 'Datos del Pago');
-define('HEADING_ORDER_COMMENTS', 'Comentarios Sobre Su Orden');
-
-define('TEXT_EDIT', 'Cambio');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_payment_address.php 2.3.1.src/includes/languages/espanol/checkout_payment_address.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_payment_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_payment_address.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_payment_address.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Realizar Pedido');
-define('NAVBAR_TITLE_2', 'Cambiar Direcci&oacute;n de Facturaci&oacute;n');
-
-define('HEADING_TITLE', 'Forma de Pago');
-
-define('TABLE_HEADING_PAYMENT_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n');
-define('TEXT_SELECTED_PAYMENT_DESTINATION', 'Esta es la direcci&oacute;n de facturaci&oacute;n seleccionada, donde se enviar&aacute; la factura.');
-define('TITLE_PAYMENT_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n:');
-
-define('TABLE_HEADING_ADDRESS_BOOK_ENTRIES', 'Libreta de Direcciones');
-define('TEXT_SELECT_OTHER_PAYMENT_DESTINATION', 'Seleccione la direcci&oacute;n para el env&iacute;o de la factura de este pedido si quiere que sea enviada a un sitio diferente.');
-define('TITLE_PLEASE_SELECT', 'Seleccione');
-
-define('TABLE_HEADING_NEW_PAYMENT_ADDRESS', 'Nueva Direcci&oacute;n de Facturaci&oacute;n');
-define('TEXT_CREATE_NEW_PAYMENT_ADDRESS', 'Use el formulario siguiente para crear una nueva direcci&oacute;n en su libreta y usarla como direcci&oacute;n de facturaci&oacute;n en este pedido.');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Continuar con el Proceso de Compra');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'para seleccionar el m&eacute;todo de pago.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_payment.php 2.3.1.src/includes/languages/espanol/checkout_payment.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_payment.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_payment.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_payment.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Realizar Pedido');
-define('NAVBAR_TITLE_2', 'Forma de Pago');
-
-define('HEADING_TITLE', 'Forma de Pago');
-
-define('TABLE_HEADING_BILLING_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n');
-define('TEXT_SELECTED_BILLING_DESTINATION', 'Elija la direcci&oacute;n de su libreta donde quiera recibir la factura.');
-define('TITLE_BILLING_ADDRESS', 'Direcci&oacute;n de Facturaci&oacute;n:');
-
-define('TABLE_HEADING_PAYMENT_METHOD', 'Forma de Pago');
-define('TEXT_SELECT_PAYMENT_METHOD', 'Escoja la forma de pago preferida para este pedido.');
-define('TITLE_PLEASE_SELECT', 'Seleccione');
-define('TEXT_ENTER_PAYMENT_INFORMATION', 'Esta es la unica forma de pago disponible para este pedido.');
-
-define('TABLE_HEADING_COMMENTS', 'Agregue Los Comentarios Sobre Su Orden');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Continuar con el Proceso de Compra');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'para confirmar este pedido.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_process.php 2.3.1.src/includes/languages/espanol/checkout_process.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_process.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: checkout_process.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('EMAIL_TEXT_SUBJECT', 'Procesar Pedido');
-define('EMAIL_TEXT_ORDER_NUMBER', 'Nmero de Pedido:');
-define('EMAIL_TEXT_INVOICE_URL', 'Pedido Detallado:');
-define('EMAIL_TEXT_DATE_ORDERED', 'Fecha del Pedido:');
-define('EMAIL_TEXT_PRODUCTS', 'Productos');
-define('EMAIL_TEXT_SUBTOTAL', 'Subtotal:');
-define('EMAIL_TEXT_TAX', 'Impuestos:      ');
-define('EMAIL_TEXT_SHIPPING', 'Gastos de Envo: ');
-define('EMAIL_TEXT_TOTAL', 'Total:    ');
-define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Direccin de Entrega');
-define('EMAIL_TEXT_BILLING_ADDRESS', 'Direccin de Facturacin');
-define('EMAIL_TEXT_PAYMENT_METHOD', 'Forma de Pago');
-
-define('EMAIL_SEPARATOR', '------------------------------------------------------');
-define('TEXT_EMAIL_VIA', 'por');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_shipping_address.php 2.3.1.src/includes/languages/espanol/checkout_shipping_address.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_shipping_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_shipping_address.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_shipping_address.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Realizar Compra');
-define('NAVBAR_TITLE_2', 'Cambiar Direcci&oacute;n de Entrega');
-
-define('HEADING_TITLE', 'Datos del Env&iacute;o');
-
-define('TABLE_HEADING_SHIPPING_ADDRESS', 'Direcci&oacute;n de Entrega');
-define('TEXT_SELECTED_SHIPPING_DESTINATION', 'Esta es la direcci&oacute;n de entrega seleccionada para el env&iacute;o de los productos de su pedido.');
-define('TITLE_SHIPPING_ADDRESS', 'Direcci&oacute;n de Entrega:');
-
-define('TABLE_HEADING_ADDRESS_BOOK_ENTRIES', 'Libreta de Direcciones');
-define('TEXT_SELECT_OTHER_SHIPPING_DESTINATION', 'Seleccione otra direcci&oacute;n de entrega para su pedido si quiere que sea entregado en un sitio diferente.');
-define('TITLE_PLEASE_SELECT', 'Seleccione');
-
-define('TABLE_HEADING_NEW_SHIPPING_ADDRESS', 'Nueva Direcci&oacute;n');
-define('TEXT_CREATE_NEW_SHIPPING_ADDRESS', 'Use el formulario siguiente para crear una direcci&oacute;n nueva en su libreta y usarla como direcci&oacute;n de entrega para su pedido.');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Continuar con el Proceso de Compra');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'para seleccionar la forma de envio.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_shipping.php 2.3.1.src/includes/languages/espanol/checkout_shipping.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Realizar Pedido');
-define('NAVBAR_TITLE_2', 'Forma de Env&iacute;o');
-
-define('HEADING_TITLE', 'Datos del Env&iacute;o');
-
-define('TABLE_HEADING_SHIPPING_ADDRESS', 'Direcci&oacute;n de Entrega');
-define('TEXT_CHOOSE_SHIPPING_DESTINATION', 'Escoja una direcci&oacute;n de su libreta para la entrega de los productos de este pedido.');
-define('TITLE_SHIPPING_ADDRESS', 'Direcci&oacute;n de Entrega:');
-
-define('TABLE_HEADING_SHIPPING_METHOD', 'Forma de Env&iacute;o');
-define('TEXT_CHOOSE_SHIPPING_METHOD', 'Seleccione la forma de env&iacute;o preferida para la entrega de este pedido.');
-define('TITLE_PLEASE_SELECT', 'Seleccione');
-define('TEXT_ENTER_SHIPPING_INFORMATION', 'Esta es la unica forma de env&iacute;o disponible para su pedido.');
-
-define('TABLE_HEADING_COMMENTS', 'Agregue Los Comentarios Sobre Su Orden');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Continuar con el Proceso de Compra');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'para seleccionar la forma de pago.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/checkout_success.php 2.3.1.src/includes/languages/espanol/checkout_success.php
--- 2.2rc2a.cp.src/includes/languages/espanol/checkout_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/checkout_success.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-/*
-  $Id: checkout_success.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Pedido');
-define('NAVBAR_TITLE_2', 'Realizado con Exito');
-
-define('HEADING_TITLE', 'Su Pedido ha sido Procesado!');
-
-define('TEXT_SUCCESS', 'Su pedido ha sido realizado con &eacute;xito! Sus productos llegar&aacute;n a su destino de 2 a 5 dias laborales.');
-define('TEXT_NOTIFY_PRODUCTS', 'Por favor notifiqueme de cambios realizados a los productos seleccionados:');
-define('TEXT_SEE_ORDERS', 'Puede ver sus pedidos viendo la pagina de <a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">\'Su Cuenta\'</a> y pulsando sobre <a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL') . '">\'Historial\'</a>.');
-define('TEXT_CONTACT_STORE_OWNER', 'Dirija sus preguntas al <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">administrador</a>.');
-define('TEXT_THANKS_FOR_SHOPPING', 'Gracias por comprar con nosotros!');
-
-define('TABLE_HEADING_COMMENTS', 'Introduzca un comentario sobre su pedido');
-
-define('TABLE_HEADING_DOWNLOAD_DATE', 'Fecha Caducidad: ');
-define('TABLE_HEADING_DOWNLOAD_COUNT', ' descargas restantes');
-define('HEADING_DOWNLOAD', 'Descargue sus productos aqui:');
-define('FOOTER_DOWNLOAD', 'Puede descargar sus productos mas tarde en \'%s\'');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/conditions.php 2.3.1.src/includes/languages/espanol/conditions.php
--- 2.2rc2a.cp.src/includes/languages/espanol/conditions.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/conditions.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: conditions.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Condiciones de Uso');
-define('HEADING_TITLE', 'Condiciones de Uso');
-
-define('TEXT_INFORMATION', 'Ponga aqui sus condiciones de uso.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/contact_us.php 2.3.1.src/includes/languages/espanol/contact_us.php
--- 2.2rc2a.cp.src/includes/languages/espanol/contact_us.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/contact_us.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: contact_us.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Contactenos');
-define('NAVBAR_TITLE', 'Contactenos');
-define('TEXT_SUCCESS', 'Su consulta ha sido enviada al encargado de la tienda.');
-define('EMAIL_SUBJECT', 'Consulta desde ' . STORE_NAME);
-
-define('ENTRY_NAME', 'Nombre Completo:');
-define('ENTRY_EMAIL', 'Direcci&oacute;n E-Mail:');
-define('ENTRY_ENQUIRY', 'Consulta:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/cookie_usage.php 2.3.1.src/includes/languages/espanol/cookie_usage.php
--- 2.2rc2a.cp.src/includes/languages/espanol/cookie_usage.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/cookie_usage.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: cookie_usage.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Uso de Cookies');
-define('HEADING_TITLE', 'Uso de Cookies');
-
-define('TEXT_INFORMATION', 'Hemos detectado que su navegador no soporta cookies o los tiene desactivados.<br><br>Para continuar comprando, le invitamos a activar los cookies en su navegador.<br><br>Para el navegador <b>Internet Explorer</b>, siga estas instrucciones:<br><ol><li>En el men&uacute; de Herramientas seleccione Opciones de Internet</li><li>Seleccione la pesta&ntilde;a de Seguridad y establezca el nivel de seguridad en la posici&oacute;n Media</li></ol>Hemos adoptado esta medida de seguridad en su beneficio y le pedimos disculpas anticipadas por cualquier inconveniente que pudiera ocasionarle.<br><br>Pongase en contacto con nosotros con cualquier pregunta que tenga al respecto o para realizar sus compras offline.');
-
-define('BOX_INFORMATION_HEADING', 'Seguridad y Privacidad de los Cookies');
-define('BOX_INFORMATION', 'Se deben activar cookies para continuar comprando en esta tienda para realzar la privacidad y seguridad de su visita a este sitio.<br><br>Habilitando soporte para cookies en su navegador podemos garantizar que solo usted realizar operaciones en su nombre y se asegura la privacidad de sus datos.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/create_account.php 2.3.1.src/includes/languages/espanol/create_account.php
--- 2.2rc2a.cp.src/includes/languages/espanol/create_account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/create_account.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: create_account.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Crear una Cuenta');
-define('NAVBAR_TITLE_2', 'Proceso');
-define('HEADING_TITLE', 'Datos de Mi Cuenta');
-
-define('TEXT_ORIGIN_LOGIN', '<font color="#FF0000"><small><b>NOTA:</b></font></small> Si ya ha pasado por este proceso y tiene una cuenta, por favor <a href="%s"><u>entre</u></a> en ella.');
-
-define('EMAIL_SUBJECT', 'Bienvenido a ' . STORE_NAME);
-define('EMAIL_GREET_MR', 'Estimado ' . stripslashes($HTTP_POST_VARS['lastname']) . ',' . "\n\n");
-define('EMAIL_GREET_MS', 'Estimado ' . stripslashes($HTTP_POST_VARS['lastname']) . ',' . "\n\n");
-define('EMAIL_GREET_NONE', 'Estimado ' . stripslashes($HTTP_POST_VARS['firstname']) . ',' . "\n\n");
-define('EMAIL_WELCOME', 'Le damos la bienvenida a <b>' . STORE_NAME . '</b>.' . "\n\n");
-define('EMAIL_TEXT', 'Ahora puede disfrutar de los <b>servicios</b> que le ofrecemos. Algunos de estos servicios son:' . "\n\n" . '<li><b>Carrito Permanente</b> - Cualquier producto aadido a su carrito permanecera en el hasta que lo elimine, o hasta que realice la compra.' . "\n" . '<li><b>Libro de Direcciones</b> - Podemos enviar sus productos a otras direcciones aparte de la suya! Esto es perfecto para enviar regalos de cumpleaos directamente a la persona que cumple aos.' . "\n" . '<li><b>Historia de Pedidos</b> - Vea la relacion de compras que ha realizado con nosotros.' . "\n" . '<li><b>Comentarios</b> - Comparta su opinion sobre los productos con otros clientes.' . "\n\n");
-define('EMAIL_CONTACT', 'Para cualquier consulta sobre nuestros servicios, por favor escriba a: ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n\n");
-define('EMAIL_WARNING', '<b>Nota:</b> Esta direccion fue suministrada por uno de nuestros clientes. Si usted no se ha suscrito como socio, por favor comuniquelo a ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n");
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/create_account_success.php 2.3.1.src/includes/languages/espanol/create_account_success.php
--- 2.2rc2a.cp.src/includes/languages/espanol/create_account_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/create_account_success.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: create_account_success.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Crear una Cuenta');
-define('NAVBAR_TITLE_2', 'Exito');
-define('HEADING_TITLE', 'Su cuenta ha sido creada!');
-define('TEXT_ACCOUNT_CREATED', 'Enhorabuena! Su cuenta ha sido creada con &eacute;xito! Ahora puede disfrutar de las ventajas de disponer de una cuenta para mejorar su navegaci&oacute;n en nuestro catalogo. Si tiene <small><b>CUALQUIER</b></small> pregunta sobre el funcionamiento del catalogo, por favor comuniquela al <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">encargado</a>.<br><br>Se ha enviado una confirmaci&oacute;n a la direcci&oacute;n de correo que nos ha proporcionado. Si no lo ha recibido en 1 hora pongase en contacto con <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">nosotros</a>.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/download.php 2.3.1.src/includes/languages/espanol/download.php
--- 2.2rc2a.cp.src/includes/languages/espanol/download.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/download.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,12 +0,0 @@
-<?php
-/*
-  $Id: download.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_add_address.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_add_address.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_add_address.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_add_address.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    RnƱ|ݼn>^!     ,       ٞ8ͻ`(cLTAƴd,tB`+HN 89KZX#`\D΃c(D8W5u:G +(>
q
j(Y4\  by		0	u|v>uu=Զv0ϸ_ 
- (}Q[c^l\]F祓)TܓN!2$BPGN8XjP4Ӡ<	`$<OVSP(֠`>4P_q//qP#Ut@ kCP.eBP+֜5I֘[+y+
e9p1x?ZIuTYl;I_
-:sLLl߷5UG@$
-xܫIec585PlRoa7RB{,0	rPmDB[w_l'[FlkCA̱|uk뵄g_g@x8q+x{9NeFұua1m C)(%p^QT5g1EC+(Pp+sqRV!LT@$ueP^=B6MY PQhpg B fŚr!uyJ}ik>=@јIPIFjE!F"馜= 驨fe
-NT hꬳ i)J ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_address_book.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_address_book.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_address_book.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_address_book.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89ay    Qmѫ|䞮n>^!     ,    y   ɞ8ͻ`(>2 YÎp,Rq2pH5L'p9tJk4%9bHe*P>!Hm
nO Wz9z<il `
cA``ll$	c}~Z(ƅ
-'y'rqɇ?WYϻH&'m' z
-z+>	"AC$+x 88%A/;@zL	R&d@R䓖)K(D K lĦAǣ0T'NQ
-<%KLC63)Ww|LS6heH{!'@IƦ`*Ҷ08\*}Wd3(0"6`zL6dV
]f{2qZCP]mZqWC?+EFF =Y=)}n:}|
-# @@ŌQB+'}5A u	LSBh$%WQZ@/΅҇g|HHJ<#
-&⊧pRh!$'ȏQބE@&IV :^KB
-+&p\at)| ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_back.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_back.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_back.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_back.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,9 +0,0 @@
-GIF89aS    ԮhaaGeZuPHHឮn>^!     ,    S   ɹ8ͻ֑LF`뾜q4 BGTZͱ8
-CXN
c{hl!LHqFDiH*mP.}6 ![?vLccb ]vUK
-
-$Y?=w#t	$
- $`
	 X
9W
-psus<ОА
ڻޓ%ĸ3v9RR"`Y8qq=DѠI0`w}F(1qjB;`3Wz .l[M4FԺ&n]A
-̓:{P
!JAfzτ~
-
-(>cP6%,@ ,KvA2y'0 [h<?c R0
zyi s^s畟K"  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_buy_now.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_buy_now.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_buy_now.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_buy_now.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89aP    1THfk<\VrCcu:ZGgz?^_z[vLiHhÀִ                                                                              ! % ,    P   @PxPȤrl:P
-HJtzuBXL$YH@VK `GHHGJB!H  GGW~GWiWHWB ǹBiB̐hTC
-I3'NB"x+' 6 6! 69t RIA|G}$%B kڴIHdw()[x$D-/ŌxN>X`:BI.n^)Rčݹ>$Mus$ P!A ``@f
-ᒅI)њvo߷ep#uU)<WBlL3]iB5\\nmd!A  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_change_address.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_change_address.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_change_address.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_change_address.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a    Qn쫹|ݞn>^!     ,       ɞ8ͻ`((S: 5n)tmW+R?!0Ȥ2@-l!4.ib"~F*.7^crlg.}+lcdf3
T2)_WH9]			= a	
vF@vA_._{r oʴfvfr`
-*у]ꎙ+yA
-LࠟMBCQ.
b5=(٠رF&(yREL+U"#SJhsh̢KtsE4+$@ 9p,側 cAzVgE*bBZ`mHs+m!\@ '@:c¢7tY	wf<<Yet۲=x1U	(P xb$DP2sdnțҺ9=]\8)[m@$Lj_K0x;ygdl/_PWn!CzX	4D TPSYGzIuANmE\q_{uP7$
-gRK{G F #OIdTY@<,:CT(p" C6!pu:]ZdteXf=,B{u7&c0h`+Dͤ@`q9h)*Js1J
-h!무>x?<D
-qI ЅM?4> 3 p?RVk:Lѵv M ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_checkout.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_checkout.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_checkout.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_checkout.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a    RnSKKجឮn>^!     ,       ɹ8ͻ`(L @ִd,tB*0	`+H_PtE/IZ/qa@Qn("rg6hNjcq0)\Z_qX)
QF*!^y$	 9	)~rkxDXejxtj z[lĘ](ܵݍ
-Q\>OO(.,-Z:Vif·  ^1Hi0Npס9UusL|4@E.0a`8ADn) SL57EB6@	
n)4cqk7iw(XfuTU
yt{3UU&AsZzncG98P-g:}Fٻ QYx
-XgB{mY.h0VnKS=Nwv$bl/;9C}~gIޠ@3U7ѥf>Q#/G߸dap_~p;(Qp.OD@T:AI8R=
(#5tO@ A,@1> 
-@PEKQB29d$z2$3GbWeK]`\4(FQ@!@li D%Ý }2/&袂poFڨND  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_confirm_order.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_confirm_order.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_confirm_order.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_confirm_order.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89am    Ro֐|ឮn>^!     ,    m   ɹ8ͻ`xdN
- d*p,ojpJ L9	pH̐N]vs tŨ`JFd~Ej0a
-+L60(ș)}&hl/#V78Z	fA;jfX*j i<g<}
Y[Vx&V

-+zMukʐ
-դ)ʽ-	&].N` lCx[	^,6C/H . 
0PD_/tX+L6Jە
-9,ӲiD0g2+)?!"1ZC*M>]^aF{^	hbe9giWښAZM󁴽 x{-a}M֛O(.vAn<(t!FëL#60\9s,wl9sXK¢Lm9@N9t˼! qD÷DE'
5ڀp	  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_continue.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_continue.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_continue.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_continue.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89ak    ToSKK׭ឮn>^!     ,    k   ɹ8ͻ` dN
- d*p,gpJ;2Dpx!&Yha4.ps`0RQ`RU0$LXMi"6q7m Y	
f@;gWk
--fheW zX&uM&q|ɒw
-lJ7hѨ
-g
	K&\[y3CqNk^6xsX!}HŜ œ"j(1(E2ٕAՈ@
-$ ^}rbʣE} J6=JyA
T.`(	sB?
.׭F]	$xf9goX.Z5, b<tRwa]DwqJlbYDa͗hsjUߍxx<ί0_E>${7tӒǻy" qO\<H QC ʠ	  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_continue_shopping.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_continue_shopping.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_continue_shopping.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_continue_shopping.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    >^qPHHCbXs؉Kie~wqq揢=]Ro:[`XX_y?_!     ,        `hlp,Lc>NFpH,(щAqv6\rb<@nhS1!йD]k\#&x	>+
;5&il
-Ui>w^"ZaRxO,
B l"aå]
-H	uhVd*"R>Œß
U 彿U( 	2YJC <x wLPΙ
-N჆ 䈗bp{ࣜU0=&3F0($'@ʕ-yJخ_ 7y0EerL kH#'qusڏMzԚlh쬥6@ڜKpWY\4Ȥ]%蘰*4rط) t<7cݷl?|rrn~aNsS:,5,ΘK6qag,|)AQmW9֛G {25i龍g!Zb-4(XFmށ'v& Y|M		FaH*q,$04@]}*bZ+>|0`(K $@gc:a<7 +$SKH`\,E)`+ 04j i*@PiD)BH` 臂;irS9<'Lx"zp@
-}dR	i-`P4 ,Yj+ @0P7KBP1:6lĒ$*5~qm=	y+k!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_delete.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_delete.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_delete.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89ac    So{,,eeꞮn>^!     ,    c   ɞ8ͻ(S9)A5jpldO!`pd":FrҸ,%@[x9L'4LhSqmqvxgd:U*b
[yb3bw
-VnMnnKyU%t `< 	We|z
-S
tܘ
-&	oݥn{-ǟ/=q %@wp`k܃1a šӌV8͂d<(_HJldw"Qǵ	5#XNi1%*cq&2e&,,Ȉ@P*R`&c|
-I$b
-;uJ3,Ҭ$ V&@ psN48Ҥ6͕<WbD5aڝM!+Gs.{(tR,79  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_edit_account.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_edit_account.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_edit_account.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_edit_account.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a    Ro(((ֳyyy~ьឮn>^!     ,       ɹ8ͻ`(r2 YÎp,Sڌ9
pHPA,vŨ`NF$v pv`NE%=:
TF`
3\^C1 Vu	q`	|`h	
-^
aA<  |	~y
-Y(nVV~Nƀ
-N͝'ڮW}	'hඣؤYEVV`
8q<p`[@.%	z @c%W y8c
0(W8'T
-\eDx1( 4sM@=TJLWP5QfW_QڡX: dJ$jޭ
-iz&`($!prw 㵻s,w9_C&"#DfjS!԰S5x%`=	ᶼv>jq8>|n&,G\ W<	r%N: `zƞ|'Aw$.RdK8*$`p)ࢉ$4nPDP] Pf$ $
PdF_8VEV8A ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_history.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_history.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_history.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_history.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,12 +0,0 @@
-GIF89a    Tm...|ឮn>^!     ,       ɹ8ͻ`(dǤN dktmd #5	 rȤr9B@X ج֘JU w:d볛irwڱ3bs0w5=
-|
U
"}b,!6:
-=>UqA	n2	f~Gm{oή:in
-B 
-a
-z
-#FPQҁ.=XhS S%K`8:8 c8_&͉d,*P^ % Eb(F1A*S|@0(Ҥ8jlW{Z**QCS#{s
-,0b`JF a$F/&WXIP};PC 
-ѣ3F2ʂ8/7<S'0b1ȜYO p_%ٙ?lto6` Nln*?1t4pOXTx}PP E˩}Qf	'$G8%":wcr` rvE1BM=U	56ϕgGrI@?r\T
-pE.  _
-  EUN61<A3l$$lsE	;v_
W,! ~E/Q@),H+) 'dSY^VVTjRY@t:@ W4bڈ
-PlǦ"dZx&$>댶:\+	d}B{$4ی+ H+Ǽ ' @BOmN%,MLg ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_in_cart.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_in_cart.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_in_cart.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_in_cart.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89a    UmEEEӢ|ឮn>^!     ,       ɹ8ͻ`((S:) 5n)tm-JFl2(
-F,jCvIZ?H=@ P2ΌK#A v uA_5c 	
->]1@ 
3!^
%
% bndxrrCxS jgjI	 
-	d
- [(iZL<yZ(\ ([5Q:pXSLR8"aH/Q)rpf
(^v6x@q
l9xP4_WQ|\y{p4$`e"@#tT)^
	÷ѥ	!<rI2`@O|z@y[BA;cI\Om;  	XgE+qO0̺dQƌ
-UI:iU4 r39ObA|=6cX1T M^
!;iT M qE %=	BIHhs%|kY[}F^[ 
-jeHKFQygkEF^ AA2@W	!q[!	LB$0,/	PVCxƍf@AQ}bf9TUvZ"hpdWYRnt12i1-ĕi\&<i1?0é~*QW4:jC!
@Т&Ã$)u"h=(+ '-z0v	NBv D  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_login.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_login.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_login.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_login.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ad    >^qkkkQQQCb虪Xs111Ki䌟=]e~:[Ro_y!     ,    d   ` `hlHc=JYZM *D)X6pJrh5AEeuLnY45N]8"!pOU#	&"n:0
$:mU`}X
-K#1tX {A%}k "poO[/" ""4	%("A&X"5-	z͗ړ)گr 6$8H@NF@1g b ߾e@`L
@0F/	0Z2Y8$ 68e^ëSg `#Bpd1[6du#U4aI5A0mbe"izV6O,XkDbK# )}}	@4#0L"=bpl'Zvޠ{"$.'B,
TQk>@0`Њ|xd!kZc ,A!$}p%ǉLp}a6F(Vha
DTC ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_notifications.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_notifications.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_notifications.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_notifications.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    qqqئYYY}LiGGG666VrXsf;[_yߘCbq>^!     ,       'ghlp,pDNJEpH,ES 6hqiج6.=Scu۴z͢(E!*K9a."s%-&fR"Cz+7&d8  9~/,&"CƤ+&#"h,R=$%		VF̫:< &e@f2,  P  7-B4Ad>KN刀>$|'#(Pއ
-fB0gw0@!_f$L.`"$QsD8>P+"mK4d'oQ4>}0B@QdP Z`oK٢kSf&+vyX 0@a e׵Ǯ6zl3#
V=_8Puᬳ۪c{c͔vwDW#QF@D[
-VHmaLx|yI%g2Ȑ4 "A6p3!"'Z<[d@1Ԗf4SB}Rx^" ua0V#y`N1
-$cX>
-zM@A#Pdb$q5`J RN3ʂ,t s6ᣘ:JhA<pd_pL0^ƺ)뮼$F!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_quick_find.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_quick_find.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_quick_find.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_quick_find.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    GR  !@gUn%V " ! *ͅ  x 7ux73s ,,iklry|3(BaaQss.44ϲF?<8h a\Wyto`_^a[Vlfatniqkg}8KFCP{v|som|zQgmNP    <  O
-
-11UMMrjj獍www\\\MMMJJJ;;;222                                                                                                   ,       UW][\[VUX=?;297($R6]	U4-!_F['4/,%E\&+*)#@T[:
- %#
_ZV<SMN.B
5K03GD>_HIOYZ AJQL_Cp@O/1
-*T ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_remove_notifications.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_remove_notifications.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_remove_notifications.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_remove_notifications.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-GIF89a    Rn{e~++KiꋞnXsee~}q>^      !     ,        'Kghlp,t
Ψ mH,ȗo72; CIZ[<'ȫ-eHx4uzN0d]=+:v/".&"4
-&"f& k{""
L,.4ƺi'n
O'"&'߻"'
-	0PSxExڠ>x4q885		8$ȧS"T Kl&9F6E1`{
-;Tq4CሃG	5@A	-q@JDs։	@ɨb;9GT LRTJǡj^"#UsZqDz< ES};Jfω:TSN3u`
`/j:JA⌤1Tȗ*	hͩ'L,I6PEԨS@iLRO"@QՆM rQh؉	
-5PpԙUdP7
-襲JMC`(&Mg"uX<@_sN(j)HM|Ptb:I&b_dEd-(УO~#TVMdDyfPΈP45xQ&@ڟ0r's=Nw*Ugt?$y!X [ݸ\
-")֜njB8,s߂[^aIrwQH`@\jM
-#RAMeEXH^]+@ ԰[5-[٠2!#4  q,*;8
-Lk ^< t'hsC ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_reviews.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_reviews.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_reviews.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_reviews.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a}    Um...꫹|ឮn>^!     ,    }   ɹ8ͻ`(f1 YÎp,:> cNmH,Jq9;tjl4%yd?BN{19\8<׼i,n"
F Wsbt9 v[
-
B<	=Y	;h	v_ .<Z?eO'?O,W~y΅ڄ j}Ir`@*;aXPjҬ@3	"La!8@` ?9 t	C#:p<QsL9 E9_[@g 2kP,')0Ӂ&C{3"	J>3`E0}s(Рi;Pj AG?syHXa@dU]udDgAԧŀ](jX

#
wUeg'38|<uQgc=j/h[ NXvZ֗]C		 @py	5v`	V&}؆r@tt
-a;<n.آ6h+xE8uy\8ǒL dhMVie"uIpL%+$@6$ךpR
-  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_search.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_search.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_search.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_search.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89ad    >^r̮Cb׈XsrrrɼٙKi߼e=]:[Ro_y!     ,    d   ` 
`hlTc=VܔbK jDiP>pJzEeuLna#ƔY
-B$`0qy F&5
:/N"
|'	cXK^#H0`"(c
-k m5"[. "N :
RX`
-S'"/y H "^^
lĀYR 8BA:%H2A )SL"%kq*0Xp$"
-$` CW :ty* AVJP`,	`2V%J ,k\ !	Cm:4ؖ(f2yJF\PXDP,^\!mk-7Mm2٤P_J 1$f]z
-RuP@e`ϕMxaE)[*P$@dc3<ehldI7 PAZXy\H
 @ /g߀/x`
	32r"hc	#ha zv8׀$h(,b ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_shipping_options.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_shipping_options.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_shipping_options.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_shipping_options.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,11 +0,0 @@
-GIF89a    QmSSSԨyyy|όឮn>^!     ,       ɹ8ͻ`(d(S:) 5n)tm-JF DpdcSZXR#*i\I=rmabh),bU!
n`)Z2 		} 
-?q	@sprxElpq?	q/*	l
-_<
-؍B^)}\^%ʤ~K߄(* .h"%nQ)vɓʁ |)!f<PI@D*0b>85Q&fM
-H9H)" :L"iAJLJ
-ցh;ElCⲕTٺ<  roFvtubń8J)rFqˎ=ހǄ F%P@ ./v-c7ءuK*fro,ev%Q7itoF-Dm7CDcm1WIhjBWu 7V"VC^e΄^҄f	])@7sC=0ģCm*
-"!tAi+
-@Aa <@љ|8J`pNmPĦ[&a9NQX>LƉYsLdBnbji.j1:l
-4CȮnpU9F&{Ï#
-.d
-ND@<Ukn.I ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_tell_a_friend.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_tell_a_friend.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_tell_a_friend.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_tell_a_friend.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      3         !   ,       >H0F@DD (tC(x1:*52V0)^fJJXB ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_update_cart.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_update_cart.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_update_cart.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_update_cart.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a    TnPNS

ȉ螮n>^!     ,       ɞ8ͻ`(#L @ִd,tB*,	!`+H)E:	ZFnҸ,&	P|b7 0N`b
-
-dT_
}$
RF	(i#3 P)\
ki
-/kisrlr  	k0^+d['m|ÍmØP쓠@~.=0 B	DU`K)(pA0g>q	Gs;2888zI 6a@sAp@<JARe)%~evO)źa`Xl?$H3n*LZ@|թ)7e3	 4Iv	R:̘$Y!
	ɹAKg$&-^5pDa(r
Hy&C%
u'lSRf
	ȝWA!@@k破E1	prz܃myb$! A!l4 tRFsm!02Ax,
-0 &9g1Ez5 y`29hw%[IcA	<;aGaĥC?1&9f`Hjg$W/W.0	%b褈EjPLT(0*e,]p ,ba Iy*kCQ 	ʬJ;I
-z  =(4C3.lTmK ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_update.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_update.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_update.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_update.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,11 +0,0 @@
-GIF89ad     
lklgci%"'EBG։
hao2/5'%)~! "¾<;=vo~ľý62;kgp~~z $$!(C>Jdah" %lfu)',XT^a]gsoy74<njuTQY[Vd'%,)'.WV[욪ֹԿ9Z:[;[;\<\=]=]>^?_BaCbEdEdIgKiLjNkMjRnRoQmSpTpVrWsYtXsXtYtZu_y^x^ya{c|e~d~hkpqsz}ĝàťȫ̮ͲзDd~ţǩ+,+VWVMNLdecWXVUVTefcQQPҼ}}}xxxllliiiEEECCC@@@000
-
-
-                                                                                                            ,    d    	xՙ*\ȰÇ#2=yp C
90
-aJRҺ͛8|¸BF_T
-ѣEh+SB.]ĎA	r"Dz|$+" 4jEwRI	Cc,#EE@nƢ=CFckb,Ybc$6& {ĈDdW6B $"ō>
-Uo
-%љR<HgFG?0P!leLYJҢFn;	|4t遙6tƜ@"ȁĂ@d4K"!P00D/_i
DxXba7BITTx@D` 7 C7+d	tcxR`$xgWhIT؇@(`
< 7&S7ɓ(`۝Zr9ދY$Im
-p701"p3@"x %a:T)bL1Kl
F``
Hp@h
-wIj`6JogҞ6<q:p2t^h	@cV x؋(%y'v-MrPK=
,L @z1WTE45n,ڝma)6"P*b@X4
6E![.TO@Hc5@r5FEQiX"@]J$1
-F؁P!`%~Q-6Ht&rā8bJc
I<-j|߀.~J ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_write_review.gif 2.3.1.src/includes/languages/espanol/images/buttons/button_write_review.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/button_write_review.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/button_write_review.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89a    Qn(((׳yyy}ыꞮn>^!     ,       ɞ8ͻ`(dʤN
- dktmS!?Ej28ȤrZ
~O-,!4.J ۺ7(1` {t]b*-
+7cey
##:]	} 	hV
hel 1r_{ ahFn	A_?l	
-eo{҄
-`+xTC~
-Ϻ䉙*/z-u[O_j,t@"PGCKW*c7@J cਤu	%3u~t'.('$)A.8` p<e	. Rv5;sXo!z+KEmܵ.皝%hNFA[) W1J>:^K-<Sd8Gvm	vLEf4غp˕@ׁ.Vw3%9~72lkx@krʪÅA{g>߫?:wj Z
-C ^ 2WTdyq"KهA7`eɩM!xLV' n nuF$Pу䍳%1ފ	͆I\K2d$"2@Pa9N'2XF'h\Ri@3%1׌'|')%ҩ G٥
-:WVY2@2)ViYJr/R)dЈz
 馡`*> HB? 4&S'19òVK J$񐤸覫*D  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_delete.gif 2.3.1.src/includes/languages/espanol/images/buttons/small_delete.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_delete.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/small_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF87a-    m>^@`zNkPmDbSphIg^y~l?^Dcx墲ZuʃuBa[wiAa?_HfLjnCb{,    -   @   Ȥr\P,
-ͬY`40%mvBT,ՄfÉϗuL xL  s!v  !SiJ"#K i!s!vui$J%JrGSBSsBI&'K!G(sGHiK)t ! f fI*+,-hGhv$[1PBjظE$]p䘢cIɓ(cq  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_edit.gif 2.3.1.src/includes/languages/espanol/images/buttons/small_edit.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_edit.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/small_edit.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF87a-    m>^@`zNkPmDbSphIg^y~ؔl?^Dcx墲ZuʃuBa[wiAa?_HfLjnCb{,    -   @   Ȥr\P,
-ͬY`4dیH9 *5!dfȗtI r d! "j !utSk#$[!j%j"r&ZSy'(["Hfvr)d!x!d*+,-djGigiԣ[./012K34B567X]89S:;<111=|!$ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_view.gif 2.3.1.src/includes/languages/espanol/images/buttons/small_view.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/buttons/small_view.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/buttons/small_view.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF87a-    m>^@`zNkPmDb~Ig^yl?^DcxhZuSp僘uBa[wiAa?_HfLjnCb{,    -   @   Ȥr\P,
-ͬY`4d	R9#-n
| B !Y"#Z$$p$!%[&Z%GS ['([%%fGp[)d  H% M*+,-[!HH$Y./012xG34B567Xq]89S:;<1ڱA!A  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/images/icon.gif 2.3.1.src/includes/languages/espanol/images/icon.gif
--- 2.2rc2a.cp.src/includes/languages/espanol/images/icon.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/images/icon.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      xv q 6   t     !     ,       EhܮǔI%#`(!(il0tm߷, x<8ШtX'+z`o ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/index.php 2.3.1.src/includes/languages/espanol/index.php
--- 2.2rc2a.cp.src/includes/languages/espanol/index.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/index.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-<?php
-/*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_MAIN', 'Esta es la configuraci&oacute;n por defecto de osCommerce, los productos mostrados aqui son &uacute;nicamente para demonstraci&oacute;n, <b>cualquier compra realizada no ser&aacute; entregada al cliente, ni se le cobrar&aacute;</b>. Cualquier informaci&oacute;n que vea sobre estos productos debe ser tratada como ficticia.<br><br>Si desea descargar la soluci&oacute;n que hace posible esta tienda, o si quiere contribuir al proyecto de osCommerce, por favor visite <a href="http://www.oscommerce.com" target="_blank"><u>la web de soporte de osCommerce</u></a>. Esta tienda corre bajo la version <font color="#f0000"><b>' . PROJECT_VERSION . '</b></font>.<br><br>Este texto se puede cambiar editando el siguiente fichero, uno por cada idioma: [camino&nbsp;al&nbsp;cat&aacute;logo]/includes/languages/[language]/default.php.<br><br>Puede editarlo manualmente, o a traves de la Herramienta de Administraci&oacute;n con la opci&oacute;n Idiomas->[idioma]->Definir, o utilizando el Herramientas->Administrador de Ficheros.');
-define('TABLE_HEADING_NEW_PRODUCTS', 'Nuevos Productos En %s');
-define('TABLE_HEADING_UPCOMING_PRODUCTS', 'Pr&oacute;ximamente');
-define('TABLE_HEADING_DATE_EXPECTED', 'Lanzamiento');
-
-if ( ($category_depth == 'products') || (isset($HTTP_GET_VARS['manufacturers_id'])) ) {
-  define('HEADING_TITLE', 'A ver que tenemos aqui');
-  define('TABLE_HEADING_IMAGE', '');
-  define('TABLE_HEADING_MODEL', 'Modelo');
-  define('TABLE_HEADING_PRODUCTS', 'Productos');
-  define('TABLE_HEADING_MANUFACTURER', 'Fabricante');
-  define('TABLE_HEADING_QUANTITY', 'Cantidad');
-  define('TABLE_HEADING_PRICE', 'Precio');
-  define('TABLE_HEADING_WEIGHT', 'Peso');
-  define('TABLE_HEADING_BUY_NOW', 'Compre Ahora');
-  define('TEXT_NO_PRODUCTS', 'No hay productos en esta categoria.');
-  define('TEXT_NO_PRODUCTS2', 'No hay productos de este fabricante.');
-  define('TEXT_NUMBER_OF_PRODUCTS', 'N&uacute;mero de Productos: ');
-  define('TEXT_SHOW', '<b>Mostrar:</b>');
-  define('TEXT_BUY', 'Compre 1 \'');
-  define('TEXT_NOW', '\' ahora');
-  define('TEXT_ALL_CATEGORIES', 'Todas');
-  define('TEXT_ALL_MANUFACTURERS', 'Todos');
-} elseif ($category_depth == 'top') {
-  define('HEADING_TITLE', '&iquest;Que hay de nuevo por aqui?');
-} elseif ($category_depth == 'nested') {
-  define('HEADING_TITLE', 'Categorias');
-}
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/info_shopping_cart.php 2.3.1.src/includes/languages/espanol/info_shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/espanol/info_shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/info_shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: info_shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Cesta del Visitante / Cesta del Asociado');
-define('SUB_HEADING_TITLE_1', 'Cesta de Visitante');
-define('SUB_HEADING_TITLE_2', 'Cesta de Asociado');
-define('SUB_HEADING_TITLE_3', 'Informaci&oacute;n');
-define('SUB_HEADING_TEXT_1', 'A cada visitante de nuestro cat&aacute;logo le es asignado una \'Cesta de Visitante\'. Esto permite al invitado guardar sus productos en una cesta temporal. Una vez que el visitante abandona el cat&aacute;logo, tambien desaparece el contenido de su cesta.');
-define('SUB_HEADING_TEXT_2', 'A cada miembro nuestro se le asigna una \'Cesta de Asociado\'. Esto permite al asociado a&ntilde;adir productos a su cesta de la compra, y volver mas tarde para finalizar el pedido. Todos los productos permanecen en la cesta hasta que el asociado ha realizado el pedido, o hasta que sean eliminados de la cesta manualmente.');
-define('SUB_HEADING_TEXT_3', 'Si un asociado a&ntilde;ade un articulo a su \'Cesta de Visitante\' y despues decide Entrar a su Cuenta para usar su \'Cesta de Asociado\', el contenido de la \'Cesta de Visitante\' sera a&ntilde;adido a la \'Cesta de Asociado\' autom&aacute;ticamente.');
-define('TEXT_CLOSE_WINDOW', '[ cerrar ventana ]');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/login.php 2.3.1.src/includes/languages/espanol/login.php
--- 2.2rc2a.cp.src/includes/languages/espanol/login.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/login.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Entrar');
-define('HEADING_TITLE', 'Dejame Entrar!');
-
-define('HEADING_NEW_CUSTOMER', 'Nuevo Cliente');
-define('TEXT_NEW_CUSTOMER', 'Soy un nuevo cliente.');
-define('TEXT_NEW_CUSTOMER_INTRODUCTION', 'Al crear una cuenta en ' . STORE_NAME . ' podr realizar sus compras rapidamente, revisar el estado de sus pedidos y consultar sus operaciones anteriores.');
-
-define('HEADING_RETURNING_CUSTOMER', 'Ya Soy Cliente');
-define('TEXT_RETURNING_CUSTOMER', 'He comprado otras veces.');
-
-define('TEXT_PASSWORD_FORGOTTEN', '&iquest;Ha olvidado su contrase&ntilde;a? Siga este enlace y se la enviamos.');
-
-define('TEXT_LOGIN_ERROR', 'Error: El E-Mail y/o Contrase&ntilde;a no figuran en nuestros datos.');
-define('TEXT_VISITORS_CART', '<font color="#ff0000"><b>Nota:</b></font> El contenido de su &quot;Cesta de Visitante&quot; ser&aacute; a&ntilde;adido a su &quot;Cesta de Asociado&quot; una vez que haya entrado. <a href="javascript:session_win();">[M&aacute;s Informaci&oacute;n]</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/logoff.php 2.3.1.src/includes/languages/espanol/logoff.php
--- 2.2rc2a.cp.src/includes/languages/espanol/logoff.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/logoff.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Salir');
-define('NAVBAR_TITLE', 'Salir');
-define('TEXT_MAIN', 'Ha solicitado salir de su cuenta. Ahora es seguro abandonar el ordenador.<br><br>Su carrito de la compra ha sido guardado y el contenido del mismo ser&aacute; restaurado cuando vuelva a entrar en su cuenta.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_loworderfee.php 2.3.1.src/includes/languages/espanol/modules/order_total/ot_loworderfee.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_loworderfee.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/order_total/ot_loworderfee.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_loworderfee.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_LOWORDERFEE_TITLE', 'Cargo por Pedido M&iacute;nimo');
-  define('MODULE_ORDER_TOTAL_LOWORDERFEE_DESCRIPTION', 'Cargo por Pedido M&iacute;nimo');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_shipping.php 2.3.1.src/includes/languages/espanol/modules/order_total/ot_shipping.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/order_total/ot_shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: ot_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_SHIPPING_TITLE', 'Gastos de Env&iacute;o');
-  define('MODULE_ORDER_TOTAL_SHIPPING_DESCRIPTION', 'Gastos de Env&iacute;o del Pedido');
-
-  define('FREE_SHIPPING_TITLE', 'Env&iacute;o Gratuito');
-  define('FREE_SHIPPING_DESCRIPTION', 'Env&iacute;o gratuito para pedidos sobre %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_subtotal.php 2.3.1.src/includes/languages/espanol/modules/order_total/ot_subtotal.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_subtotal.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/order_total/ot_subtotal.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_subtotal.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_SUBTOTAL_TITLE', 'Subtotal');
-  define('MODULE_ORDER_TOTAL_SUBTOTAL_DESCRIPTION', 'Subtotal del Pedido');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_tax.php 2.3.1.src/includes/languages/espanol/modules/order_total/ot_tax.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_tax.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/order_total/ot_tax.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_tax.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_TAX_TITLE', 'Impuestos');
-  define('MODULE_ORDER_TOTAL_TAX_DESCRIPTION', 'Impuestos del Pedido');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_total.php 2.3.1.src/includes/languages/espanol/modules/order_total/ot_total.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/order_total/ot_total.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/order_total/ot_total.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_total.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_TOTAL_TITLE', 'Total');
-  define('MODULE_ORDER_TOTAL_TOTAL_DESCRIPTION', 'Total del Pedido');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/authorizenet_cc_aim.php 2.3.1.src/includes/languages/espanol/modules/payment/authorizenet_cc_aim.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/authorizenet_cc_aim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/authorizenet_cc_aim.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: authorizenet_cc_aim.php 1793 2008-01-11 13:48:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_TITLE', 'Authorize.net Credit Card AIM');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito (procesado con seguridad de Authorize.net)');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.authorize.net" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de Authorize.net</a>');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_OWNER', 'Titular de la tarjeta:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_NUMBER', 'N&uacute;mero de tarjeta:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_EXPIRES', 'Fecha de caducidad:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_CVC', 'C&oacute;digo de seguridad:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_TITLE', 'There has been an error processing your credit card');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_GENERAL', 'Please try again and if problems persist, please try another payment method.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_DECLINED', 'This credit card transaction has been declined. Please try again and if problems persist, please try another credit card or payment method.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_INVALID_EXP_DATE', 'The credit card expiration date is invalid. Please check the card information and try again.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_EXPIRED', 'The credit card has expired. Please try again with another card or payment method.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_CVC', 'The credit card check number (CVC) is invalid. Please check the card information and try again.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/authorizenet_cc_sim.php 2.3.1.src/includes/languages/espanol/modules/payment/authorizenet_cc_sim.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/authorizenet_cc_sim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/authorizenet_cc_sim.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: authorizenet_cc_sim.php 1793 2008-01-11 13:48:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_TITLE', 'Authorize.net Credit Card SIM');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito (procesado con seguridad de Authorize.net)');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.authorize.net" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de Authorize.net</a>');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_TITLE', 'There has been an error processing your credit card');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_VERIFICATION', 'The credit card transaction could not be verified with this order. Please try again and if problems persist, please try another payment method.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_DECLINED', 'This credit card transaction has been declined. Please try again and if problems persist, please try another payment method.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_GENERAL', 'Please try again and if problems persist, please try another payment method.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/cc.php 2.3.1.src/includes/languages/espanol/modules/payment/cc.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: cc.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_CC_TEXT_TITLE', 'Tarjeta de Cr&eacute;dito');
-  define('MODULE_PAYMENT_CC_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito');
-  define('MODULE_PAYMENT_CC_TEXT_DESCRIPTION', 'Tarjeta de Cr&eacute;dito para Pruebas:<br><br>Numero: 4111111111111111<br>Caducidad: Cualquiera');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_OWNER', 'Titular de la Tarjeta:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_NUMBER', 'N&uacute;mero de la Tarjeta:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES', 'Fecha de Caducidad:');
-  define('MODULE_PAYMENT_CC_TEXT_ERROR', 'Error en Tarjeta de Cr&eacute;dito!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/chronopay.php 2.3.1.src/includes/languages/espanol/modules/payment/chronopay.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/chronopay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/chronopay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: chronopay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_TITLE', 'ChronoPay');
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito');
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.chronopay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de ChronoPay</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/cod.php 2.3.1.src/includes/languages/espanol/modules/payment/cod.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/cod.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/cod.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: cod.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_COD_TEXT_TITLE', 'Contra Reembolso');
-  define('MODULE_PAYMENT_COD_TEXT_DESCRIPTION', 'Contra Reembolso');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/ipayment_cc.php 2.3.1.src/includes/languages/espanol/modules/payment/ipayment_cc.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/ipayment_cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/ipayment_cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: ipayment_cc.php 1811 2008-01-13 12:25:10Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_TITLE', 'iPayment');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.ipayment.de" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de iPayment</a>');
-  define('MODULE_PAYMENT_IPAYMENT_CC_ERROR_HEADING', 'Ha ocurrido un error procesando su tarjeta de cr&eacute;dito');
-  define('MODULE_PAYMENT_IPAYMENT_CC_ERROR_MESSAGE', 'Revise los datos de su tarjeta de cr&eacute;dito!');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_OWNER', 'Titular de la Tarjeta:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_NUMBER', 'N&uacute;mero de la Tarjeta:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES', 'Fecha de Caducidad:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_CHECKNUMBER', 'N&uacute;mero de Comprobaci&oacute;n:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/moneyorder.php 2.3.1.src/includes/languages/espanol/modules/payment/moneyorder.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/moneyorder.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/moneyorder.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: moneyorder.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_TITLE', 'Cheque/Transferencia Bancaria');
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_DESCRIPTION', 'Pagadero a:&nbsp;' . MODULE_PAYMENT_MONEYORDER_PAYTO . '<br><br>Enviar a<br>' . nl2br(STORE_NAME_ADDRESS) . '<br><br>' . '&nbsp;Su pedido se enviar en cuanto se reciba el pago.');
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_EMAIL_FOOTER', "Pagadero a: ". MODULE_PAYMENT_MONEYORDER_PAYTO . "\n\nEnviar a\n" . STORE_NAME_ADDRESS . "\n\n" . 'Su pedido se enviar en cuanto se reciba el pago.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/nochex.php 2.3.1.src/includes/languages/espanol/modules/payment/nochex.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/nochex.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/nochex.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: nochex.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_NOCHEX_TEXT_TITLE', 'NOCHEX');
-  define('MODULE_PAYMENT_NOCHEX_TEXT_DESCRIPTION', 'NOCHEX<br>Requiere la moneda GBP (Libras).');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_direct.php 2.3.1.src/includes/languages/espanol/modules/payment/paypal_direct.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/paypal_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: paypal_direct.php 1801 2008-01-11 16:49:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (US) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito or tarjeta del banco (procesado con seguridad de PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_DESCRIPTION', '<b>Attencion: PayPal necesita el PayPal Express Checkout M&oacute;dulo de Pago cuando este M&oacute;dulo esta instalado.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de PayPal</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectInfo\');">(info)</a><span id="paypalDirectInfo" style="display: none;"><br><i>Con el uso del Link para usar PayPal osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_OWNER', 'Titular de la tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_TYPE', 'Tipo de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_NUMBER', 'N&uacute;mero de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM', 'Tarjeta valida desde:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM_INFO', '(si est&aacute; disponible)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_EXPIRES', 'Fecha de caducidad:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_CVC', 'C&oacute;digo de seguridad:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER', 'Issue n&uacute;mero de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER_INFO', '(es solo para tarjeta de Maestro y Solo)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Error: Todos los datos son obligatorios.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_express.php 2.3.1.src/includes/languages/espanol/modules/payment/paypal_express.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/paypal_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: paypal_express.php 1798 2008-01-11 15:40:58Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_TITLE', 'PayPal Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de PayPal</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressInfo\');">(info)</a><span id="paypalExpressInfo" style="display: none;"><br><i>Con el uso del Link para usar PayPal osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_BUTTON', 'Pague con PayPal');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_COMMENTS', 'Comentarios:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_standard.php 2.3.1.src/includes/languages/espanol/modules/payment/paypal_standard.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_standard.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/paypal_standard.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: paypal_standard.php 1791 2008-01-11 13:21:23Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_TITLE', 'PayPal Website Payments Standard');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PUBLIC_TITLE', 'PayPal');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de PayPal</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalStdInfo\');">(info)</a><span id="paypalStdInfo" style="display: none;"><br><i>Con el uso del Link para usar PayPal osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_uk_direct.php 2.3.1.src/includes/languages/espanol/modules/payment/paypal_uk_direct.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_uk_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/paypal_uk_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_direct.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito or tarjeta del banco (procesado con seguridad de PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_DESCRIPTION', '<b>Attencion: PayPal necesita el PayPal Website Payments Pro (UK) Express Checkout M&oacute;dulo de Pago cuando este M&oacute;dulo esta instalado.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de PayPal</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectUKInfo\');">(info)</a><span id="paypalDirectUKInfo" style="display: none;"><br><i>Con el uso del Link para usar PayPal osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_OWNER', 'Titular de la tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_TYPE', 'Tipo de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_NUMBER', 'N&uacute;mero de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM', 'Tarjeta valida desde:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM_INFO', '(si est&aacute; disponible)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_EXPIRES', 'Fecha de caducidad:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_CVC', 'C&oacute;digo de seguridad:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER', 'Issue n&uacute;mero de tarjeta:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER_INFO', '(es solo para tarjeta de Maestro y Solo)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Error: Todos los datos son obligatorios.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_INVALID_CREDIT_CARD', 'Error: The provided credit card information is invalid. Please try again.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_uk_express.php 2.3.1.src/includes/languages/espanol/modules/payment/paypal_uk_express.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/paypal_uk_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/paypal_uk_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_express.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_DESCRIPTION', '<b>Attencion: PayPal necesita el PayPal Website Payments Pro (UK) Direct Payments M&oacute;dulo de Pago cuando este M&oacute;dulo esta instalado.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de PayPal</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressUKInfo\');">(info)</a><span id="paypalExpressUKInfo" style="display: none;"><br><i>Con el uso del Link para usar PayPal osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_BUTTON', 'Pague con PayPal');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_COMMENTS', 'Comentarios:');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL', 'Error: A general problem has occurred with the transaction. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR', 'Error: Payment module configuration error. Please verify the login credentials.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_ADDRESS', 'Error: A match of the Shipping Address City, State, and Postal Code failed. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_DECLINED', 'Error: This transaction has been declined. Please try again.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED', 'Error: PayPal Express Checkout has been disabled for this merchant. Please contact PayPal Customer Service.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/pm2checkout.php 2.3.1.src/includes/languages/espanol/modules/payment/pm2checkout.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/pm2checkout.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/pm2checkout.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: pm2checkout.php 1793 2008-01-11 13:48:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_TITLE', '2Checkout');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_TITLE', '2Checkout');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_DESCRIPTION', 'Tarjeta de Cr&eacute;dito or Alternativas');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.2checkout.com/2co/signup?affiliate=1255821" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de 2Checkout</a>&nbsp;<a href="javascript:toggleDivBlock(\'pm2checkoutInfo\');">(info)</a><span id="pm2checkoutInfo" style="display: none;"><br><i>Con el uso del Link para usar 2Checkout osCommerce dar a cada Cliente nuevo un pequeno Bonus.</i></span><br><br>Tarjeta de Cr&eacute;dito para Pruebas:<br><br>Numero: 4111111111111111<br>Caducidad: Cualquiera');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_ERROR_MESSAGE', 'Ha ocurrido un error procesando su tarjeta de cr&eacute;dito, por favor int&eacute;ntelo de nuevo.');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_TRANSACTION_ORDER', 'In Review: Transaction total did not match order total.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/psigate.php 2.3.1.src/includes/languages/espanol/modules/payment/psigate.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/psigate.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/psigate.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: psigate.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PSIGATE_TEXT_TITLE', 'PSiGate');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_DESCRIPTION', 'Tarjeta de Cr&eacute;dito para Pruebas:<br><br>Numero: 4111111111111111<br>Caducidad: Cualquiera');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_OWNER', 'Titular de la Tarjeta:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_NUMBER', 'N&uacute;mero de la Tarjeta:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_EXPIRES', 'Fecha de Caducidad:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_TYPE', 'Tipo de Tarjeta:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_JS_CC_NUMBER', '* El n&uacute;mero de la tarjeta de cr&eacute;dito debe de tener al menos ' . CC_NUMBER_MIN_LENGTH . ' numeros.\n');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_ERROR_MESSAGE', 'Ha ocurrido un error procesando su tarjeta de cr&eacute;dito, por favor intentelo de nuevo.');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_ERROR', 'Error en Tarjeta de Cr&eacute;dito!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/secpay.php 2.3.1.src/includes/languages/espanol/modules/payment/secpay.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/secpay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/secpay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: secpay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_SECPAY_TEXT_TITLE', 'SECPay');
-  define('MODULE_PAYMENT_SECPAY_TEXT_DESCRIPTION', 'Tarjeta de Cr&eacute;dito para Pruebas:<br><br>Numero: 4444333322221111<br>Caducidad Cualquiera');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR', 'Error de Tarjeta de Cr&eacute;dito!');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR_MESSAGE', 'Ha ocurrido un error procesando su tarjeta de cr&eacute;dito. Por favor, intentelo de nuevo.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/sofortueberweisung_direct.php 2.3.1.src/includes/languages/espanol/modules/payment/sofortueberweisung_direct.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/sofortueberweisung_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/sofortueberweisung_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,53 +0,0 @@
-<?php
-/*
-  $Id: sofortueberweisung_direct.php 1797 2008-01-11 14:55:19Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2006 - 2007 Henri Schmidhuber (http://www.in-solution.de)
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (!defined('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS')) {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<div align="center"><a href=' . tep_href_link('ext/modules/payment/sofortueberweisung/install.php', 'install=sofortueberweisung_direct', 'SSL') . '>' . tep_image('ext/modules/payment/sofortueberweisung/autoinstaller.gif', 'Autoinstaller (empfohlen)') . '</a></div><br><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
-  } else {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
-  }
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_TITLE', 'Sofortberweisung Direkt');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_PUBLIC_TITLE', 'Sofortberweisung');
-
-  // checkout_payment Informationen via Bild
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION_CHECKOUT_PAYMENT', '
-    <table border="0" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><a href="#" onclick="window.open(\'https://www.sofortueberweisung.de/cms/index.php?vpartner=21\', \'Popup\',\'toolbar=yes,status=no,menubar=no,scrollbars=yes,width=690,height=500\'); return false;">' . tep_image('ext/modules/payment/sofortueberweisung/images/sofortueberweisung.gif', 'Sofortberweisung ist der kostenlose, TV-zertifizierte Zahlungsdienst der Payment Network AG. Ihre Vorteile: keine zustzliche Registrierung, automatische Abbuchung von Ihrem Online-Bankkonto, hchste Sicherheitsstandards und sofortiger Versand von Lagerware. Fr die Bezahlung mit Sofortberweisung bentigen Sie Ihre eBanking Zugangsdaten, d.h. Bankverbindung, Kontonummer, PIN und TAN.') . '</a></td>
-      </tr>
-    </table>');
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION_CHECKOUT_CONFIRMATION', '
-    <table border="0" cellspacing="0" cellpadding="0">
-      <tr>
-        <td class="main"><p>Nach Besttigung der Bestellung werden Sie zum Zahlungssytem von Sofortberweisung weitergeleitet und knnen dort eine Online-berweisung duchfhren.</p><p>Hierfr bentigen Sie Ihre eBanking Zugangsdaten, d.h. Bankverbindung, Kontonummer, PIN und TAN. Mehr Informationen finden Sie hier: <a href="#" onclick="window.open(\'https://www.sofortueberweisung.de/cms/index.php?vpartner=21\', \'Popup\',\'toolbar=yes,status=no,menubar=no,scrollbars=yes,width=690,height=500\'); return false;">http://www.sofortueberweisung.de</a>.</p></td>
-      </tr>
-    </table>');
-
- // im Verwendungszweck werden folgende Platzhalter ersetzt:
- // {{order_date}} durch Bestelldatum
- // {{customer_id}} durch Kundennummer der Datenbank
- // {{customer_name}}  durch Kundenname
- // {{customer_company}} durch Kundenfirma
- // {{customer_email}} durch Email des Kunden
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_V_ZWECK_1', STORE_NAME);  // max 27 Zeichen
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_V_ZWECK_2', 'Nr. {{orderid}} Kd-Nr. {{customer_id}}'); // max 27 Zeichen
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_EMAIL_FOOTER', '');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_REDIRECT', 'Sie werden nun zu Sofortueberweisung.de weitergeleitet. Sollte dies nicht geschehen bitte den Button drcken');
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_ERROR_HEADING', 'Folgender Fehler wurde von Sofortberweisung whrend des Prozesses gemeldet:');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_ERROR_MESSAGE', 'Zahlung via Sofortberweisung ist leider nicht mglich, oder wurde auf Kundenwunsch abgebrochen. Bitte whlen sie ein andere Zahlungsweise.');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_CHECK_ERROR', 'Sofortberweisungs Transaktionscheck fehlgeschlagen. Bitte manuell berprfen');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/worldpay_junior.php 2.3.1.src/includes/languages/espanol/modules/payment/worldpay_junior.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/payment/worldpay_junior.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/payment/worldpay_junior.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: worldpay_junior.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_TITLE', 'WorldPay Junior');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_PUBLIC_TITLE', 'Tarjeta de Cr&eacute;dito');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.worldpay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">Visita la web de WorldPay</a>');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_SUCCESSFUL_TRANSACTION', 'The payment transaction has been successfully performed!');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_CONTINUE_BUTTON', 'Click here to continue to %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/flat.php 2.3.1.src/includes/languages/espanol/modules/shipping/flat.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/flat.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/shipping/flat.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: flat.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_FLAT_TEXT_TITLE', 'Tarifa Unica');
-define('MODULE_SHIPPING_FLAT_TEXT_DESCRIPTION', 'Tarifa Unica por Pedido');
-define('MODULE_SHIPPING_FLAT_TEXT_WAY', 'La mejor opcion');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/item.php 2.3.1.src/includes/languages/espanol/modules/shipping/item.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/item.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/shipping/item.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: item.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_ITEM_TEXT_TITLE', 'Por artculo');
-define('MODULE_SHIPPING_ITEM_TEXT_DESCRIPTION', 'Por artculo');
-define('MODULE_SHIPPING_ITEM_TEXT_WAY', 'La Mejor Opcion');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/table.php 2.3.1.src/includes/languages/espanol/modules/shipping/table.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/table.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/shipping/table.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: table.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_TABLE_TEXT_TITLE', 'Tabla de Tarifas');
-define('MODULE_SHIPPING_TABLE_TEXT_DESCRIPTION', 'Tabla de Tarifas');
-define('MODULE_SHIPPING_TABLE_TEXT_WAY', '');
-define('MODULE_SHIPPING_TABLE_TEXT_WEIGHT', 'Peso');
-define('MODULE_SHIPPING_TABLE_TEXT_AMOUNT', 'Total');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/usps.php 2.3.1.src/includes/languages/espanol/modules/shipping/usps.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/usps.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/shipping/usps.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: usps.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_USPS_TEXT_TITLE', 'United States Postal Service');
-define('MODULE_SHIPPING_USPS_TEXT_DESCRIPTION', 'United States Postal Service<br><br>You will need to have registered an account with USPS at http://www.uspsprioritymail.com/et_regcert.html to use this module<br><br>USPS expects you to use pounds as weight measure for your products.');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_PP', 'Parcel Post');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_PM', 'Priority Mail');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_EX', 'Express Mail');
-define('MODULE_SHIPPING_USPS_TEXT_ERROR', 'Ha ocurrido un error calculando los gastos de envio.<br>Si aun desea usar USPS para su envio, contacte con el administrador.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/zones.php 2.3.1.src/includes/languages/espanol/modules/shipping/zones.php
--- 2.2rc2a.cp.src/includes/languages/espanol/modules/shipping/zones.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/modules/shipping/zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_ZONES_TEXT_TITLE', 'Tarifa por Zona');
-define('MODULE_SHIPPING_ZONES_TEXT_DESCRIPTION', 'Tarifa basada en Zonas');
-define('MODULE_SHIPPING_ZONES_TEXT_WAY', 'Enviar A');
-define('MODULE_SHIPPING_ZONES_TEXT_UNITS', 'kg(s)');
-define('MODULE_SHIPPING_ZONES_INVALID_ZONE', 'No hay envio disponible para ese pais.');
-define('MODULE_SHIPPING_ZONES_UNDEFINED_RATE', 'No se han podido calcular los gastos de envio');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/password_forgotten.php 2.3.1.src/includes/languages/espanol/password_forgotten.php
--- 2.2rc2a.cp.src/includes/languages/espanol/password_forgotten.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/password_forgotten.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: password_forgotten.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Entrar');
-define('NAVBAR_TITLE_2', 'Constrase&ntilde;a Olvidada');
-
-define('HEADING_TITLE', 'He olvidado mi Contrase&ntilde;a!');
-
-define('TEXT_MAIN', 'Si ha olvidado su contrase&ntilde;a, introduzca su direcci&oacute;n de e-mail y le enviaremos un mensaje por e-mail con una contrase&ntilde;a nueva.');
-
-define('TEXT_NO_EMAIL_ADDRESS_FOUND', 'Error: Ese E-Mail no figura en nuestros datos, int&eacute;ntelo de nuevo.');
-
-define('EMAIL_PASSWORD_REMINDER_SUBJECT', STORE_NAME . ' - Nueva Contrasea');
-define('EMAIL_PASSWORD_REMINDER_BODY', 'Ha solicitado una Nueva Contrasea desde ' . $REMOTE_ADDR . '.' . "\n\n" . 'Su nueva contrasea para \'' . STORE_NAME . '\' es:' . "\n\n" . '   %s' . "\n\n");
-
-define('SUCCESS_PASSWORD_SENT', 'Exito: Se ha enviado una nueva contrase&ntilde;a a su e-mail');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/privacy.php 2.3.1.src/includes/languages/espanol/privacy.php
--- 2.2rc2a.cp.src/includes/languages/espanol/privacy.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/privacy.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: privacy.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Confidencialidad');
-define('HEADING_TITLE', 'Confidencialidad');
-
-define('TEXT_INFORMATION', 'Ponga aqui informaci&oacute;n sobre el tratamiento de los datos.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/product_info.php 2.3.1.src/includes/languages/espanol/product_info.php
--- 2.2rc2a.cp.src/includes/languages/espanol/product_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/product_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: product_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_PRODUCT_NOT_FOUND', 'No encontrado!');
-define('TEXT_CURRENT_REVIEWS', 'Comentarios:');
-define('TEXT_MORE_INFORMATION', 'Para obtener m&aacute;s informaci&oacute;n, visite la <a href="%s" target="_blank"><u>p&aacute;gina</u></a> del producto.');
-define('TEXT_DATE_ADDED', 'Este producto esta en nuestro cat&aacute;logo desde %s.');
-define('TEXT_DATE_AVAILABLE', '<font color="#ff0000">Este producto estar&aacute; disponible el %s.</font>');
-define('TEXT_ALSO_PURCHASED_PRODUCTS', 'Clientes que compraron este producto, tambi&eacute;n han comprado');
-define('TEXT_PRODUCT_OPTIONS', 'Opciones:');
-define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/product_reviews_info.php 2.3.1.src/includes/languages/espanol/product_reviews_info.php
--- 2.2rc2a.cp.src/includes/languages/espanol/product_reviews_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/product_reviews_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: product_reviews_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Comentarios');
-define('HEADING_TITLE', ' %s Comentarios');
-define('SUB_TITLE_PRODUCT', 'Producto:');
-define('SUB_TITLE_FROM', 'De:');
-define('SUB_TITLE_DATE', 'Fecha:');
-define('SUB_TITLE_REVIEW', 'Comentario:');
-define('SUB_TITLE_RATING', 'Evaluaci&oacute;n:');
-define('TEXT_OF_5_STARS', '%s de 5 Estrellas!');
-define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/product_reviews.php 2.3.1.src/includes/languages/espanol/product_reviews.php
--- 2.2rc2a.cp.src/includes/languages/espanol/product_reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/product_reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: product_reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Comentarios');
-
-define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
-
-define('TEXT_OF_5_STARS', '%s de 5 Estrellas!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/product_reviews_write.php 2.3.1.src/includes/languages/espanol/product_reviews_write.php
--- 2.2rc2a.cp.src/includes/languages/espanol/product_reviews_write.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/product_reviews_write.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: product_reviews_write.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Comentarios');
-
-define('SUB_TITLE_FROM', 'De:');
-define('SUB_TITLE_REVIEW', 'Comentario:');
-define('SUB_TITLE_RATING', 'Evaluaci&oacute;n:');
-
-define('TEXT_NO_HTML', '<small><font color="#ff0000"><b>NOTA:</b></font></small>&nbsp;No se traducir&aacute; el codigo HTML!');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>MALO</b></font></small>');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>BUENO</b></font></small>');
-
-define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/products_new.php 2.3.1.src/includes/languages/espanol/products_new.php
--- 2.2rc2a.cp.src/includes/languages/espanol/products_new.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/products_new.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: products_new.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Novedades');
-define('HEADING_TITLE', 'Novedades');
-
-define('TEXT_DATE_ADDED', 'Fecha Alta:');
-define('TEXT_MANUFACTURER', 'Fabricante:');
-define('TEXT_PRICE', 'Precio:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/reviews.php 2.3.1.src/includes/languages/espanol/reviews.php
--- 2.2rc2a.cp.src/includes/languages/espanol/reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Comentarios');
-define('HEADING_TITLE', 'Lea lo que estan diciendo los demas');
-define('TEXT_OF_5_STARS', '%s de 5 Estrellas!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/shipping.php 2.3.1.src/includes/languages/espanol/shipping.php
--- 2.2rc2a.cp.src/includes/languages/espanol/shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Env&iacute;os y Devoluciones');
-define('HEADING_TITLE', 'Env&iacute;os y Devoluciones');
-
-define('TEXT_INFORMATION', 'Ponga aqui informaci&oacute;n sobre los Env&iacute;os y Devoluciones');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/shopping_cart.php 2.3.1.src/includes/languages/espanol/shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/espanol/shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Contenido de la Cesta');
-define('HEADING_TITLE', 'Que hay en mi Cesta?');
-define('TABLE_HEADING_REMOVE', 'Quitar');
-define('TABLE_HEADING_QUANTITY', 'Cantidad');
-define('TABLE_HEADING_MODEL', 'Modelo');
-define('TABLE_HEADING_PRODUCTS', 'Producto(s)');
-define('TABLE_HEADING_TOTAL', 'Total');
-define('TEXT_CART_EMPTY', 'Tu Cesta de la Compra esta vacia!');
-define('SUB_TITLE_SUB_TOTAL', 'Subtotal:');
-define('SUB_TITLE_TOTAL', 'Total:');
-
-define('OUT_OF_STOCK_CANT_CHECKOUT', 'Los productos marcados con ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' no estan disponibles en la cantidad que requiere.<br>Modifique la cantidad de productos marcados con ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ', Gracias');
-define('OUT_OF_STOCK_CAN_CHECKOUT', 'Los productos marcados con ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' no estan disponibles en cantidad que requiere.<br>De todas formas, puede comprar los que hay disponibles y el resto se lo enviamos mas tarde o esperar a que la cantidad requerida este disponible.');
-
-define('TEXT_ALTERNATIVE_CHECKOUT_METHODS', '- O -');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/specials.php 2.3.1.src/includes/languages/espanol/specials.php
--- 2.2rc2a.cp.src/includes/languages/espanol/specials.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/specials.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Ofertas');
-define('HEADING_TITLE', 'Consiguelas mientras estan Calientes!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/ssl_check.php 2.3.1.src/includes/languages/espanol/ssl_check.php
--- 2.2rc2a.cp.src/includes/languages/espanol/ssl_check.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/ssl_check.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: ssl_check.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Comprobaci&oacute;n de Seguridad');
-define('HEADING_TITLE', 'Comprobaci&oacute;n de Seguridad');
-
-define('TEXT_INFORMATION', 'Hemos detectado que su navegador ha generado un Identificativo de Sesion Seguro diferente al que ha estado usando a lo largo de su visita.<br><br>Por razones de seguridad debera entrar de nuevo en su cuenta para verificar su identidad.<br><br>Algunos navegadores como Konqueror 3.1 no tienen la habilidad de generar un Identificativo de Sesion Seguro autom&aacute;ticamente. Si usa este navegador, le recomendamos cambiar a otro como <a href="http://www.microsoft.com/ie/" target="_blank">Microsoft Internet Explorer</a>, <a href="http://channels.netscape.com/ns/browsers/download_other.jsp" target="_blank">Netscape</a>, o <a href="http://www.mozilla.org/releases/" target="_blank">Mozilla</a>, para continuar con su experiencia.<br><br>Hemos adoptado esta medida de seguridad en su beneficio y le pedimos disculpas anticipadas por cualquier inconveniente que pudiera ocasionarle.<br><br>Pongase en contacto con nosotros con cualquier pregunta que tenga al respecto o para realizar sus compras offline.');
-
-define('BOX_INFORMATION_HEADING', 'Seguridad y Privacidad');
-define('BOX_INFORMATION', 'Validamos el Identificativo de Sesi&oacute;n Seguro generado autom&aacute;ticamente por su navegador en cada petici&oacute;n que realiza a este servidor.<br><br>Esta validaci&oacute;n asegura que es usted quien navega con su cuenta y no otra persona.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol/tell_a_friend.php 2.3.1.src/includes/languages/espanol/tell_a_friend.php
--- 2.2rc2a.cp.src/includes/languages/espanol/tell_a_friend.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol/tell_a_friend.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,37 +0,0 @@
-<?php
-/*
-  $Id: tell_a_friend.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Enviar a un Amigo');
-
-define('HEADING_TITLE', 'Enviar informaci&oacute;n sobre \'%s\' un amigo');
-
-define('FORM_TITLE_CUSTOMER_DETAILS', 'Tus Datos');
-define('FORM_TITLE_FRIEND_DETAILS', 'Los Datos De Tu Amigo');
-define('FORM_TITLE_FRIEND_MESSAGE', 'Tu Mensaje');
-
-define('FORM_FIELD_CUSTOMER_NAME', 'Tu Nombre:');
-define('FORM_FIELD_CUSTOMER_EMAIL', 'Tu Email:');
-define('FORM_FIELD_FRIEND_NAME', 'El Nombre De Tu Amigo:');
-define('FORM_FIELD_FRIEND_EMAIL', 'El Email De Tu Amigo:');
-
-define('TEXT_EMAIL_SUCCESSFUL_SENT', 'Tu email sobre <b>%s</b> ha sido enviado con &eacute;xito a <b>%s</b>.');
-
-define('TEXT_EMAIL_SUBJECT', 'Tu amigo %s te quiere recomendar "%s"');
-define('TEXT_EMAIL_INTRO', 'Hola %s!' . "\n\n" . 'Tu amigo %s, pens que estarias interesado en %s de %s.');
-define('TEXT_EMAIL_LINK', 'Para ver el producto usa el siguiente enlace:' . "\n\n" . '%s');
-define('TEXT_EMAIL_SIGNATURE', 'Atentamente,' . "\n\n" . '%s');
-
-define('ERROR_TO_NAME', 'Error: La direcci&oacute;n de su amigo no puede estar vacia.');
-define('ERROR_TO_ADDRESS', 'Error: La direcci&oacute;n de su amigo debe ser v&aacute;lida.');
-define('ERROR_FROM_NAME', 'Error: Su nombre no debe estar vacio.');
-define('ERROR_FROM_ADDRESS', 'Error: Su direcci&oacute;n de email debe de ser v&aacute;lida.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/espanol.php 2.3.1.src/includes/languages/espanol.php
--- 2.2rc2a.cp.src/includes/languages/espanol.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/espanol.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,318 +0,0 @@
-<?php
-/*
-  $Id: espanol.php 1743 2007-12-20 18:02:36Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-// look in your $PATH_LOCALE/locale directory for available locales
-// or type locale -a on the server.
-// Examples:
-// on RedHat try 'es_ES'
-// on FreeBSD try 'es_ES.ISO_8859-1'
-// on Windows try 'sp', or 'Spanish'
-@setlocale(LC_TIME, 'es_ES.ISO_8859-1');
-
-define('DATE_FORMAT_SHORT', '%d/%m/%Y');  // this is used for strftime()
-define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
-define('DATE_FORMAT', 'd/m/Y');  // this is used for date()
-define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
-
-////
-// Return date in raw format
-// $date should be in format mm/dd/yyyy
-// raw date is in format YYYYMMDD, or DDMMYYYY
-function tep_date_raw($date, $reverse = false) {
-  if ($reverse) {
-    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
-  } else {
-    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
-  }
-}
-
-// if USE_DEFAULT_LANGUAGE_CURRENCY is true, use the following currency, instead of the applications default currency (used when changing language)
-define('LANGUAGE_CURRENCY', 'EUR');
-
-// Global entries for the <html> tag
-define('HTML_PARAMS','dir="LTR" lang="es"');
-
-// charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
-
-// page title
-define('TITLE', STORE_NAME);
-
-// header text in includes/header.php
-define('HEADER_TITLE_CREATE_ACCOUNT', 'Crear Cuenta');
-define('HEADER_TITLE_MY_ACCOUNT', 'Mi Cuenta');
-define('HEADER_TITLE_CART_CONTENTS', 'Ver Cesta');
-define('HEADER_TITLE_CHECKOUT', 'Realizar Pedido');
-define('HEADER_TITLE_TOP', 'Inicio');
-define('HEADER_TITLE_CATALOG', 'Cat&aacute;logo');
-define('HEADER_TITLE_LOGOFF', 'Salir');
-define('HEADER_TITLE_LOGIN', 'Entrar');
-
-// footer text in includes/footer.php
-define('FOOTER_TEXT_REQUESTS_SINCE', 'peticiones desde');
-
-// text for gender
-define('MALE', 'Var&oacute;n');
-define('FEMALE', 'Mujer');
-define('MALE_ADDRESS', 'Sr.');
-define('FEMALE_ADDRESS', 'Sra.');
-
-// text for date of birth example
-define('DOB_FORMAT_STRING', 'dd/mm/aaaa');
-
-// categories box text in includes/boxes/categories.php
-define('BOX_HEADING_CATEGORIES', 'Categorias');
-
-// manufacturers box text in includes/boxes/manufacturers.php
-define('BOX_HEADING_MANUFACTURERS', 'Fabricantes');
-
-// whats_new box text in includes/boxes/whats_new.php
-define('BOX_HEADING_WHATS_NEW', 'Novedades');
-
-// quick_find box text in includes/boxes/quick_find.php
-define('BOX_HEADING_SEARCH', 'B&uacute;squeda R&aacute;pida');
-define('BOX_SEARCH_TEXT', 'Use palabras clave para encontrar el producto que busca.');
-define('BOX_SEARCH_ADVANCED_SEARCH', 'B&uacute;squeda Avanzada');
-
-// specials box text in includes/boxes/specials.php
-define('BOX_HEADING_SPECIALS', 'Ofertas');
-
-// reviews box text in includes/boxes/reviews.php
-define('BOX_HEADING_REVIEWS', 'Comentarios');
-define('BOX_REVIEWS_WRITE_REVIEW', 'Escriba un comentario para este producto');
-define('BOX_REVIEWS_NO_REVIEWS', 'En este momento, no hay ningun comentario');
-define('BOX_REVIEWS_TEXT_OF_5_STARS', '%s de 5 Estrellas!');
-
-// shopping_cart box text in includes/boxes/shopping_cart.php
-define('BOX_HEADING_SHOPPING_CART', 'Compras');
-define('BOX_SHOPPING_CART_EMPTY', '0 productos');
-
-// order_history box text in includes/boxes/order_history.php
-define('BOX_HEADING_CUSTOMER_ORDERS', 'Mis Pedidos');
-
-// best_sellers box text in includes/boxes/best_sellers.php
-define('BOX_HEADING_BESTSELLERS', 'Los Mas Vendidos');
-define('BOX_HEADING_BESTSELLERS_IN', 'Los Mas Vendidos en <br>&nbsp;&nbsp;');
-
-// notifications box text in includes/boxes/products_notifications.php
-define('BOX_HEADING_NOTIFICATIONS', 'Notificaciones');
-define('BOX_NOTIFICATIONS_NOTIFY', 'Notifiqueme de cambios a <b>%s</b>');
-define('BOX_NOTIFICATIONS_NOTIFY_REMOVE', 'No me notifique de cambios a <b>%s</b>');
-
-// manufacturer box text
-define('BOX_HEADING_MANUFACTURER_INFO', 'Fabricante');
-define('BOX_MANUFACTURER_INFO_HOMEPAGE', 'P&aacute;gina de %s');
-define('BOX_MANUFACTURER_INFO_OTHER_PRODUCTS', 'Otros productos');
-
-// languages box text in includes/boxes/languages.php
-define('BOX_HEADING_LANGUAGES', 'Idiomas');
-
-// currencies box text in includes/boxes/currencies.php
-define('BOX_HEADING_CURRENCIES', 'Monedas');
-
-// information box text in includes/boxes/information.php
-define('BOX_HEADING_INFORMATION', 'Informaci&oacute;n');
-define('BOX_INFORMATION_PRIVACY', 'Confidencialidad');
-define('BOX_INFORMATION_CONDITIONS', 'Condiciones de uso');
-define('BOX_INFORMATION_SHIPPING', 'Envios/Devoluciones');
-define('BOX_INFORMATION_CONTACT', 'Contactenos');
-
-// tell a friend box text in includes/boxes/tell_a_friend.php
-define('BOX_HEADING_TELL_A_FRIEND', 'D&iacute;selo a un Amigo');
-define('BOX_TELL_A_FRIEND_TEXT', 'Env&iacute;a esta pagina a un amigo con un comentario.');
-
-// checkout procedure text
-define('CHECKOUT_BAR_DELIVERY', 'entrega');
-define('CHECKOUT_BAR_PAYMENT', 'pago');
-define('CHECKOUT_BAR_CONFIRMATION', 'confirmaci&oacute;n');
-define('CHECKOUT_BAR_FINISHED', 'finalizado!');
-
-// pull down default text
-define('PULL_DOWN_DEFAULT', 'Seleccione');
-define('TYPE_BELOW', 'Escriba Debajo');
-
-// javascript messages
-define('JS_ERROR', 'Hay errores en su formulario!\nPor favor, haga las siguientes correciones:\n\n');
-
-define('JS_REVIEW_TEXT', '* Su \'Comentario\' debe tener al menos ' . REVIEW_TEXT_MIN_LENGTH . ' letras.\n');
-define('JS_REVIEW_RATING', '* Debe evaluar el producto sobre el que opina.\n');
-
-define('JS_ERROR_NO_PAYMENT_MODULE_SELECTED', '* Por favor seleccione un m&eacute;todo de pago para su pedido.\n');
-
-define('JS_ERROR_SUBMITTED', 'Ya ha enviado el formulario. Pulse Aceptar y espere a que termine el proceso.');
-
-define('ERROR_NO_PAYMENT_MODULE_SELECTED', 'Por favor seleccione un m&eacute;todo de pago para su pedido.');
-
-define('CATEGORY_COMPANY', 'Empresa');
-define('CATEGORY_PERSONAL', 'Personal');
-define('CATEGORY_ADDRESS', 'Direcci&oacute;n');
-define('CATEGORY_CONTACT', 'Contacto');
-define('CATEGORY_OPTIONS', 'Opciones');
-define('CATEGORY_PASSWORD', 'Contrase&ntilde;a');
-
-define('ENTRY_COMPANY', 'Empresa:');
-define('ENTRY_COMPANY_ERROR', '');
-define('ENTRY_COMPANY_TEXT', '');
-define('ENTRY_GENDER', 'Sexo:');
-define('ENTRY_GENDER_ERROR', 'Por favor seleccione una opci&oacute;n.');
-define('ENTRY_GENDER_TEXT', '*');
-define('ENTRY_FIRST_NAME', 'Nombre:');
-define('ENTRY_FIRST_NAME_ERROR', 'Su Nombre debe tener al menos ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' letras.');
-define('ENTRY_FIRST_NAME_TEXT', '*');
-define('ENTRY_LAST_NAME', 'Apellidos:');
-define('ENTRY_LAST_NAME_ERROR', 'Sus apellidos deben tener al menos ' . ENTRY_LAST_NAME_MIN_LENGTH . ' letras.');
-define('ENTRY_LAST_NAME_TEXT', '*');
-define('ENTRY_DATE_OF_BIRTH', 'Fecha de Nacimiento:');
-define('ENTRY_DATE_OF_BIRTH_ERROR', 'Su fecha de nacimiento debe tener este formato: DD/MM/AAAA (p.ej. 21/05/1970)');
-define('ENTRY_DATE_OF_BIRTH_TEXT', '* (p.ej. 21/05/1970)');
-define('ENTRY_EMAIL_ADDRESS', 'E-Mail:');
-define('ENTRY_EMAIL_ADDRESS_ERROR', 'Su direcci&oacute;n de E-Mail debe tener al menos ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' letras.');
-define('ENTRY_EMAIL_ADDRESS_CHECK_ERROR', 'Su direcci&oacute;n de E-Mail no parece v&aacute;lida - por favor haga los cambios necesarios.');
-define('ENTRY_EMAIL_ADDRESS_ERROR_EXISTS', 'Su direcci&oacute;n de E-Mail ya figura entre nuestros clientes - puede entrar a su cuenta con esta direcci&oacute;n o crear una cuenta nueva con una direcci&oacute;n diferente.');
-define('ENTRY_EMAIL_ADDRESS_TEXT', '*');
-define('ENTRY_STREET_ADDRESS', 'Direcci&oacute;n:');
-define('ENTRY_STREET_ADDRESS_ERROR', 'Su direcci&oacute;n debe tener al menos ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' letras.');
-define('ENTRY_STREET_ADDRESS_TEXT', '*');
-define('ENTRY_SUBURB', 'Suburbio');
-define('ENTRY_SUBURB_ERROR', '');
-define('ENTRY_SUBURB_TEXT', '');
-define('ENTRY_POST_CODE', 'C&oacute;digo Postal:');
-define('ENTRY_POST_CODE_ERROR', 'Su c&oacute;digo postal debe tener al menos ' . ENTRY_POSTCODE_MIN_LENGTH . ' letras.');
-define('ENTRY_POST_CODE_TEXT', '*');
-define('ENTRY_CITY', 'Poblacion:');
-define('ENTRY_CITY_ERROR', 'Su poblaci&oacute;n debe tener al menos ' . ENTRY_CITY_MIN_LENGTH . ' letras.');
-define('ENTRY_CITY_TEXT', '*');
-define('ENTRY_STATE', 'Provincia/Estado:');
-define('ENTRY_STATE_ERROR', 'Su provincia/estado debe tener al menos ' . ENTRY_STATE_MIN_LENGTH . ' letras.');
-define('ENTRY_STATE_ERROR_SELECT', 'Por favor seleccione de la lista desplegable.');
-define('ENTRY_STATE_TEXT', '*');
-define('ENTRY_COUNTRY', 'Pa&iacute;s:');
-define('ENTRY_COUNTRY_ERROR', 'Debe seleccionar un pa&iacute;s de la lista desplegable.');
-define('ENTRY_COUNTRY_TEXT', '*');
-define('ENTRY_TELEPHONE_NUMBER', 'Tel&eacute;fono:');
-define('ENTRY_TELEPHONE_NUMBER_ERROR', 'Su n&uacute;mero de tel&eacute;fono debe tener al menos ' . ENTRY_TELEPHONE_MIN_LENGTH . ' letras.');
-define('ENTRY_TELEPHONE_NUMBER_TEXT', '*');
-define('ENTRY_FAX_NUMBER', 'Fax:');
-define('ENTRY_FAX_NUMBER_ERROR', '');
-define('ENTRY_FAX_NUMBER_TEXT', '');
-define('ENTRY_NEWSLETTER', 'Bolet&iacute;n de noticias:');
-define('ENTRY_NEWSLETTER_TEXT', '');
-define('ENTRY_NEWSLETTER_YES', 'suscribirse');
-define('ENTRY_NEWSLETTER_NO', 'no suscribirse');
-define('ENTRY_NEWSLETTER_ERROR', '');
-define('ENTRY_PASSWORD', 'Contrase&ntilde;a:');
-define('ENTRY_PASSWORD_ERROR', 'Su contrase&ntilde;a debe tener al menos ' . ENTRY_PASSWORD_MIN_LENGTH . ' letras.');
-define('ENTRY_PASSWORD_ERROR_NOT_MATCHING', 'La confirmaci&oacute;n de la contrase&ntilde;a debe ser igual a la contrase&ntilde;a.');
-define('ENTRY_PASSWORD_TEXT', '*');
-define('ENTRY_PASSWORD_CONFIRMATION', 'Confirme Contrase&ntilde;a:');
-define('ENTRY_PASSWORD_CONFIRMATION_TEXT', '*');
-define('ENTRY_PASSWORD_CURRENT', 'Contrase&ntilde;a Actual:');
-define('ENTRY_PASSWORD_CURRENT_TEXT', '*');
-define('ENTRY_PASSWORD_CURRENT_ERROR', 'Su contrase&ntilde;a debe tener al menos ' . ENTRY_PASSWORD_MIN_LENGTH . ' letras.');
-define('ENTRY_PASSWORD_NEW', 'Nueva Contrase&ntilde;a:');
-define('ENTRY_PASSWORD_NEW_TEXT', '*');
-define('ENTRY_PASSWORD_NEW_ERROR', 'Su contrase&ntilde;a nueva debe tener al menos ' . ENTRY_PASSWORD_MIN_LENGTH . ' letras.');
-define('ENTRY_PASSWORD_NEW_ERROR_NOT_MATCHING', 'La confirmaci&oacute;n de su contrase&ntilde;a debe coincidir con su contrase&ntilde;a nueva.');
-define('PASSWORD_HIDDEN', '--OCULTO--');
-
-define('FORM_REQUIRED_INFORMATION', '* Dato Obligatorio');
-
-// constants for use in tep_prev_next_display function
-define('TEXT_RESULT_PAGE', 'P&aacute;ginas de Resultados:');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> productos)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> pedidos)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> comentarios)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW', 'Viendo del <b>%d</b> al <b>%d</b> (de <b>%d</b> productos nuevos)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'Viendo del<b>%d</b> al <b>%d</b> (de <b>%d</b> ofertas)');
-
-define('PREVNEXT_TITLE_FIRST_PAGE', 'Principio');
-define('PREVNEXT_TITLE_PREVIOUS_PAGE', 'Anterior');
-define('PREVNEXT_TITLE_NEXT_PAGE', 'Siguiente');
-define('PREVNEXT_TITLE_LAST_PAGE', 'Final');
-define('PREVNEXT_TITLE_PAGE_NO', 'P&aacute;gina %d');
-define('PREVNEXT_TITLE_PREV_SET_OF_NO_PAGE', 'Anteriores %d P&aacute;ginas');
-define('PREVNEXT_TITLE_NEXT_SET_OF_NO_PAGE', 'Siguientes %d P&aacute;ginas');
-define('PREVNEXT_BUTTON_FIRST', '&lt;&lt;PRINCIPIO');
-define('PREVNEXT_BUTTON_PREV', '[&lt;&lt;&nbsp;Anterior]');
-define('PREVNEXT_BUTTON_NEXT', '[Siguiente&nbsp;&gt;&gt;]');
-define('PREVNEXT_BUTTON_LAST', 'FINAL&gt;&gt;');
-
-define('IMAGE_BUTTON_ADD_ADDRESS', 'A&ntilde;adir Direcci&oacute;n');
-define('IMAGE_BUTTON_ADDRESS_BOOK', 'Direcciones');
-define('IMAGE_BUTTON_BACK', 'Volver');
-define('IMAGE_BUTTON_BUY_NOW', 'Compre Ahora');
-define('IMAGE_BUTTON_CHANGE_ADDRESS', 'Cambiar Direcci&oacute;n');
-define('IMAGE_BUTTON_CHECKOUT', 'Realizar Pedido');
-define('IMAGE_BUTTON_CONFIRM_ORDER', 'Confirmar Pedido');
-define('IMAGE_BUTTON_CONTINUE', 'Continuar');
-define('IMAGE_BUTTON_CONTINUE_SHOPPING', 'Seguir Comprando');
-define('IMAGE_BUTTON_DELETE', 'Eliminar');
-define('IMAGE_BUTTON_EDIT_ACCOUNT', 'Editar Cuenta');
-define('IMAGE_BUTTON_HISTORY', 'Historial de Pedidos');
-define('IMAGE_BUTTON_LOGIN', 'Entrar');
-define('IMAGE_BUTTON_IN_CART', 'A&ntilde;adir a la Cesta');
-define('IMAGE_BUTTON_NOTIFICATIONS', 'Notificaciones');
-define('IMAGE_BUTTON_QUICK_FIND', 'B&uacute;squeda R&aacute;pida');
-define('IMAGE_BUTTON_REMOVE_NOTIFICATIONS', 'Eliminar Notificaciones');
-define('IMAGE_BUTTON_REVIEWS', 'Comentarios');
-define('IMAGE_BUTTON_SEARCH', 'Buscar');
-define('IMAGE_BUTTON_SHIPPING_OPTIONS', 'Opciones de Env&iacute;o');
-define('IMAGE_BUTTON_TELL_A_FRIEND', 'D&iacute;selo a un Amigo');
-define('IMAGE_BUTTON_UPDATE', 'Actualizar');
-define('IMAGE_BUTTON_UPDATE_CART', 'Actualizar Cesta');
-define('IMAGE_BUTTON_WRITE_REVIEW', 'Escribir Comentario');
-
-define('SMALL_IMAGE_BUTTON_DELETE', 'Eliminar');
-define('SMALL_IMAGE_BUTTON_EDIT', 'Modificar');
-define('SMALL_IMAGE_BUTTON_VIEW', 'Ver');
-
-define('ICON_ARROW_RIGHT', 'm&aacute;s');
-define('ICON_CART', 'En Cesta');
-define('ICON_ERROR', 'Error');
-define('ICON_SUCCESS', 'Correcto');
-define('ICON_WARNING', 'Advertencia');
-
-define('TEXT_GREETING_PERSONAL', 'Bienvenido de nuevo <span class="greetUser">%s!</span> &iquest;Le gustaria ver que <a href="%s"><u>nuevos productos</u></a> hay disponibles?');
-define('TEXT_GREETING_PERSONAL_RELOGON', '<small>Si no es %s, por favor <a href="%s"><u>entre aqui</u></a> e introduzca sus datos.</small>');
-define('TEXT_GREETING_GUEST', 'Bienvenido <span class="greetUser">Invitado!</span> &iquest;Le gustaria <a href="%s"><u>entrar en su cuenta</u></a> o preferiria <a href="%s"><u>crear una cuenta nueva</u></a>?');
-
-define('TEXT_SORT_PRODUCTS', 'Ordenar Productos ');
-define('TEXT_DESCENDINGLY', 'Descendentemente');
-define('TEXT_ASCENDINGLY', 'Ascendentemente');
-define('TEXT_BY', ' por ');
-
-define('TEXT_REVIEW_BY', 'por %s');
-define('TEXT_REVIEW_WORD_COUNT', '%s palabras');
-define('TEXT_REVIEW_RATING', 'Evaluaci&oacute;n: %s [%s]');
-define('TEXT_REVIEW_DATE_ADDED', 'Fecha Alta: %s');
-define('TEXT_NO_REVIEWS', 'En este momento, no hay ningun comentario.');
-
-define('TEXT_NO_NEW_PRODUCTS', 'Ahora mismo no hay novedades.');
-
-define('TEXT_UNKNOWN_TAX_RATE', 'Impuesto desconocido');
-
-define('TEXT_REQUIRED', '<span class="errorText">Obligatorio</span>');
-
-define('ERROR_TEP_MAIL', '<font face="Verdana, Arial" size="2" color="#ff0000"><b><small>TEP ERROR:</small> No he podido enviar el email con el servidor SMTP especificado. Configura tu servidor SMTP en la secci&oacute;n adecuada del fichero php.ini.</b></font>');
-define('WARNING_INSTALL_DIRECTORY_EXISTS', 'Advertencia: El directorio de instalaci&oacute;n existe en: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/install. Por razones de seguridad, elimine este directorio completamente.');
-define('WARNING_CONFIG_FILE_WRITEABLE', 'Advertencia: Puedo escribir en el fichero de configuraci&oacute;n: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/includes/configure.php. En determinadas circunstancias esto puede suponer un riesgo - por favor corriga los permisos de este fichero.');
-define('WARNING_SESSION_DIRECTORY_NON_EXISTENT', 'Advertencia: El directorio para guardar datos de sesi&oacute;n no existe: ' . tep_session_save_path() . '. Las sesiones no funcionar&aacute;n hasta que no se corriga este error.');
-define('WARNING_SESSION_DIRECTORY_NOT_WRITEABLE', 'Avertencia: No puedo escribir en el directorio para datos de sesi&oacute;n: ' . tep_session_save_path() . '. Las sesiones no funcionar&aacute;n hasta que no se corriga este error.');
-define('WARNING_SESSION_AUTO_START', 'Advertencia: session.auto_start esta activado - desactive esta caracteristica en el fichero php.ini and reinicie el servidor web.');
-define('WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT', 'Advertencia: El directorio para productos descargables no existe: ' . DIR_FS_DOWNLOAD . '. Los productos descargables no funcionar&aacute;n hasta que no se corriga este error.');
-
-define('TEXT_CCVAL_ERROR_INVALID_DATE', 'La fecha de caducidad de la tarjeta de cr&eacute;dito es incorrecta. Compruebe la fecha e int&eacute;ntelo de nuevo.');
-define('TEXT_CCVAL_ERROR_INVALID_NUMBER', 'El n&uacute;mero de la tarjeta de cr&eacute;dito es incorrecto. Compruebe el numero e int&eacute;ntelo de nuevo.');
-define('TEXT_CCVAL_ERROR_UNKNOWN_CARD', 'Los primeros cuatro digitos de su tarjeta son: %s. Si este n&uacute;mero es correcto, no aceptamos este tipo de tarjetas. Si es incorrecto, int&eacute;ntelo de nuevo.');
-
-define('FOOTER_TEXT_BODY', 'Copyright &copy; ' . date('Y') . ' <a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . STORE_NAME . '</a><br>Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_edit.php 2.3.1.src/includes/languages/german/account_edit.php
--- 2.2rc2a.cp.src/includes/languages/german/account_edit.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_edit.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: account_edit.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Ihre pers&ouml;nliche Daten &auml;ndern');
-
-define('HEADING_TITLE', 'Ihre pers&ouml;nliche Daten &auml;ndern');
-
-define('MY_ACCOUNT_TITLE', 'Ihr Konto');
-
-define('SUCCESS_ACCOUNT_UPDATED', 'Ihre Daten wurden erfolgreich aktualisiert!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_history_info.php 2.3.1.src/includes/languages/german/account_history_info.php
--- 2.2rc2a.cp.src/includes/languages/german/account_history_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_history_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-<?php
-/*
-  $Id: account_history_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Get&auml;tigte Bestellung');
-define('NAVBAR_TITLE_3', 'Bestellnummer %s');
-
-define('HEADING_TITLE', 'Bestellinformationen');
-
-define('HEADING_ORDER_NUMBER', 'Bestellnummer %s');
-define('HEADING_ORDER_DATE', 'Bestelldatum:');
-define('HEADING_ORDER_TOTAL', 'Summe:');
-
-define('HEADING_DELIVERY_ADDRESS', 'Lieferanschrift');
-define('HEADING_SHIPPING_METHOD', 'Versandart');
-
-define('HEADING_PRODUCTS', 'Produkte');
-define('HEADING_TAX', 'MwSt.');
-define('HEADING_TOTAL', 'Summe');
-
-define('HEADING_BILLING_INFORMATION', 'Rechnungsinformationen');
-define('HEADING_BILLING_ADDRESS', 'Rechnungsadresse');
-define('HEADING_PAYMENT_METHOD', 'Zahlungsweise');
-
-define('HEADING_ORDER_HISTORY', 'Bestellhistorie');
-define('HEADING_COMMENT', 'Kommentar');
-define('TEXT_NO_COMMENTS_AVAILABLE', 'Kein Kommentar vorhanden.');
-
-define('TABLE_HEADING_DOWNLOAD_DATE', 'Herunterladen m&ouml;glich bis:');
-define('TABLE_HEADING_DOWNLOAD_COUNT', 'max. Anz. Downloads');
-define('HEADING_DOWNLOAD', 'Artikel herunterladen:');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_history.php 2.3.1.src/includes/languages/german/account_history.php
--- 2.2rc2a.cp.src/includes/languages/german/account_history.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_history.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: account_history.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Ihre get&auml;tigten Bestellungen');
-
-define('HEADING_TITLE', 'Ihre get&auml;tigten Bestellungen');
-
-define('TEXT_ORDER_NUMBER', 'Bestellnummer:');
-define('TEXT_ORDER_STATUS', 'Bestellstatus:');
-define('TEXT_ORDER_DATE', 'Bestelldatum:');
-define('TEXT_ORDER_SHIPPED_TO', 'Lieferanschrift:');
-define('TEXT_ORDER_BILLED_TO', 'Rechnungsanschrift:');
-define('TEXT_ORDER_PRODUCTS', 'Artikel:');
-define('TEXT_ORDER_COST', 'Summe:');
-define('TEXT_VIEW_ORDER', 'Bestellung ansehen');
-
-define('TEXT_NO_PURCHASES', 'Sie haben noch keine Bestellungen get&auml;tigt.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_newsletters.php 2.3.1.src/includes/languages/german/account_newsletters.php
--- 2.2rc2a.cp.src/includes/languages/german/account_newsletters.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_newsletters.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-<?php
-/*
-  $Id: account_newsletters.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Newsletter Abonnements');
-
-define('HEADING_TITLE', 'Newsletter Abonnements');
-
-define('MY_NEWSLETTERS_TITLE', 'Meine Newsletter Abonnements');
-define('MY_NEWSLETTERS_GENERAL_NEWSLETTER', 'Allgmeiner Newsletter');
-define('MY_NEWSLETTERS_GENERAL_NEWSLETTER_DESCRIPTION', 'Beinhaltet allgemeine Nachrichten &uuml;nseren Shop, Informationen &uuml;ber neue Produkte, Sonderangebote und andere Informationen von allgemeinem Interesse.');
-
-define('SUCCESS_NEWSLETTER_UPDATED', 'Ihre Newsletter Abonnements wurden erfolgreich aktualisiert!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_notifications.php 2.3.1.src/includes/languages/german/account_notifications.php
--- 2.2rc2a.cp.src/includes/languages/german/account_notifications.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_notifications.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,29 +0,0 @@
-<?php
-/*
-  $Id: account_notifications.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Produktbenachrichtungen');
-
-define('HEADING_TITLE', 'Produktbenachrichtigungen');
-
-define('MY_NOTIFICATIONS_TITLE', 'Meine Produktbenachrichtigungen');
-define('MY_NOTIFICATIONS_DESCRIPTION', 'Diese Benachrichtigungen erlabuben es Ihnen, &uuml;ber alle &Auml;nderungen an einem Produkt informiert zu werden.<br><br>Wenn Sie Benachrichtigungen f&uuml; unser komplettes Angebot erhalten wollen, sollte Sie die allgemeinen Benachrichtigungen aktivieren.');
-
-define('GLOBAL_NOTIFICATIONS_TITLE', 'Allgemeine Benachrichtungen');
-define('GLOBAL_NOTIFICATIONS_DESCRIPTION', '&Uuml;ber alle &Auml;nderungen informiert werden.');
-
-define('NOTIFICATIONS_TITLE', 'Produktspezifische Benachrichtungen.');
-define('NOTIFICATIONS_DESCRIPTION', 'Um eine aktivierte Benachrichtigung zu entfernen, einfach die Checkbox deaktivieren und auf den <b>Weiter<b>-Button klicken.');
-define('NOTIFICATIONS_NON_EXISTING', 'Sie haben momentan keine Prouktbenachrichtigungen aktiviert.<br><br>Wenn Sie Produktbenachrichtigungen aktivieren wollen, k&ouml;nnen Sie dies direkt auf der Produktseite aktivieren.');
-
-define('SUCCESS_NOTIFICATIONS_UPDATED', 'Ihre Produktbenachrichtigungen wurden erfolgreich aktualisiert!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account_password.php 2.3.1.src/includes/languages/german/account_password.php
--- 2.2rc2a.cp.src/includes/languages/german/account_password.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account_password.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: account_password.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Passwort &auml;ndern');
-
-define('HEADING_TITLE', 'Mein Passwort');
-
-define('MY_PASSWORD_TITLE', 'Mein Passwort');
-
-define('SUCCESS_PASSWORD_UPDATED', 'Ihr Passwort wurde erfolgreich ge&auml;ndert!');
-define('ERROR_CURRENT_PASSWORD_NOT_MATCHING', 'Das eingegebene Passwort stimmt nicht mit dem gespeichertem Passwort &uuml;berein. Bitte probieren Sie es noch einmal.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/account.php 2.3.1.src/includes/languages/german/account.php
--- 2.2rc2a.cp.src/includes/languages/german/account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/account.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: account.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Ihr Konto');
-define('HEADING_TITLE', 'Ihre pers&ouml;nlichen Daten');
-
-define('OVERVIEW_TITLE', '&Uuml;bersicht');
-define('OVERVIEW_SHOW_ALL_ORDERS', '(alle Bestellungen anzeigen)');
-define('OVERVIEW_PREVIOUS_ORDERS', 'Bisherige Bestellungen');
-
-define('MY_ACCOUNT_TITLE', 'Ihr Konto');
-define('MY_ACCOUNT_INFORMATION', 'Meine Kontoinformationen anzeigen oder &auml;ndern');
-define('MY_ACCOUNT_ADDRESS_BOOK', 'Adressbucheintr&auml;ge anzeigen oder &auml;ndern');
-define('MY_ACCOUNT_PASSWORD', 'Mein Passwort &auml;ndern');
-
-define('MY_ORDERS_TITLE', 'Meine Bestellungen');
-define('MY_ORDERS_VIEW', 'Meine bisherigen Bestellungen anzeigen');
-
-define('EMAIL_NOTIFICATIONS_TITLE', 'E-Mail Benachrichtigungen');
-define('EMAIL_NOTIFICATIONS_NEWSLETTERS', 'Newsletter abonnieren oder abbestellen.');
-define('EMAIL_NOTIFICATIONS_PRODUCTS', 'Meine Produktbenachrichtigungen anzeigen oder &auml;ndern.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/address_book.php 2.3.1.src/includes/languages/german/address_book.php
--- 2.2rc2a.cp.src/includes/languages/german/address_book.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/address_book.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: address_book.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Adressbuch');
-
-define('HEADING_TITLE', 'Mein Pers&ouml;nliches Adressbuch');
-
-define('PRIMARY_ADDRESS_TITLE', 'Standardadresse');
-define('PRIMARY_ADDRESS_DESCRIPTION', 'Diese Adresse wird automatisch als Liefer- und Rechnungsadresse gew&auml;hlt wenn Sie eine Bestellung aufgeben.<br><br>Diese Adresse wird auch als Basis f&uuml;r die Berechnung eventueller Steuern udn Versandkosten verwendet.');
-
-define('ADDRESS_BOOK_TITLE', 'Adressbucheintr&auml;ge');
-
-define('PRIMARY_ADDRESS', '(Standardadresse)');
-
-define('TEXT_MAXIMUM_ENTRIES', '<font color="#ff0000"><b>Hinweis:</b></font> Ihnen stehen %s Adressbucheintr&auml;ge zur Verf&uuml;gung!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/address_book_process.php 2.3.1.src/includes/languages/german/address_book_process.php
--- 2.2rc2a.cp.src/includes/languages/german/address_book_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/address_book_process.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-<?php
-/*
-  $Id: address_book_process.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Ihr Konto');
-define('NAVBAR_TITLE_2', 'Adressbuch');
-
-define('NAVBAR_TITLE_ADD_ENTRY', 'Neuer Eintrag');
-define('NAVBAR_TITLE_MODIFY_ENTRY', 'Eintrag &auml;ndern');
-define('NAVBAR_TITLE_DELETE_ENTRY', 'Delete Entry');
-
-define('HEADING_TITLE_ADD_ENTRY', 'Adressbuch: Neuer Eintrag');
-define('HEADING_TITLE_MODIFY_ENTRY', 'Adressbuch: Eintrag &auml;ndern');
-define('HEADING_TITLE_DELETE_ENTRY', 'Adressbuch: Eintrag l&ouml;schen');
-
-define('DELETE_ADDRESS_TITLE', 'Eintrag l&ouml;schen');
-define('DELETE_ADDRESS_DESCRIPTION', 'Wollen Sie diese Adresse unwiderruflich aus Ihrem Adressbuch entfernen?');
-
-define('NEW_ADDRESS_TITLE', 'Adressbuch: Neuer Eintrag');
-
-define('SELECTED_ADDRESS', 'Standardadresse');
-define('SET_AS_PRIMARY', 'Als Standardadresse gesetzt.');
-
-define('SUCCESS_ADDRESS_BOOK_ENTRY_DELETED', 'Der ausgew&auml;hlte Eintrag wurde erflogreich gel&ouml;scht.');
-define('SUCCESS_ADDRESS_BOOK_ENTRY_UPDATED', 'Ihr Adressbuch wurde erfolgreich aktualisiert!');
-
-define('WARNING_PRIMARY_ADDRESS_DELETION', 'Die Standardadresse kann nicht gel&ouml;scht werden. Bitte erst eine andere Standardadresse w&auml;hlen. Danach kann der Eintrag gel&ouml;scht werden.');
-
-define('ERROR_NONEXISTING_ADDRESS_BOOK_ENTRY', 'Dieser Adressbucheintrag ist nicht vorhanden.');
-define('ERROR_ADDRESS_BOOK_FULL', 'Ihr Adressbuch kann keine weiteren Adressen aufnehmen. Bitte l&ouml;schen Sie eine nicht mehr ben&ouml;tigte Adresse. Danach k&ouml;nnen Sie einen neuen Eintrag speichern.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/advanced_search.php 2.3.1.src/includes/languages/german/advanced_search.php
--- 2.2rc2a.cp.src/includes/languages/german/advanced_search.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/advanced_search.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,58 +0,0 @@
-<?php
-/*
-  $Id: advanced_search.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Erweiterte Suche');
-define('NAVBAR_TITLE_2', 'Suchergebnisse');
-
-define('HEADING_TITLE_1', 'Geben Sie Ihre Suchkriterien ein');
-define('HEADING_TITLE_2', 'Artikel, welche den Suchkriterien entsprechen');
-
-define('HEADING_SEARCH_CRITERIA', 'Geben Sie Ihre Stichworte ein');
-
-define('TEXT_SEARCH_IN_DESCRIPTION', 'Auch in den Beschreibungen suchen');
-define('ENTRY_CATEGORIES', 'Kategorien:');
-define('ENTRY_INCLUDE_SUBCATEGORIES', 'Unterkategorien mit einbeziehen');
-define('ENTRY_MANUFACTURERS', 'Hersteller:');
-define('ENTRY_PRICE_FROM', 'Preis ab:');
-define('ENTRY_PRICE_TO', 'Preis bis:');
-define('ENTRY_DATE_FROM', 'hinzugef&uuml;gt von:');
-define('ENTRY_DATE_TO', 'hinzugef&uuml;gt bis:');
-
-define('TEXT_SEARCH_HELP_LINK', '<u>Hilfe zur erweiterten Suche</u> [?]');
-
-define('TEXT_ALL_CATEGORIES', 'Alle Kategorien');
-define('TEXT_ALL_MANUFACTURERS', 'Alle Hersteller');
-
-define('HEADING_SEARCH_HELP', 'Hilfe zur erweiterten Suche');
-define('TEXT_SEARCH_HELP', 'Die Suchfunktion erm&ouml;glicht Ihnen die Suche in den Produktnamen, Produktbeschreibungen, Herstellern und Artikelnummern.<br><br>Sie haben die M&ouml;glichkeit logische Operatoren wie "AND" (Und) und "OR" (oder) zu verwenden.<br><br>Als Beispiel k&ouml;nnten Sie also angeben: <u>Microsoft AND Maus</u>.<br><br>Desweiteren k&ouml;nnen Sie Klammern verwenden um die Suche zu verschachteln, also z.B.:<br><br><u>Microsoft AND (Maus OR Tastatur OR "Visual Basic")</u>.<br><br>Mit Anf&uuml;hrungszeichen k&ouml;nnen Sie mehrere Worte zu einem Suchbegriff zusammenfassen.');
-define('TEXT_CLOSE_WINDOW', '<u>Fenster schliessen</u> [x]');
-
-define('TABLE_HEADING_IMAGE', '');
-define('TABLE_HEADING_MODEL', 'Artikelnummer');
-define('TABLE_HEADING_PRODUCTS', 'Bezeichnung');
-define('TABLE_HEADING_MANUFACTURER', 'Hersteller');
-define('TABLE_HEADING_QUANTITY', 'Anzahl');
-define('TABLE_HEADING_PRICE', 'Einzelpreis');
-define('TABLE_HEADING_WEIGHT', 'Gewicht');
-define('TABLE_HEADING_BUY_NOW', 'jetzt bestellen');
-
-define('TEXT_NO_PRODUCTS', 'Es wurden keine Artikel gefunden, die den Suchkriterien entsprechen.');
-
-define('ERROR_AT_LEAST_ONE_INPUT', 'Wenigstens ein Feld des Suchformulars muss ausgefllt werden.');
-define('ERROR_INVALID_FROM_DATE', 'Unzul&auml;ssiges <b>von</b> Datum');
-define('ERROR_INVALID_TO_DATE', 'Unzul&auml;ssiges <b>bis jetzt</b> Datum');
-define('ERROR_TO_DATE_LESS_THAN_FROM_DATE', 'Das Datum <b>von</b> muss gr&ouml;sser oder gleich dem <b>bis jetzt</b> Datum sein');
-define('ERROR_PRICE_FROM_MUST_BE_NUM', '<b>Preis ab</b> muss eine Zahl sein');
-define('ERROR_PRICE_TO_MUST_BE_NUM', '<b>Preis bis</b> muss eine Zahl sein');
-define('ERROR_PRICE_TO_LESS_THAN_PRICE_FROM', '<b>Preis bis</b> muss gr&ouml;&szlig;er oder gleich <b>Preis ab</b> sein.');
-define('ERROR_INVALID_KEYWORDS', 'Suchbegriff unzul&aum&auml;ssig');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_confirmation.php 2.3.1.src/includes/languages/german/checkout_confirmation.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_confirmation.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_confirmation.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-/*
-  $Id: checkout_confirmation.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Best&auml;tigung');
-
-define('HEADING_TITLE', 'Bestellung aufgeben:');
-
-define('HEADING_DELIVERY_ADDRESS', 'Versandadresse');
-define('HEADING_SHIPPING_METHOD', 'Versandart');
-define('HEADING_PRODUCTS', 'Produkte');
-define('HEADING_TAX', 'MwSt.');
-define('HEADING_TOTAL', 'Summe');
-define('HEADING_BILLING_INFORMATION', 'Rechnungsinformationen');
-define('HEADING_BILLING_ADDRESS', 'Rechnungsadresse');
-define('HEADING_PAYMENT_METHOD', 'Zahlungsweise');
-define('HEADING_PAYMENT_INFORMATION', 'Zahlungsinformationen');
-define('HEADING_ORDER_COMMENTS', 'Anmerkung zu Ihrer Bestellung');
-
-define('TEXT_EDIT', 'Bearbeiten');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_payment_address.php 2.3.1.src/includes/languages/german/checkout_payment_address.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_payment_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_payment_address.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_payment_address.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Rechnungsadresse &auml;ndern');
-
-define('HEADING_TITLE', 'Informationen zur Rechnungsadresse');
-
-define('TABLE_HEADING_PAYMENT_ADDRESS', 'Rechnungsadresse');
-define('TEXT_SELECTED_PAYMENT_DESTINATION', 'Dies ist die aktuell ausgew&auml;hlte Rechnungsadresse, auf die die Rechnung ausgestellt wird.');
-define('TITLE_PAYMENT_ADDRESS', 'Rechnungsadresse:');
-
-define('TABLE_HEADING_ADDRESS_BOOK_ENTRIES', 'Adressbucheintr&auml;ge');
-define('TEXT_SELECT_OTHER_PAYMENT_DESTINATION', 'Bitte w&auml;hlen Sie die gew&uuml;nschte Rechnungsadresse, auf die wir die Rechnung ausstellen sollen.');
-define('TITLE_PLEASE_SELECT', 'Bitte w&auml;hlen Sie');
-
-define('TABLE_HEADING_NEW_PAYMENT_ADDRESS', 'Neue Rechnungsadresse');
-define('TEXT_CREATE_NEW_PAYMENT_ADDRESS', 'Bitte nutzen Sie dieses Formular, um eine neue Rechnungsadresse f&uuml;r Ihre Bestellung zu erfassen.');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Fortsetzung des Bestellvorganges');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'zur Auswahl der gew&uuml;nschten Zahlungsweise.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_payment.php 2.3.1.src/includes/languages/german/checkout_payment.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_payment.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_payment.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_payment.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Zahlungsweise');
-
-define('HEADING_TITLE', 'Zahlungsweise');
-
-define('TABLE_HEADING_BILLING_ADDRESS', 'Rechnungsadresse');
-define('TEXT_SELECTED_BILLING_DESTINATION', 'Bitte w&auml;hlen Sie aus Ihrem Adressbuch die gew&uuml;nschte Rechnungsadresse f&uuml;r Ihre Bestellung aus.');
-define('TITLE_BILLING_ADDRESS', 'Rechnungsadresse:');
-
-define('TABLE_HEADING_PAYMENT_METHOD', 'Zahlungsweise');
-define('TEXT_SELECT_PAYMENT_METHOD', 'Bitte w&auml;hlen Sie die gew&uuml;nschte Zahlungsweise f&uuml;r Ihre Bestellung aus.');
-define('TITLE_PLEASE_SELECT', 'Bitte w&auml;hlen Sie');
-define('TEXT_ENTER_PAYMENT_INFORMATION', 'Zur Zeit bieten wir Ihnen nur eine Zahlungsweise an.');
-
-define('TABLE_HEADING_COMMENTS', 'F&uuml;gen Sie hier Ihre Anmerkungen zu dieser Bestellung ein');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Fortsetzung des Bestellvorganges');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'zur Best&auml;tigung Ihrer Bestellung.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_process.php 2.3.1.src/includes/languages/german/checkout_process.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_process.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_process.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: checkout_process.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('EMAIL_TEXT_SUBJECT', 'Bestellung');
-define('EMAIL_TEXT_ORDER_NUMBER', 'Bestellnummer:');
-define('EMAIL_TEXT_INVOICE_URL', 'Detailierte Bestell&uuml;bersicht:');
-define('EMAIL_TEXT_DATE_ORDERED', 'Bestelldatum:');
-define('EMAIL_TEXT_PRODUCTS', 'Artikel');
-define('EMAIL_TEXT_SUBTOTAL', 'Zwischensumme:');
-define('EMAIL_TEXT_TAX', 'MwSt.');
-define('EMAIL_TEXT_SHIPPING', 'Versandkosten:');
-define('EMAIL_TEXT_TOTAL', 'Summe:        ');
-define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Lieferanschrift');
-define('EMAIL_TEXT_BILLING_ADDRESS', 'Rechnungsanschrift');
-define('EMAIL_TEXT_PAYMENT_METHOD', 'Zahlungsweise');
-
-define('EMAIL_SEPARATOR', '------------------------------------------------------');
-define('TEXT_EMAIL_VIA', 'durch');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_shipping_address.php 2.3.1.src/includes/languages/german/checkout_shipping_address.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_shipping_address.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_shipping_address.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_shipping_address.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Versandadresse &auml;ndern');
-
-define('HEADING_TITLE', 'Informationen zur Versandadresse');
-
-define('TABLE_HEADING_SHIPPING_ADDRESS', 'Versandadresse');
-define('TEXT_SELECTED_SHIPPING_DESTINATION', 'Dies ist die aktuell ausgew&auml;hlte Versandadresse, an die Ihre Bestellung geliefert wird.');
-define('TITLE_SHIPPING_ADDRESS', 'Versandadresse:');
-
-define('TABLE_HEADING_ADDRESS_BOOK_ENTRIES', 'Adressbucheintr&auml;ge');
-define('TEXT_SELECT_OTHER_SHIPPING_DESTINATION', 'Bitte w&auml;hlen Sie die gew&uuml;nschte Versandadresse, an die wir die Auslieferung vornehmen sollen.');
-define('TITLE_PLEASE_SELECT', 'Bitte w&auml;hlen Sie');
-
-define('TABLE_HEADING_NEW_SHIPPING_ADDRESS', 'Neue Versandadresse');
-define('TEXT_CREATE_NEW_SHIPPING_ADDRESS', 'Bitte nutzen Sie dieses Formular, um eine neue Versandadresse f&uuml;r Ihre Bestellung zu erfassen.');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Fortsetzung des Bestellvorganges');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'zur Auswahl der gew&uuml;nschten Versandart.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_shipping.php 2.3.1.src/includes/languages/german/checkout_shipping.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: checkout_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Versandinformationen');
-
-define('HEADING_TITLE', 'Versandinformationen');
-
-define('TABLE_HEADING_SHIPPING_ADDRESS', 'Versandadresse');
-define('TEXT_CHOOSE_SHIPPING_DESTINATION', 'Bitte w&auml;hlen Sie aus Ihrem Adressbuch die gew&uuml;nschte Versandadresse f&uuml;r Ihre Bestellung aus.');
-define('TITLE_SHIPPING_ADDRESS', 'Versandadresse:');
-
-define('TABLE_HEADING_SHIPPING_METHOD', 'Versandart');
-define('TEXT_CHOOSE_SHIPPING_METHOD', 'Bitte w&auml;hlen Sie die gew&uuml;nschte Versandart f&uuml;r Ihre Bestellung aus.');
-define('TITLE_PLEASE_SELECT', 'Bitte w&auml;hlen Sie');
-define('TEXT_ENTER_SHIPPING_INFORMATION', 'Zur Zeit bieten wir Ihnen nur eine Versandart an.');
-
-define('TABLE_HEADING_COMMENTS', 'F&uuml;gen Sie hier Ihre Anmerkungen zu dieser Bestellung ein');
-
-define('TITLE_CONTINUE_CHECKOUT_PROCEDURE', 'Fortsetzung des Bestellvorganges');
-define('TEXT_CONTINUE_CHECKOUT_PROCEDURE', 'zur Auswahl der gew&uuml;nschten Zahlungsweise.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/checkout_success.php 2.3.1.src/includes/languages/german/checkout_success.php
--- 2.2rc2a.cp.src/includes/languages/german/checkout_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/checkout_success.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: checkout_success.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Kasse');
-define('NAVBAR_TITLE_2', 'Erfolg');
-
-define('HEADING_TITLE', 'Ihr Bestellung ist ausgef&uuml;hrt worden.');
-
-define('TEXT_SUCCESS', 'Ihre Bestellung ist eingegangen und wird bearbeitet! Die Lieferung erfolgt innerhalb von ca. 2-5 Werktagen.');
-define('TEXT_NOTIFY_PRODUCTS', 'Bitte benachrichtigen Sie mich &uuml;ber Aktuelles zu folgenden Produkten:');
-define('TEXT_SEE_ORDERS', 'Sie k&ouml;nnen Ihre Bestellung(en) auf der Seite <a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '"><u>\'Ihr Konto\'</a></u> jederzeit einsehen und sich dort auch Ihre <a href="' . tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL') . '"><u>\'Bestell&uuml;bersicht\'</u></a> anzeigen lassen.');
-define('TEXT_CONTACT_STORE_OWNER', 'Falls Sie Fragen bez&uuml;glich Ihrer Bestellung haben, wenden Sie sich an unseren <a href="' . tep_href_link(FILENAME_CONTACT_US) . '"><u>Vertrieb</u></a>.');
-define('TEXT_THANKS_FOR_SHOPPING', 'Wir danken Ihnen f&uuml;r Ihren Online-Einkauf!');
-
-define('TABLE_HEADING_DOWNLOAD_DATE', 'herunterladen m&ouml;glich bis:');
-define('TABLE_HEADING_DOWNLOAD_COUNT', 'max. Anz. Downloads');
-define('HEADING_DOWNLOAD', 'Artikel herunterladen:');
-define('FOOTER_DOWNLOAD', 'Sie k&ouml;nnen Ihre Artikel auch sp&auml;ter unter \'%s\' herunterladen');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/conditions.php 2.3.1.src/includes/languages/german/conditions.php
--- 2.2rc2a.cp.src/includes/languages/german/conditions.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/conditions.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: conditions.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Allgemeine Gesch&auml;ftsbedingungen');
-define('HEADING_TITLE', 'Allgemeine Gesch&auml;ftsbedingungen');
-
-define('TEXT_INFORMATION', 'F&uuml;gen Sie hier Ihre allgemeinen Gesch&auml;ftsbedingungen ein.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/contact_us.php 2.3.1.src/includes/languages/german/contact_us.php
--- 2.2rc2a.cp.src/includes/languages/german/contact_us.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/contact_us.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: contact_us.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Kontakt');
-define('NAVBAR_TITLE', 'Kontakt');
-define('TEXT_SUCCESS', 'Ihre Anfrage wurde erfolgreich an den Vertrieb gesendet.');
-define('EMAIL_SUBJECT', 'Anfrage von ' . STORE_NAME);
-
-define('ENTRY_NAME', 'Vollst&auml;ndiger Name:');
-define('ENTRY_EMAIL', 'eMail-Adresse:');
-define('ENTRY_ENQUIRY', 'Anfrage:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/cookie_usage.php 2.3.1.src/includes/languages/german/cookie_usage.php
--- 2.2rc2a.cp.src/includes/languages/german/cookie_usage.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/cookie_usage.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: cookie_usage.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Cookie Usage');
-define('HEADING_TITLE', 'Cookie Usage');
-
-define('TEXT_INFORMATION', 'Ihr Browser erlaubt keine Cookies.<br><br>Damit Sie Ihren Einkauf fortsetzen k&ouml;nnen, sollten Sie es dieser Site erlauben, Cookies zu setzen.<br><br>F&uuml;r den <b>Internet Explorer</b> gehen Sie dazu bitte folgendermassen vor:<br><ol><li>Im Men&uuml; <b>Extras</b> w&auml;hlen Sie <b>Internetoptionen</b></li><li>Dort klicken Sie auf <b>Sicherheit-Stufe anpassen</b></li><li>Im unteren Bereich findet sich eine Drop-Down-Box, in der Sie <b>Mittel</b> w&auml;hlen.</li><li>Klicken Sie nun auf <b>Zur&uuml;cksetzen</b></li></ol>Diese Massnahme dient Ihrer Sicherheit. Sollten dadurch Probleme enstehen, bitten wir um Entschuldigung. Bitte setzen Sie sich mit uns in Verbindung, wenn Sie Fragen zu diesem Problem haben.');
-
-define('BOX_INFORMATION_HEADING', 'Cookies und Ihre Privatsph&auml;re und Sicherheit');
-define('BOX_INFORMATION', 'Durch den Einsatz von Cookies wird die Sicherheit verbessert und Ihre Privatsph&auml;re besser gesch&uuml;tzt.<br><br>Im Cookie sind keine pers&ouml;nlichen Daten enthalten.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/create_account.php 2.3.1.src/includes/languages/german/create_account.php
--- 2.2rc2a.cp.src/includes/languages/german/create_account.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/create_account.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: create_account.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Konto erstellen');
-
-define('HEADING_TITLE', 'Informationen zu Ihrem Kundenkonto');
-
-define('TEXT_ORIGIN_LOGIN', '<font color="#FF0000"><small><b>ACHTUNG:</b></font></small> Wenn Sie bereits ein Konto besitzen, so melden Sie sich bitte <a href="%s"><u><b>hier</b></u></a> an.');
-
-define('EMAIL_SUBJECT', 'Willkommen zu ' . STORE_NAME);
-define('EMAIL_GREET_MR', 'Sehr geehrter Herr ' . stripslashes($HTTP_POST_VARS['lastname']) . ',' . "\n\n");
-define('EMAIL_GREET_MS', 'Sehr geehrte Frau ' . stripslashes($HTTP_POST_VARS['lastname']) . ',' . "\n\n");
-define('EMAIL_GREET_NONE', 'Sehr geehrte ' . stripslashes($HTTP_POST_VARS['firstname']) . ',' . "\n\n");
-define('EMAIL_WELCOME', 'willkommen zu <b>' . STORE_NAME . '</b>.' . "\n\n");
-define('EMAIL_TEXT', 'Sie knnen jetzt unseren <b>Online-Service</b> nutzen. Der Service bietet unter anderem:' . "\n\n" . '<li><b>Kundenwarenkorb</b> - Jeder Artikel bleibt registriert bis Sie zur Kasse gehen, oder die Produkte aus dem Warenkorb entfernen.' . "\n" . '<li><b>Adressbuch</b> - Wir knnen jetzt die Produkte zu der von Ihnen ausgesuchten Adresse senden. Der perfekte Weg ein Geburtstagsgeschenk zu versenden.' . "\n" . '<li><b>Vorherige Bestellungen</b> - Sie knnen jederzeit Ihre vorherigen Bestellungen berprfen.' . "\n" . '<li><b>Meinungen ber Produkte</b> - Teilen Sie Ihre Meinung zu unseren Produkten mit anderen Kunden.' . "\n\n");
-define('EMAIL_CONTACT', 'Falls Sie Fragen zu unserem Kunden-Service haben, wenden Sie sich bitte an den Vertrieb: ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n\n");
-define('EMAIL_WARNING', '<b>Achtung:</b> Diese eMail-Adresse wurde uns von einem Kunden bekannt gegeben. Falls Sie sich nicht angemeldet haben, senden Sie bitte eine eMail an ' . STORE_OWNER_EMAIL_ADDRESS . '.' . "\n");
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/create_account_success.php 2.3.1.src/includes/languages/german/create_account_success.php
--- 2.2rc2a.cp.src/includes/languages/german/create_account_success.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/create_account_success.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: create_account_success.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Konto erstellen');
-define('NAVBAR_TITLE_2', 'Erfolg');
-define('HEADING_TITLE', 'Ihr Konto wurde mit Erfolg er&ouml;ffnet!');
-define('TEXT_ACCOUNT_CREATED', 'Herzlichen Gl&uuml;ckwunsch! Ihr neues Konto wurde erfolgreich er&ouml;ffnet! Sie k&ouml;nnen jetzt &uuml;ber Ihr Kundenkonto unseren \'Online-Service\' effizienter nutzen. Wenn Sie Fragen zum diesem Online-Shop haben, wenden Sie sich bitte an den <a href="' . tep_href_link(FILENAME_CONTACT_US) . '"><u>Vertrieb</u></a>.<br><br>Eine Best&auml;tigung &uuml;ber Ihr neues Konto wird Ihnen zugesandt. Falls Sie diese eMail nicht innerhalb einer Stunde erhalten, wenden Sie sich bitte an den <a href="' . tep_href_link(FILENAME_CONTACT_US) . '"><u>Vertrieb</u></a>.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/download.php 2.3.1.src/includes/languages/german/download.php
--- 2.2rc2a.cp.src/includes/languages/german/download.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/download.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,13 +0,0 @@
-<?php
-/*
-  $Id: download.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_add_address.gif 2.3.1.src/includes/languages/german/images/buttons/button_add_address.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_add_address.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_add_address.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89a}    9ZLja{͙RRRţǎCbsYtIgֽܧ޶>^kQm㭭}fff=]^ySpe~\\\֖s眭            ! ; ,    }   p8Ȥrl:Ш4i
ևEx<&Xk,WˈL,kslB!lwhC+
-C'bC/ F#WB1C
\G,B#%,pBIBR!Bm'C
-
-
-WH)WJQ%2+5
-X.CG)(FCKB4Ы%4xHD@!9/#J!d\	XFԱ _	]h}4`+h	
4j~iKd@0@Dn">m
-0C~lE$Wˬ+WZ$p-ZX"H!jBp@%'5V=rWV/r;H:"I,u9-AAA
-ڰB7!-svթ`F0g.V#+1v$(r 
-C6p iH%,h\xu-7yXC{B?# !il
$p gXRaYWYՒTe!d({X iy1Ĕ7Y,ŁO-#U-дd҇+G6dN G   (Q7
-` p@#F,tGS\H<K(yB,	H60p0H42ZQ6ꊛB<@ # il /W |zt ,l:Ԋa0v+k~|C ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_address_book.gif 2.3.1.src/includes/languages/german/images/buttons/button_address_book.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_address_book.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_address_book.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a}    9ZLimCbWr|Qm>^fTpZu=]]y                                                                              ! % ,    }   @pȱȤrl:Ш4C,px,^P2XkWNLÝ	BlwwhCG"C!aCGW
B
BKC#JBFt`BGB

jOWBS#C	
	XIBF#BGCFGB"FCXpW]AЄ)dƭ̂*!<RL'qc0a I"9"ĵiM)LU+#zT¦Z2j,De@O$x?arVVG,8Ȑv["r"DjKN
-@M<u޸$ #pŠC<-Ȣ6U@umq&C7(0f9B}ۭQӫ,0
-+xc+-/JJtsm*V݀ٷvĨьFg|$@HI̤g\aP  +y22@	xpe7^Y.}JXOȼtY,[W,p DʑH*A7l\!PTr4l< DXDR嗔t "QBWlB8{lqKtA DԱ*蠄j衈"\^ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_back.gif 2.3.1.src/includes/languages/german/images/buttons/button_back.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_back.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_back.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89ad    9ZLjQIIa{ZRR}IgċyssCbYtfffk>^ቄQmsb[[smm޿=]^ySpe~׼閧s񬨨! ? ,    d   @pȤrl:e6oARz0rYqPT1	|NoQߞcstMU,}U/Q-N%C# F	CZQV_nM-B)'Bk/4B0^`	N$t"$6,8B.Q-$Zn$)BB
-F-|$ڝrGg3(U^CFU #n|cCUX0Q*+OȿpB#
q!Ԑa$=T]BDc%Pp#ձ|s̙/Xe_JTy5twGaBTpZ4!lDwd续"jvU1 1$!{2DB)<rJk
-sQ +<><-BU^9	B$сOQVǂ @@.Ѓ	hqu#`xPZ:mV`SE}$ @B  Kl#H'}9Ou߀^0bQzUt (FV`TЀKIdh(,*FMA  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_buy_now.gif 2.3.1.src/includes/languages/german/images/buttons/button_buy_now.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_buy_now.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_buy_now.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89aP    1THfm<\CcVru:Z?^Ggz_z[vLiHhÀѼ                                                                              ! % ,    P   x@Ȥrl:P PJtz3x!Бn!m2"HIjH   HHhIGx WBGWGW!GBqˢW#̿	qjIKB̭B 7n/u{(s:$L|iR"!-՟U'mk\24XP}
-m "P!@ 2cݾثQ_yuBCJaAA?jUZ̠ڂ i'VfD[;4a5#w&ɘ3+
-JӨp"$ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_change_address.gif 2.3.1.src/includes/languages/german/images/buttons/button_change_address.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_change_address.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_change_address.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89a    9ZLja{CbIgs=]YtRRRǷfffkQm}̧BZ᝭􁖲^ySpe~\\\pֳ札         ! < ,       @pzȤrl:Шt:ءCH"԰xL.	SV
-v2<u{,kBnzOXGC+{]-]T,C0 F!XB2"CNXJ-B*O&RB9B	o+C""XOXF&M*u׺4'3G8""Y/N҂ф*B(GBuF&ɰڑC=c#	!"5i*(=e9sJ6.}Lg&&I SH9}|i3C2[8u>&d|Q\8(d6l87Dr2a(+~
-PU	&ZϠ
-pcw׼Vm0ʅF"1U 7@ +ą6EH

xd@\Y"	BERl	/-?&0tР7`0I#szC
-"zԐm}7Ha]nY[xC	S
0XLb d|WFBR-Y^WAMiI[Uu,=aC G̐@wLANXa`e}Fڈh\F*)\QO$Gf L "$,ܷny<@Ig?C%}N>V8 /4RNL04qY	i"O> Z"~*DjX J0`H5&E
-B`B0lsf)p Bik.-C
-Xl A{If1 Gg &7G,Wl?D7D ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_checkout.gif 2.3.1.src/includes/languages/german/images/buttons/button_checkout.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_checkout.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_checkout.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89ad    9ZLjSLLa{ZRRyss}IgCbYt灖fffkᚪ>^ܿQmssmm=]Sp^ye~لzzs! ? ,    d   pȤrl:%4OAz0rrYAIT7|N_QߞstMU)}U(FC- F%6%Z_n%+B$Bk(%}`+%!%,)0C}*B%F22G&B%G|%&%FC;g%͹BBGB	aA0ʌwCBȴ%AcOCEqxa
-!DĎe6^Gl4J 
-$5#eB9JxY[qپQgdƐmxY !9X͔mz +02"eYӥǋ)N<j80BBr+4[%_	VI@ UpBP@Fc߭8 ĝ78$n~BᒆE9Vv h/ l>Ư2DaLV "C٫t8p
-#+gYps4߂1_8 Vhf^(U ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_confirm_order.gif 2.3.1.src/includes/languages/german/images/buttons/button_confirm_order.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_confirm_order.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_confirm_order.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89ad    9ZIgkዞYtCb}횪ӥ^y>^Qm̙se~=]SpLj͖謩a{s焙                  ! 9 ,    d   @pȤrl:5[Uz0RXqTQ|NPߗrbtM0fC0%}C"#0FC F2ZI/UrLBFnB
k#"+JVrN&%,.2C)B/|F*1GqBF+C1BK/G5ֽVf5RσrеbEҚ&&8YGh$
-q@p9
-׎P^Eu7! b11{BjIFT@4
ӆhYlf$!)vf[WBZL	
-!AQ&DUx3
pk+<q	/8diaN8u\fx7l-]X`w"8GL<6d> -5`]˙s
O\T	^fl=pgةdqCKG|l2_@Z9-_VYHCcD:hW;#8)`b"C0C 2Ɇr$ [D8P!V`@*$@T4BA-UPxX
-(h
-YB
-؀֐P&A$Xf\v`T ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_continue.gif 2.3.1.src/includes/languages/german/images/buttons/button_continue.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_continue.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_continue.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89ad    9ZLjSLLkZRRyssIgYtCbә}fff큖a{>^Qmsmms杭=]Sp^ye~׀zzٖs眭! ? ,    d   @pȤrl:c6gA2z0rYT9|NQߟsztMU-}U+FC F&(&ZQn&*B//B*MBFIBk+&}0^&&&/M**qJ%&;-8C$}.Q/ʦ|&,G&0CFs&F<C$r91N0ae(]3:!-
 Q*(, @b(*D-FSBf)E#)2
!<TM+Uftv9U`
-ᧆUDJsRV}k!L:*:jh`eXm8xq'&S_0')W[BEpdDu78K02-3U@oa"A}E	y5L9Dv @@-
.8!(#"ۜu4mLB0\ҰȆN =[e܇Pؙ0 t~27ycUсVF
ZAG`	x%帀`@`(,0@FC ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_continue_shopping.gif 2.3.1.src/includes/languages/german/images/buttons/button_continue_shopping.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_continue_shopping.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_continue_shopping.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3   >^n:[=]A`CbKhVra{e~hkrQII!   ,        *\ȰÇ#JHbCs
(r
-љHɓ(O3gx#n`oRɳgs57~6ɴS
wNlH7;ќFz
pR紁Lvӷı/YJ!ցٰ
ppImjCXDmٲ-YSq #'^^oV|W``v޼41M`Dn}H}P6Bôyc3 ]'لݑ571 w|خ\P @f] Tco;\ 7}
H	CpC6OvQ;^`3PzOGb؉&0q8u 
 (ЌxN<z%8DFávg`a?zyXZ.ABixk& 9b+& ŹfQIasg#:;&6`h "~s&`E/'ke'Spjibc (j>>
-g6)tN7酜y*a5T9Z<s
-ANjE\GVت] `9wZl}=njX}6ޘZVb-+hC
8C)i*9^z\Ι1gror;P7& 䣨>DBc[qz1sgZȮcLY6uƨ
K
}T3pÙRqhvpiFrzwyq|,:#{c^6@
M9z{sn:%.U
- tS-U_PI\WKysD<cu83%Fc8u"E/IxFG9s4[;Jd|Vc觏8/C`R@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_delete.gif 2.3.1.src/includes/languages/german/images/buttons/button_delete.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_delete.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89ac    RnӮ{},,eeឮn>^!     ,    c   ɹ8ͻ,SIA֤a뾰S>@D	v4l:7
SH N!4E>7E0ANTI*(㡄Eg$Hplp	cxy>2\L
YY2-Q T 	u^w%cnS{
-	f2w$J-X&
-U%PJ)P@̿D
-P;[®{	3CXDBC':l![{LHnp0JMXFcmg7U$(0BCx40JsB:gjϪwf@ß;Je`sA7*PH
IG 9jPҎF6i$ɳ22!wnݺ]r8^,FHC[@L("Wг Yb%7mizp"
-4$oO6|  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_edit_account.gif 2.3.1.src/includes/languages/german/images/buttons/button_edit_account.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_edit_account.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_edit_account.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a}    (((Li<\m~9ZyyyCbWr֌Pmf֎尽BZTpZuݞ]y                                                                        ! ' ,    }   @pH(Ȥrl:Ш44px,vX:X[W	LVFBlwwhCG#W!u$cCGXZIWN$v$##QFBGHWNtO$
XzDCCBCBFBJFc$Մ@XaL%$[Δ`b0a̭K)*!fKd&""PHX&f*dl鈦IAjvkIHxJ-D+ҎXGb.+4}Wk9xZ)jI C$< [fWZn#oKgZ&䰑
-K%`d ;lŜ"Z&ÓjY+pk`pB*Kn3bэ37zQRYu`;ix1eN*^THp']ܢX1xCQ8+d TeETb|+*Ѥ "I,(L6q'4il!q嘆XY[b /:1$KTbx|駟O< A  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_history.gif 2.3.1.src/includes/languages/german/images/buttons/button_history.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_history.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_history.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a    ӼְϰθĞĎ~|nm\wTmLiDc>^...      !  ,         fhlp,tbƨmH,ȓO-#7JPجv;P
-	@@贚X*YG&(#'M
	"g0;
-C."{&&"Y", (E"JM	N4M4 +&äYz(l q 

			 .#"&"'"eB v& oz6 4@} *.0aE" !u3@K#L ! =k^"&`(N	 @ulJQA: GE  i& 0ETVxD0P`Ό:.#@:_*;W -L\6(xfV*XѨOZI!{z=4PU
yylՂPҴs~U*P@cO'l6u|F`n"
-giV\׍dm'(`?[z1{'D@>w^%WYd,A!>i4YoJ8(aq+<6Q&*SrJW>[rPDCL4IN DQRH$*eWo1RTt%
UEf4&8='wA$L>c}@S Y@Ew{v&XGPJ
rH# aaZR
1F+m85s`ǴvۅBQ# T ۪koK8kݽ!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_in_cart.gif 2.3.1.src/includes/languages/german/images/buttons/button_in_cart.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_in_cart.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_in_cart.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a}    JJK\w<\SpIg9Z}}}sӤCbfffsst:::ܵZZ[333ƁkfffYt歭RRRBZQm}BBBe~Lj$%$Äa{snnnBJB                                                                                                                                                                        ! G ,    }   .&==+515-&	/<+,$<<6
آ-/

0
'')::. .% !1n	<xFoM? Q!40@h0$D9>9h@1Hv(#uX*(=
 j
-颩$
Ȁ 
H8Ơ IuA(v
-2sAq]8͵w"0
- `h0K3b]DuTYtZ8#'` RY(0L$C;ٞAjV5z>..pD
BT8هB3'icZW8t!f@\ !  rvUC}]k!Ebr<p!?r%'l&Y1BQQ\9>	]qԈER!59`pIGHrd@F 'V$ P!#P Fxe"710fOA#h@֢z9 0@CBJ6Hj.`` 4飪 A%`bS 0d ^+m-4& ;x7"Dd覫ƻ		 ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_login.gif 2.3.1.src/includes/languages/german/images/buttons/button_login.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_login.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_login.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89aj    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3   >^:[=]A`CbIgKiRoWsa{enr}̺QQQ!   ,    j    *\ȰÇ#JDo3P: C9}x\xykG͛vR
-ѣq/䏪yKVu-z뺣
Zb~q|mA	̦p Rq}k)o u{Ů|0]r-깨` 69t]!)Q
ojL
a,=p Е)0ӄ6m@6O0ܶ]hE?zgO3|9 sua76 rǚCs9<c?\DCoXv	tj3P
[ܩ" (DF"
-raCaZ%p_<Ǣ˝HP6:R VLv!
x7UrPMVM78IƳf6rwmi
-l҇9IcoMp
-IJCPEBIz&!ha:Z'Dci)U@Ϊ:n)*%ܣ
6asRqُP:
:X9 !w׭heCVY1zqc+`Ug-oM,:y-]l >40Z0:gSOU6E :`<{qH锜RO);dP |C@-tmH'3HCE ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_notifications.gif 2.3.1.src/includes/languages/german/images/buttons/button_notifications.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_notifications.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_notifications.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a                ȶ;[>^CbJhLiVr_yb|fnq{}Ī˾ȪqqqYYYGGG666                                    !  3 ,       @pxȤrl:ШtJ6'VHHuL.db#$"J~)uB%_F
nBq~zmBGZ
OB	Gn2[(YFZ1../[PZ# MJHȬd(F[//020/B[}KGBdu.12/+).q%Èw6 `
-00aaC#	 '*ẗ,#H>|
-"DBlB8L& (dcĉT0"E
-l1`PEA|(BP~"AB2  L cڶoe)epuit/`A
[8.F&i*VpKV n-FV
Vjӂ݄-zkq8)bf.<?a]osaсhZX:tSb7ggv̓hjXLw	XtC
S9!`ρ`_ RW-܂W߁ `m6AA|T=(f#c1*Z$P@M	8Anh=:X\;>J  <0AS)>WiQB	QbiXZ)&]8fWd!Ep%ajf(]&o60%dQMuеѠ:hX=ʪ0D@Xatz!,  p1϶I5/Tx !s\G@{ܶkLtjb@*,GH`@67,, cƫd| ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_quick_find.gif 2.3.1.src/includes/languages/german/images/buttons/button_quick_find.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_quick_find.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_quick_find.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a    GR  !@gUn%V " ! *ͅ  x 7ux73s ,,iklry|3(BaaQss.44ϲF?<8h a\Wyto`_^a[Vlfatniqkg}8KFCP{v|som|zQgmNP    <  O
-
-11UMMrjj獍www\\\MMMJJJ;;;222                                                                                                   ,       UW][\[VUX=?;297($R6]	U4-!_F['4/,%E\&+*)#@T[:
- %#
_ZV<SMN.B
5K03GD>_HIOYZ AJQL_Cp@O/1
-*T ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_remove_notifications.gif 2.3.1.src/includes/languages/german/images/buttons/button_remove_notifications.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_remove_notifications.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_remove_notifications.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-GIF89a                ;[>^CbJhLiRnVr_yb|fnq{}}Ģêڽ{++ee                                             !  0 ,       @pȤrl:ШtJZXH4
-J2#ΚzfN*	/@TPD.S\Du rB(uSqBu"]B"G C]/,, `MJ\GB+-B%M!]&~ LIHҶF( T
-G ,% - HC
mJ!!KӶM'!  g0RFs p&$R h
4!"Sx0	[4aJ	@&M8E0qᙄ#Dy&JHZHȑ%=F`˒!2e@~-`+h^\,# b:vcvᤐ~A	!2.j0 )n+`B>и*Sρs\/e O>̴
-60Â!fȝۂ={R?z3λvΝsfM?`w a<7y)
vnHǗ}>ȾM?Viw_xcQ(a%xalC ]\ͷNx)G
-eH5V<L<6cG	3֖v;d{J "]we4zg4R	hL7ɐl]nZ&Jn${԰Aq҉S9í\'f͈v)idr)]V婝biZ%xcЍ;{
-YBh	UA,LԨFli'jjW	U, Ʋ+lAGSq:W
-r
-Dov 6t!ZZ*MI VupSt;bc/ko1yWeUQ<%G( ʱAL6D2oy3}2L4?RTcA܇*tAQ<FG-5 #uPЁ";`lGhmEl]A] ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_reviews.gif 2.3.1.src/includes/languages/german/images/buttons/button_reviews.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_reviews.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_reviews.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89a}    HHH\w<\YtLj9ZsfffCb{{{ַkIg333fffާZZZ癙QmBZ}e~֝Sprrra{p:::眭                                                                                                                                                                              ! E ,    }   /44$,5<
- *8$&881ӡ<*)3ԉ&1%0
+	R0>yB,HB	!'hƯH6Ð3
-: 䂏2Pb6~	Ŋt(2l$TA"J4#ʞ!Hb97#
-9U̜lS)KAd|%^AfuÁ/zT1D,Ę׹G
-rq@JU~z@CuAI,QЃal$!/>L b"-(1!Ohp<yjn)Ӳ} B		Q'
-hVWAͦ\δj]I^#3v@0zDH V rJ\3
(~2]"Zn7#Pp/LPz
p@UtMSSj;2[O3\G~ָt$$eȋe
| 6 
,?p"5"LMHv.GԞ76#OU =CI?EHNf[#lv%`Du. r -\"0'< ȱ9 $k-3TM\ N<L끄֖kL!H
-+o-;`@D/)l'7	#%  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_search.gif 2.3.1.src/includes/languages/german/images/buttons/button_search.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_search.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_search.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89aZ    f3 ̙f3 f3 ffffff3f 3333f333     f 3  f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333     f 3  ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333   ̙  f 3  ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f  3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33      f 3     ̙ f 3      f 3   f f f ff f3 f  3 3 3 3f 33 3         f  3   >^:[=]?_A`CbIgKiRoWsa{en̹߼rrr!   ,    Z    m*\ȰÇoEԥSn]ď C,Ny<.½I&Mv.S8筴IBvcG <I@=vѹ]u
5zܻ<;Pܷ~V6 hlUH.s,Y׏ފ|O 75,BCC pM=/y	Ƴa] l
v-@z8}Fk{~s;\l3&9<׷<u=a^qU Zf-<UA$ dD@9D@	D 
-
-N6]vFxClMӏ?ۼ7IY;q" +.A6[#cqe :=~$yJ*fe,.hA/?\ s2tb5bĽi(D@?ܞc)$t`t,Φ{pΆZw6aNRx҈R89'~7i89:
 ݕ,:N`j@?MX^)͖f8NluL+YӔ9퉠Ďbe6t+N<xoCt+N;
-G9Wl#:uZ ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_shipping_options.gif 2.3.1.src/includes/languages/german/images/buttons/button_shipping_options.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_shipping_options.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_shipping_options.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a    &&&III{{{Yt<\Ig}9ZfffCbe~턙̌fffAAAZZZs㳿QmÄ^yBZsssߙkQQQ裳ǁSpLj333a{֖札s                                                                                                                                                                              ! E ,       *%66"9981	
-&"4 ɏ<<Ø74
-*2+!&؍&9&*? B	
, ;
"y*MgHu1䐏!㡊4B E֩ah 0` !50Ԃ<C5إ;*]A8vl$F3)R0_)8 qp
tP15> 6 3$(+ķRֲXV+:-H7ShTǌlt0DQE)BX(n1P6rÂ:އl1Fz쮻]W1b$L0d@H
$ dC%i5O[vWAxx`(&z'	@0	'_"U>XvE
Ydng]]edjSu5v"̆@x)V!6c6 YR7E9gc"9Ox{68M2 /php0]hGx@WBjdGg-C;̠B/ %9I4O( =8F@:tr@r։>D ViZ,[^ܠ@ey ×S!P8voʲQeW`RЕ!1fޚDxLʁШ@ |`LHlKr$%1U/8Ⱦ'sOR57 ;  H' .&d)c8#m56&D	DT d_Ҕ@lp-tm7܌D` ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_tell_a_friend.gif 2.3.1.src/includes/languages/german/images/buttons/button_tell_a_friend.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_tell_a_friend.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_tell_a_friend.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      3         !   ,       >H0F@DD (tC(x1:*52V0)^fJJXB ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_update_cart.gif 2.3.1.src/includes/languages/german/images/buttons/button_update_cart.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_update_cart.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_update_cart.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-GIF89a}       MNL<\\w333Sp~njuف9ZsCbLje~fff}}}IgCCC$!(̏TQYYtBZǉ}a]g
kQQP¾Qm)',á62;ܙ́! "fffsoya{VWVXT^֏C>J~z)!)s
絭<;=)'.[Vdľ˄~lfuWXV                                                                        ! g ,    }   /(WW7		(*?,F7#FF ZC8Hb/;ڡ,HHcS:[ 3/9/1* HA;ypI'-IDһy/¨q?9rj"E^H9EP,@2 藌A 
-<4$׋$>~l	RP	X$#J iT%
=d鄋
-/bF JomTP${GT^d /b\YI#S^$%!	.4E% ""_ zISNzqc/"`ҴrV0VEI,J T 0/ ևy#xHRB>ظSDaA=9Op%v  +g 0  FG	'XthHgM&@8PDHKd HbB
-"pbSgg!bY2`[x`L!RpAT
-$ E [eيqZ}5Gac^
*pB-9
wvpB};oQt&ڠzhcV aF A +$N"QfT HNMٖQ n`f5H8 b ,y
-Ik{H<,1 #dc@<B䠓^2BT,2-tBe0b
-o 8<@3
- ] ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_update.gif 2.3.1.src/includes/languages/german/images/buttons/button_update.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_update.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_update.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-GIF89a}       MNL<\\w333Sp~njuف9ZsCbLje~fff}}}IgCCC$!(̏TQYYtBZǉ}a]g
kQQP¾Qm)',á62;ܙ́! "fffsoya{VWVXT^֏C>J~z)!)s
絭<;=)'.[Vdľ˄~lfuWXV                                                                        ! g ,    }   /(WW7		(*?,F7#FF ZC8Hb/;ڡ,HHcS:[ 3/9/1* HA;ypI'-IDһy/¨q?9rj"E^H9EP,@2 藌A 
-<4$׋$>~l	RP	X$#J iT%
=d鄋
-/bF JomTP${GT^d /b\YI#S^$%!	.4E% ""_ zISNzqc/"`ҴrV0VEI,J T 0/ ևy#xHRB>ظSDaA=9Op%v  +g 0  FG	'XthHgM&@8PDHKd HbB
-"pbSgg!bY2`[x`L!RpAT
-$ E [eيqZ}5Gac^
*pB-9
wvpB};oQt&ڠzhcV aF A +$N"QfT HNMٖQ n`f5H8 b ,y
-Ik{H<,1 #dc@<B䠓^2BT,2-tBe0b
-o 8<@3
- ] ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_write_review.gif 2.3.1.src/includes/languages/german/images/buttons/button_write_review.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/button_write_review.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/button_write_review.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-GIF89a}    JJJ\w<\Yt9ZLjsfffCbk𗩿333|||IgWWW폢Qm:::BZ}e~QQQtttԌfffSpa{CCCٖs眭                                                                                                                                                                                    ! C ,    }   ( +46&	%9 !998ӡ&%Θ..(Ԏ8ۂ0(7P eNvApq(fť\Av 	
-͠hd	,NPX-0蒑L?.]XzAr"S Nyc^"!n\7EWhSga$oeE3pIDXhGGnf5 Caug	iM,Ό;Uc"Ȱ"080bA%uPu+$V (<xt
b 0h#W~H\ϑk,䡓;W AA$	' 0 
-Whz_	
-
-
7qgs2
-@v5B  ȂTH!9g~	$Y|7WY,2!	A>XA
-) 3GGh&^j$ơPUc:@25" @@CLРaHhtܢ2$HHC߅u)W	. ~ H3 8d(*y0&zꬣHPz$@`6!GpOV"
R |!H E-)yk覫 %  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_delete.gif 2.3.1.src/includes/languages/german/images/buttons/small_delete.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_delete.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/small_delete.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89aE  : e~XsKi~@`祴?_زЮPmZuIgCb{HfѢLjޱuzNk͂[w^yDbDcin?^xmBalqAa>^               !  : ,    E   @Ȥrl:CHϬvD@6TGK.s'!Jk6 6gg	G55G59uGH[*,/[u				sm 5m88 5886\n
98mm89s[4|9 Դ }Z% 9
-ͅ8
95u9ϿH#  @Z6 @Jݖ'BCdBȱK22P˛] "B-YJѣDopa  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_edit.gif 2.3.1.src/includes/languages/german/images/buttons/small_edit.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_edit.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/small_edit.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89aE  : e~KiXs~@`粿Х?_ݮZuPmBaCb?^Hf^ynxmuLjilNkĽDbIgDcٴz[w{Aaq>^               !  : ,    E   @0Ȥrl:WCH=Ϭv<@\TGK.sU!&YÙ6޹Ea7G7G7JqH7FtJ+-Jm 96   8769 rm78w Kn858Ȳ	8ȁq9	 v8t89K~Fmq66Ӊֹqnq񤅒$ćb9U63bMbZSA18@Y8HGr8 =.iDx*52B9,B*@`uT@CjThӪ]6-UdL ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_view.gif 2.3.1.src/includes/languages/german/images/buttons/small_view.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/buttons/small_view.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/buttons/small_view.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89aE  : qXs~e~Ki@`?_ХȮZuPmIgxDcHfڠ{^yăDbBa͔ۂ[wnuzmLji?^NkCblAa>^               !  : ,    E   @PȤrl:	DHϬvLD$TGK.s''̵ϙs $`<y9 Iwz|O4N 6
-97888 896879n98F6Y/O78F
- 
-o8OMF89noەO#(N699i	 9 	N>׉&L9A'*`I]iM>HA޸4BH9|B
'D.-HxAEȅ5tAիX&*#!A  ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/images/icon.gif 2.3.1.src/includes/languages/german/images/icon.gif
--- 2.2rc2a.cp.src/includes/languages/german/images/icon.gif	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/images/icon.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    a   rK    w     !     ,       6x0IͻD(dIC`xB: HŞ`l: ;
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/index.php 2.3.1.src/includes/languages/german/index.php
--- 2.2rc2a.cp.src/includes/languages/german/index.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/index.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-<?php
-/*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_MAIN', 'Dies ist eine Standardinstallation von osCommerce Online Merchant. Alle hier gezeigten Produkte sind fiktiv zu verstehen. <b>Eine hier get&auml;tigte Bestellung wird NICHT ausgef&uuml;hrt werden, Sie erhalten keine Lieferung oder Rechnung.</b><br><br><table border="0" width="100%" cellspacing="5" cellpadding="2"><tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/1.gif') . '</td><td class="main" valign="top"><b>Fehlermeldungen</b><br><br>Sollten sich im oberen Bildschirmbereich Fehler oder Warnungen befinden, korrigieren Sie diese bitte entsprechend den dort gegebenen Hinweisen.<br><br>Fehlermeldungen sind durch eine entsprechende <span class="messageStackError">Hintergrundfarbe</span> gekennzeichnet.<br><br>Es werden standardm&auml;ssig verschiedene &Uuml;berpr&uuml;fungen durchgef&uuml;hrt. Sie k&ouml;nnen diese Checks durch &Auml;nderungen in der Datei includes/application_top.php abschalten.</td></tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/2.gif') . '</td><td class="main" valign="top"><b>Seiteninhalte bearbeiten</b><br><br>Dieser Text befindet sich im jeweiligen Sprachverzeichnis in folgender Datei: <br><br><nobr class="messageStackSuccess">[Pfad zu catalog]/includes/languages/' . $language . '/' . FILENAME_DEFAULT . '</nobr><br><br>Sie k&ouml;nnen diese Datei entweder direkt mit einem Editor bearbeiten, oder im Administrations-Modus &uuml;ber <nobr class="messageStackSuccess">Languages->' . ucfirst($language) . '->Sprachen</nobr> oder &uuml;ber <nobr class="messageStackSuccess">Hilfsprogramme->Datei-Manager</nobr>.<br><br>Der Text wird folgendermassen gesetzt: <br><br><nobr>define(\'TEXT_MAIN\', \'<span class="messageStackSuccess">Dies ist eine Standardinstallation von osCommerce ...</span>\');</nobr><br><br>Der gr&uuml;n hinterlegte Teil soll dabei ge&auml;ndert werden - wicthig ist, dass Sie auf keinen Fall den define()-Befehl f&uuml;r TEXT_MAIN editieren. Um den kompletten Text zu entfernen, setzen Sie TEXT_MAIN folgendermassen: <br><br><nobr>define(\'TEXT_MAIN\', \'\');</nobr><br><br>Mehr Informationen &uuml;ber diesen Befehl erhalten Sie <a href="http://www.php.net/define" target="_blank"><u>hier</u></a>.</td></tr><tr><td class="main" valign="top">' . tep_image(DIR_WS_IMAGES . 'default/3.gif') . '</td><td class="main" valign="top"><b>Online-Handbuch</b><br><br>Unser Online-Handbuch befindet sich unter <a href="http://de.oscommerce.info" target="_blank"><u>osCommerce Knowledge Base</u></a>.<br><br>Unsere deutschsprachige Support Seite finden Sie unter <a href="http://www.oscommerce.de" target="_blank"><u>osCommerce Deutschland</u></a>.</td></tr></table><br>Wenn Sie dass System hinter diesem Shop downloaden wollen, oder wenn Sie L&ouml;sungen zu osCommerce beitragen wollen, besuchen Sie uns bitte unter <a href="http://www.oscommerce.com" target="_blank"><u>der Support Site von osCommerce</u></a>. Dieser Shop verwendet <font color="#f0000"><b>' . PROJECT_VERSION . '</b></font>.');
-define('TABLE_HEADING_NEW_PRODUCTS', 'Neue Produkte im %s');
-define('TABLE_HEADING_UPCOMING_PRODUCTS', 'Wann ist was verf&uuml;gbar');
-define('TABLE_HEADING_DATE_EXPECTED', 'Datum');
-
-if ( ($category_depth == 'products') || (isset($HTTP_GET_VARS['manufacturers_id'])) ) {
-  define('HEADING_TITLE', 'Unser Angebot');
-  define('TABLE_HEADING_IMAGE', '');
-  define('TABLE_HEADING_MODEL', 'Artikel-Nr.');
-  define('TABLE_HEADING_PRODUCTS', 'Produkte');
-  define('TABLE_HEADING_MANUFACTURER', 'Hersteller');
-  define('TABLE_HEADING_QUANTITY', 'Anzahl');
-  define('TABLE_HEADING_PRICE', 'Preis');
-  define('TABLE_HEADING_WEIGHT', 'Gewicht');
-  define('TABLE_HEADING_BUY_NOW', 'Bestellen');
-  define('TEXT_NO_PRODUCTS', 'Es gibt keine Produkte in dieser Kategorie.');
-  define('TEXT_NO_PRODUCTS2', 'Es gibt kein Produkt, das von diesem Hersteller stammt.');
-  define('TEXT_NUMBER_OF_PRODUCTS', 'Artikel: ');
-  define('TEXT_SHOW', '<b>Darstellen:</b>');
-  define('TEXT_BUY', '1 x \'');
-  define('TEXT_NOW', '\' bestellen!');
-  define('TEXT_ALL_CATEGORIES', 'Alle Kategorien');
-  define('TEXT_ALL_MANUFACTURERS', 'Alle Hersteller');
-} elseif ($category_depth == 'top') {
-  define('HEADING_TITLE', 'Unser Angebot');
-} elseif ($category_depth == 'nested') {
-  define('HEADING_TITLE', 'Kategorien');
-}
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/info_shopping_cart.php 2.3.1.src/includes/languages/german/info_shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/german/info_shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/info_shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: info_shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Besucherwarenkorb / Kundenwarenkorb');
-define('SUB_HEADING_TITLE_1', 'Besucherwarenkorb');
-define('SUB_HEADING_TITLE_2', 'Kundenwarenkorb');
-define('SUB_HEADING_TITLE_3', 'Information');
-define('SUB_HEADING_TEXT_1', 'Jeder Besucher unseres Online-Shops bekommt einen \'Besucherwarenkorb\'. Damit kann er seine ausgew&auml;hlten Produkte sammeln. Sobald der Besucher den Online-Shop verl&auml;sst, verf&auml;llt dessen Inhalt.');
-define('SUB_HEADING_TEXT_2', 'Jeder angemeldete Kunde verf&uuml;gt &uuml;ber einen \'Kundenwarenkorb\' zum Einkaufen, mit dem er auch zu einem sp&auml;terem Zeitpunkt den Einkauf beenden kann. Jeder Artikel bleibt darin registriert bis der Kunde zur Kasse geht, oder die Produkte darin l&ouml;scht.');
-define('SUB_HEADING_TEXT_3', 'Die Besuchereingaben werden automatisch bei der Registrierung als Kunde in den Kundenwarenkorb &uuml;bernommen.');
-define('TEXT_CLOSE_WINDOW', '<b><u>[Fenster schliessen]</b></u>');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/login.php 2.3.1.src/includes/languages/german/login.php
--- 2.2rc2a.cp.src/includes/languages/german/login.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/login.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-<?php
-/*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Anmelden');
-define('HEADING_TITLE', 'Melden Sie sich an');
-
-define('HEADING_NEW_CUSTOMER', 'Neuer Kunde');
-define('TEXT_NEW_CUSTOMER', 'Ich bin ein neuer Kunde.');
-define('TEXT_NEW_CUSTOMER_INTRODUCTION', 'Durch Ihre Anmeldung bei ' . STORE_NAME . ' sind Sie in der Lage schneller zu bestellen, kennen jederzeit den Status Ihrer Bestellungen und haben immer eine aktuelle &Uuml;bersicht &uuml;ber Ihre bisherigen Bestellungen.');
-
-define('HEADING_RETURNING_CUSTOMER', 'Bereits Kunde');
-define('TEXT_RETURNING_CUSTOMER', 'Ich bin bereits Kunde.');
-
-define('TEXT_PASSWORD_FORGOTTEN', 'Sie haben Ihr Passwort vergessen? Dann klicken Sie <u>hier</u>');
-
-define('TEXT_LOGIN_ERROR', 'Fehler: Keine &Uuml;bereinstimmung der eingebenen eMail-Adresse und/oder dem Passwort.');
-define('TEXT_VISITORS_CART', '<font color="#ff0000"><b>Achtung:</b></font> Ihre Besuchereingaben werden automatisch mit Ihrem Kundenkonto verbunden. <a href="javascript:session_win();">[Mehr Information]</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/logoff.php 2.3.1.src/includes/languages/german/logoff.php
--- 2.2rc2a.cp.src/includes/languages/german/logoff.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/logoff.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: logoff.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('HEADING_TITLE', 'Abmeldung');
-define('NAVBAR_TITLE', 'Abmeldung');
-define('TEXT_MAIN', 'Sie wurden soeben sicher abgemeldet, so dass niemand mehr Ihre Daten einsehen kann.<br><br>Ihr Warenkorb wurde zwischengespeichert und steht Ihnen nach der n&auml;chsten Anmeldung wieder zur Verf&uuml;gung.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_loworderfee.php 2.3.1.src/includes/languages/german/modules/order_total/ot_loworderfee.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_loworderfee.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/order_total/ot_loworderfee.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_loworderfee.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_LOWORDERFEE_TITLE', 'Mindermengenzuschlag');
-  define('MODULE_ORDER_TOTAL_LOWORDERFEE_DESCRIPTION', 'Zuschlag bei Unterschreitung des Mindestbestellwertes');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_shipping.php 2.3.1.src/includes/languages/german/modules/order_total/ot_shipping.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/order_total/ot_shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: ot_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_SHIPPING_TITLE', 'Versandkosten');
-  define('MODULE_ORDER_TOTAL_SHIPPING_DESCRIPTION', 'Versandkosten einer Bestellung');
-
-  define('FREE_SHIPPING_TITLE', 'Versandkostenfrei');
-  define('FREE_SHIPPING_DESCRIPTION', 'Versandkostenfrei bei einem Bestellwert &uuml;ber %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_subtotal.php 2.3.1.src/includes/languages/german/modules/order_total/ot_subtotal.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_subtotal.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/order_total/ot_subtotal.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_subtotal.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_SUBTOTAL_TITLE', 'Zwischensumme');
-  define('MODULE_ORDER_TOTAL_SUBTOTAL_DESCRIPTION', 'Zwischensumme einer Bestellung');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_tax.php 2.3.1.src/includes/languages/german/modules/order_total/ot_tax.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_tax.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/order_total/ot_tax.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_tax.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_TAX_TITLE', 'MwSt.');
-  define('MODULE_ORDER_TOTAL_TAX_DESCRIPTION', 'Mehrwertsteuer');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_total.php 2.3.1.src/includes/languages/german/modules/order_total/ot_total.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/order_total/ot_total.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/order_total/ot_total.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: ot_total.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_ORDER_TOTAL_TOTAL_TITLE', '<b>Summe</b>');
-  define('MODULE_ORDER_TOTAL_TOTAL_DESCRIPTION', 'Summe der Bestellung');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/authorizenet_cc_aim.php 2.3.1.src/includes/languages/german/modules/payment/authorizenet_cc_aim.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/authorizenet_cc_aim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/authorizenet_cc_aim.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: authorizenet_cc_aim.php 1794 2008-01-11 13:51:10Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_TITLE', 'Authorize.net Credit Card AIM');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_PUBLIC_TITLE', 'Kreditkarte (verarbeitet durch Authorize.net)');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.authorize.net" target="_blank" style="text-decoration: underline; font-weight: bold;">Authorize.net Webseite besuchen</a>');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_OWNER', 'Kreditkarteninhaber:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_NUMBER', 'Kreditkarten-Nr.:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_CREDIT_CARD_CVC', 'Kreditkartenpr&uuml;fnummer:');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_TITLE', 'Fehler bei der Verarbeitung der Kreditkarte');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_GENERAL', 'Bitte versuchen Sie erneut. Wenn das Problem weiterhin besteht, w&auml;hlen Sie bitte eine andere Zahlungsweise.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_DECLINED', 'Ihre Kreditkarte wurde abgelehnt. Bitte versuchen Sie es mit einer anderen Karte oder w&auml;hlen Sie eine andere Zahlungsweise.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_INVALID_EXP_DATE', 'Das G&uuml;ltigkeitsdatum der Kreditkarte ist falsch. Bitte &uuml;berpr&uuml;fen Sie die Kreditkarteninformationen.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_EXPIRED', 'Die Kreditkarte ist abgelaufen. Bitte versuchen Sie es erneut mit einer anderen Karte oder Zahlungsweise.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_AIM_ERROR_CVC', 'Die Kreditkartenpr&uuml;fnummer ist ung&uuml;ltig. Bitte &uuml;berpr&uuml;fen Sie die Kreditkarteninformationen und versuchen Sie es erneut');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/authorizenet_cc_sim.php 2.3.1.src/includes/languages/german/modules/payment/authorizenet_cc_sim.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/authorizenet_cc_sim.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/authorizenet_cc_sim.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: authorizenet_cc_sim.php 1793 2008-01-11 13:48:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_TITLE', 'Authorize.net Credit Card SIM');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_PUBLIC_TITLE', 'Kreditkarte (verarbeitet durch Authorize.net)');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.authorize.net" target="_blank" style="text-decoration: underline; font-weight: bold;">Authorize.net Webseite besuchen</a>');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_TITLE', 'Fehler bei der Verarbeitung der Kreditkarte');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_VERIFICATION', 'Die Kreditkartentransaktion konnte nicht mit dieser Bestellung verifiziert werden. Bitte versuchen Sie erneut. Wenn das Problem weiterhin besteht, w&auml;hlen Sie bitte eine andere Zahlungsweise.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_DECLINED', 'Die Kreditkartentransaktion wurde abgelehnt. Bitte versuchen Sie erneut. Wenn das Problem weiterhin besteht, w&auml;hlen Sie bitte eine andere Zahlungsweise.');
-  define('MODULE_PAYMENT_AUTHORIZENET_CC_SIM_ERROR_GENERAL', 'Bitte versuchen Sie erneut. Wenn das Problem weiterhin besteht, w&auml;hlen Sie bitte eine andere Zahlungsweise.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/cc.php 2.3.1.src/includes/languages/german/modules/payment/cc.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: cc.php 1793 2008-01-11 13:48:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_CC_TEXT_TITLE', 'Kreditkarte (Nicht Einsatzf&auml;hig)');
-  define('MODULE_PAYMENT_CC_TEXT_PUBLIC_TITLE', 'Kreditkarte');
-  define('MODULE_PAYMENT_CC_TEXT_DESCRIPTION', 'Dieser Modul speichert die Kartennummer ohne Verschl&uuml;sselung in die Datenbank und ist im Einsatz nicht geeignet.<br><br>Kreditkarten Test Info:<br><br>CC#: 4111111111111111<br>G&uuml;ltig bis: Any');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_OWNER', 'Kreditkarteninhaber:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_NUMBER', 'Kreditkarten-Nr.:');
-  define('MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_CC_TEXT_ERROR', 'Fehler bei der &Uuml;berp&uuml;fung der Kreditkarte!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/chronopay.php 2.3.1.src/includes/languages/german/modules/payment/chronopay.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/chronopay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/chronopay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: chronopay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_TITLE', 'ChronoPay');
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_PUBLIC_TITLE', 'Kreditkarte');
-  define('MODULE_PAYMENT_CHRONOPAY_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.chronopay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">ChronoPay Webseite besuchen</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/cod.php 2.3.1.src/includes/languages/german/modules/payment/cod.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/cod.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/cod.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: cod.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_COD_TEXT_TITLE', 'Nachnahme');
-  define('MODULE_PAYMENT_COD_TEXT_DESCRIPTION', 'Nachnahme');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/ipayment_cc.php 2.3.1.src/includes/languages/german/modules/payment/ipayment_cc.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/ipayment_cc.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/ipayment_cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: ipayment_cc.php 1811 2008-01-13 12:25:10Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_TITLE', 'iPayment');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_PUBLIC_TITLE', 'Kreditkarte');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.ipayment.de" target="_blank" style="text-decoration: underline; font-weight: bold;">iPayment Webseite besuchen</a>');
-  define('MODULE_PAYMENT_IPAYMENT_CC_ERROR_HEADING', 'Folgender Fehler wurde von iPayment w&auml;hrend des Prozesses gemeldet:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_ERROR_MESSAGE', 'Bitte kontrollieren Sie die Daten Ihrer Kreditkarte!');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_OWNER', 'Kreditkarteninhaber');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_NUMBER', 'Kreditkarten-Nr.:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_IPAYMENT_CC_TEXT_CREDIT_CARD_CHECKNUMBER', 'Karten-Pr&uuml;fnummer');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/moneyorder.php 2.3.1.src/includes/languages/german/modules/payment/moneyorder.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/moneyorder.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/moneyorder.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: moneyorder.php 1797 2008-01-11 14:55:19Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_TITLE', 'Scheck/Vorkasse');
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_DESCRIPTION', 'Zahlbar an:&nbsp;' . MODULE_PAYMENT_MONEYORDER_PAYTO . '<br>Adressat:<br><br>' . nl2br(STORE_NAME_ADDRESS) . '<br><br>' . 'Ihre Bestellung wird versandt, sobald wir Ihre Zahlung erhalten haben.');
-  define('MODULE_PAYMENT_MONEYORDER_TEXT_EMAIL_FOOTER', "Zahlbar an: ". MODULE_PAYMENT_MONEYORDER_PAYTO . "\n\nAdressat:\n" . STORE_NAME_ADDRESS . "\n\n" . 'Ihre Bestellung wird versandt, sobald wir Ihre Zahlung erhalten haben.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/nochex.php 2.3.1.src/includes/languages/german/modules/payment/nochex.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/nochex.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/nochex.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: nochex.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_NOCHEX_TEXT_TITLE', 'NOCHEX');
-  define('MODULE_PAYMENT_NOCHEX_TEXT_DESCRIPTION', 'NOCHEX<br>Erfordert die W&auml;hrung GBP.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_direct.php 2.3.1.src/includes/languages/german/modules/payment/paypal_direct.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/paypal_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: paypal_direct.php 1801 2008-01-11 16:49:20Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (US) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_PUBLIC_TITLE', 'Kredit- oder Debitkarte (Sichere Bezahlung durch PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_DESCRIPTION', '<b>Hinweis: PayPal ben&ouml;tigt die Aktivierung des PayPal Express Checkout Zahlungsmodul, wenn dieses Modul installiert ist.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">PayPal Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectInfo\');">(info)</a><span id="paypalDirectInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_OWNER', 'Karteninhaber:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_TYPE', 'Kartentyp:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_NUMBER', 'Kartennummer:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM', 'G&uuml;ltig von:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM_INFO', '(falls vorhanden)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_CVC', 'Kartenpr&uuml;fnummer:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER', 'Kartenausgabenummer:');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER_INFO', '(nur f&uuml;r Maestro- und Solo-Karten)');
-  define('MODULE_PAYMENT_PAYPAL_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Fehler: Alle Eingabefelder werden ben&ouml;tigt.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_express.php 2.3.1.src/includes/languages/german/modules/payment/paypal_express.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/paypal_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: paypal_express.php 1798 2008-01-11 15:40:58Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_TITLE', 'PayPal Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">PayPal Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressInfo\');">(info)</a><span id="paypalExpressInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_BUTTON', 'Express-Kauf mit PayPal');
-  define('MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_COMMENTS', 'Anmerkungen:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_standard.php 2.3.1.src/includes/languages/german/modules/payment/paypal_standard.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_standard.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/paypal_standard.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: paypal_standard.php 1797 2008-01-11 14:55:19Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_TITLE', 'PayPal Website Payments Standard');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PUBLIC_TITLE', 'PayPal');
-  define('MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">PayPal Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalStdInfo\');">(info)</a><span id="paypalStdInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_uk_direct.php 2.3.1.src/includes/languages/german/modules/payment/paypal_uk_direct.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_uk_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/paypal_uk_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,31 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_direct.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Direct Payments');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_PUBLIC_TITLE', 'Kredit- oder Debitkarte (Sichere bezahlung durch PayPal)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_DESCRIPTION', '<b>Hinweis: PayPal ben&ouml;tigt die Aktivierung des PayPal Website Payments Pro (UK) Express Checkout Zahlungsmodul, wenn dieses Modul installiert ist.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">PayPal Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalDirectUKInfo\');">(info)</a><span id="paypalDirectUKInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_OWNER', 'Karteninhaber:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_TYPE', 'Kartentyp:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_NUMBER', 'Kartennummer:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM', 'G&uuml;ltig von:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM_INFO', '(falls vorhanden)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_CVC', 'Kartenpr&uuml;fnummer:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER', 'Kartenausgabenummer:');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER_INFO', '(nur f&uuml;r Maestro- und Solo-Karten)');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ALL_FIELDS_REQUIRED', 'Fehler: Alle Eingabefelder werden ben&ouml;tigt.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_GENERAL', 'Fehler: Ein allgemeiner Fehler ist bei der Transaktion aufgetreten. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_CFG_ERROR', 'Fehler: Fehler bei der Konfiguration des Zahlungsmodul. Bitte &uuml;berpr&uuml;fen Sie Ihre Login-Daten.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ADDRESS', 'Fehler: Versandadresse, Ort, Bundesland oder Postleitzahl stimmen nicht &uuml;berein. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_DECLINED', 'Fehler: Die Transaktion wurde verweigert. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_INVALID_CREDIT_CARD', 'Fehler: Die angegebenen Kreditkarteninformationen sind ung&uuml;ltig. Bitte versuchen Sie es erneut.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_uk_express.php 2.3.1.src/includes/languages/german/modules/payment/paypal_uk_express.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/paypal_uk_express.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/paypal_uk_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_express.php 1800 2008-01-11 16:33:02Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_TITLE', 'PayPal Website Payments Pro (UK) Express Checkout');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_PUBLIC_TITLE', 'PayPal Express');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_DESCRIPTION', '<b>Hinweis: PayPal ben&ouml;tigt die Aktivierung des PayPal Website Payments Pro (UK) Direct Payments Zahlungsmodul, wenn dieses Modul installiert ist.</b><br /><br /><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.paypal.com/mrb/pal=PS2X9Q773CKG4" target="_blank" style="text-decoration: underline; font-weight: bold;">PayPal Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'paypalExpressUKInfo\');">(info)</a><span id="paypalExpressUKInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span>');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_BUTTON', 'Express-Kauf mit PayPal');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_COMMENTS', 'Anmerkungen:');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL', 'Fehler: Ein allgemeiner Fehler ist bei der Transaktion aufgetreten. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR', 'Fehler: Fehler bei der Konfiguration des Zahlungsmodul. Bitte &uuml;berpr&uuml;fen Sie Ihre Login-Daten.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_ADDRESS', 'Fehler: Versandadresse, Ort, Bundesland oder Postleitzahl stimmen nicht &uuml;berein. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_DECLINED', 'Fehler: Die Transaktion wurde verweigert. Bitte versuchen Sie es erneut.');
-  define('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED', 'Fehler: PayPal Express Checkout wurde f&uuml;r diesen H&auml;ndler deaktiviert. Bitte kontaktieren Sie den PayPal Kundenservice.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/pm2checkout.php 2.3.1.src/includes/languages/german/modules/payment/pm2checkout.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/pm2checkout.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/pm2checkout.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: pm2checkout.php 1797 2008-01-11 14:55:19Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_TITLE', '2Checkout');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_TITLE', '2Checkout');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_PUBLIC_DESCRIPTION', 'Kreditkarten und Alternativen');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.2checkout.com/2co/signup?affiliate=1255821" target="_blank" style="text-decoration: underline; font-weight: bold;">2Checkout Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'pm2checkoutInfo\');">(info)</a><span id="pm2checkoutInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kreditkarten Test Info:<br><br>CC#: 4111111111111111<br>G&uuml;ltig bis: Any');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_ERROR_MESSAGE', 'Bei der &Uuml;berp&uuml;fung Ihrer Kreditkarte ist ein Fehler aufgetreten! Bitte versuchen Sie es nochmal.');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
-  define('MODULE_PAYMENT_2CHECKOUT_TEXT_WARNING_TRANSACTION_ORDER', 'In Review: Transaction total did not match order total.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/psigate.php 2.3.1.src/includes/languages/german/modules/payment/psigate.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/psigate.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/psigate.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: psigate.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_PSIGATE_TEXT_TITLE', 'PSiGate');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_DESCRIPTION', 'Kreditkarten Test Info:<br><br>CC#: 4111111111111111<br>G&uuml;ltig bis: Any');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_OWNER', 'Kreditkarteninhaber:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_NUMBER', 'Kreditkarten-Nr.:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_CREDIT_CARD_EXPIRES', 'G&uuml;ltig bis:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_TYPE', 'Typ:');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_JS_CC_NUMBER', '* Die \'Kreditkarten-Nr.\' muss mindestens aus ' . CC_NUMBER_MIN_LENGTH . ' Zahlen bestehen.\n');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_ERROR_MESSAGE', 'Bei der &Uuml;berp&uuml;fung Ihrer Kreditkarte ist ein Fehler aufgetreten! Bitte versuchen Sie es nochmal.');
-  define('MODULE_PAYMENT_PSIGATE_TEXT_ERROR', 'Fehler bei der &Uuml;berp&uuml;fung der Kreditkarte!');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/secpay.php 2.3.1.src/includes/languages/german/modules/payment/secpay.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/secpay.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/secpay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: secpay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_SECPAY_TEXT_TITLE', 'SECPay');
-  define('MODULE_PAYMENT_SECPAY_TEXT_DESCRIPTION', 'Kreditkarten Test Info:<br><br>CC#: 4444333322221111<br>G&uuml;ltig bis: Any');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR', 'Fehler bei der &Uuml;berp&uuml;fung der Kreditkarte!');
-  define('MODULE_PAYMENT_SECPAY_TEXT_ERROR_MESSAGE', 'Bei der &Uuml;berp&uuml;fung Ihrer Kreditkarte ist ein Fehler aufgetreten! Bitte versuchen Sie es nochmal.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/sofortueberweisung_direct.php 2.3.1.src/includes/languages/german/modules/payment/sofortueberweisung_direct.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/sofortueberweisung_direct.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/sofortueberweisung_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,53 +0,0 @@
-<?php
-/*
-  $Id: sofortueberweisung_direct.php 1797 2008-01-11 14:55:19Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2006 - 2007 Henri Schmidhuber (http://www.in-solution.de)
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  if (!defined('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_STATUS')) {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<div align="center"><a href=' . tep_href_link('ext/modules/payment/sofortueberweisung/install.php', 'install=sofortueberweisung_direct', 'SSL') . '>' . tep_image('ext/modules/payment/sofortueberweisung/autoinstaller.gif', 'Autoinstaller (empfohlen)') . '</a></div><br><img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
-  } else {
-    define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="https://www.sofortueberweisung.de/cms/index.php?vpartner=21" target="_blank" style="text-decoration: underline; font-weight: bold;">Sofortberweisung Webseite besuchen</a>&nbsp;<a href="javascript:toggleDivBlock(\'sofortueberweisungInfo\');">(info)</a><span id="sofortueberweisungInfo" style="display: none;"><br><i>Bei Benutzung dieses Links erh&auml;lt osCommerce f&uuml;r eine Neukundenvermittlung einen kleinen Bonus.</i></span><br><br>Kontonummer Test Info:<br><br>BLZ#: 88888888');
-  }
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_TITLE', 'Sofortberweisung Direkt');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_PUBLIC_TITLE', 'Sofortberweisung');
-
-  // checkout_payment Informationen via Bild
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION_CHECKOUT_PAYMENT', '
-    <table border="0" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><a href="#" onclick="window.open(\'https://www.sofortueberweisung.de/cms/index.php?vpartner=21\', \'Popup\',\'toolbar=yes,status=no,menubar=no,scrollbars=yes,width=690,height=500\'); return false;">' . tep_image('ext/modules/payment/sofortueberweisung/images/sofortueberweisung.gif', 'Sofortberweisung ist der kostenlose, TV-zertifizierte Zahlungsdienst der Payment Network AG. Ihre Vorteile: keine zustzliche Registrierung, automatische Abbuchung von Ihrem Online-Bankkonto, hchste Sicherheitsstandards und sofortiger Versand von Lagerware. Fr die Bezahlung mit Sofortberweisung bentigen Sie Ihre eBanking Zugangsdaten, d.h. Bankverbindung, Kontonummer, PIN und TAN.') . '</a></td>
-      </tr>
-    </table>');
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_DESCRIPTION_CHECKOUT_CONFIRMATION', '
-    <table border="0" cellspacing="0" cellpadding="0">
-      <tr>
-        <td class="main"><p>Nach Besttigung der Bestellung werden Sie zum Zahlungssytem von Sofortberweisung weitergeleitet und knnen dort eine Online-berweisung duchfhren.</p><p>Hierfr bentigen Sie Ihre eBanking Zugangsdaten, d.h. Bankverbindung, Kontonummer, PIN und TAN. Mehr Informationen finden Sie hier: <a href="#" onclick="window.open(\'https://www.sofortueberweisung.de/cms/index.php?vpartner=21\', \'Popup\',\'toolbar=yes,status=no,menubar=no,scrollbars=yes,width=690,height=500\'); return false;">http://www.sofortueberweisung.de</a>.</p></td>
-      </tr>
-    </table>');
-
- // im Verwendungszweck werden folgende Platzhalter ersetzt:
- // {{order_date}} durch Bestelldatum
- // {{customer_id}} durch Kundennummer der Datenbank
- // {{customer_name}}  durch Kundenname
- // {{customer_company}} durch Kundenfirma
- // {{customer_email}} durch Email des Kunden
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_V_ZWECK_1', STORE_NAME);  // max 27 Zeichen
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_V_ZWECK_2', 'Nr. {{orderid}} Kd-Nr. {{customer_id}}'); // max 27 Zeichen
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_EMAIL_FOOTER', '');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_REDIRECT', 'Sie werden nun zu Sofortueberweisung.de weitergeleitet. Sollte dies nicht geschehen bitte den Button drcken');
-
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_ERROR_HEADING', 'Folgender Fehler wurde von Sofortberweisung whrend des Prozesses gemeldet:');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_ERROR_MESSAGE', 'Zahlung via Sofortberweisung ist leider nicht mglich, oder wurde auf Kundenwunsch abgebrochen. Bitte whlen sie ein andere Zahlungsweise.');
-  define('MODULE_PAYMENT_SOFORTUEBERWEISUNG_DIRECT_TEXT_CHECK_ERROR', 'Sofortberweisungs Transaktionscheck fehlgeschlagen. Bitte manuell berprfen');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/payment/worldpay_junior.php 2.3.1.src/includes/languages/german/modules/payment/worldpay_junior.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/payment/worldpay_junior.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/payment/worldpay_junior.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: worldpay_junior.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_TITLE', 'WorldPay Junior');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_PUBLIC_TITLE', 'Kreditkarte');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_DESCRIPTION', '<img src="images/icon_popup.gif" border="0">&nbsp;<a href="http://www.worldpay.com" target="_blank" style="text-decoration: underline; font-weight: bold;">WorldPay Webseite besuchen</a>');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_WARNING_DEMO_MODE', 'In Review: Transaction performed in demo mode.');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_SUCCESSFUL_TRANSACTION', 'The payment transaction has been successfully performed!');
-  define('MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_CONTINUE_BUTTON', 'Click here to continue to %s');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/shipping/flat.php 2.3.1.src/includes/languages/german/modules/shipping/flat.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/shipping/flat.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/shipping/flat.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: flat.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_FLAT_TEXT_TITLE', 'Pauschale Versandkosten');
-define('MODULE_SHIPPING_FLAT_TEXT_DESCRIPTION', 'Pauschale Versandkosten');
-define('MODULE_SHIPPING_FLAT_TEXT_WAY', '');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/shipping/item.php 2.3.1.src/includes/languages/german/modules/shipping/item.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/shipping/item.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/shipping/item.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: item.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_ITEM_TEXT_TITLE', 'Versandkosten pro St&uuml;ck');
-define('MODULE_SHIPPING_ITEM_TEXT_DESCRIPTION', 'Versandkosten pro St&uuml;ck');
-define('MODULE_SHIPPING_ITEM_TEXT_WAY', '');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/shipping/table.php 2.3.1.src/includes/languages/german/modules/shipping/table.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/shipping/table.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/shipping/table.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: table.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_TABLE_TEXT_TITLE', 'Tabellarische Versandkosten');
-define('MODULE_SHIPPING_TABLE_TEXT_DESCRIPTION', 'Tabellarische Versandkosten');
-define('MODULE_SHIPPING_TABLE_TEXT_WAY', '');
-define('MODULE_SHIPPING_TABLE_TEXT_WEIGHT', 'Gewicht');
-define('MODULE_SHIPPING_TABLE_TEXT_AMOUNT', 'Menge');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/shipping/usps.php 2.3.1.src/includes/languages/german/modules/shipping/usps.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/shipping/usps.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/shipping/usps.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: usps.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_USPS_TEXT_TITLE', 'United States Postal Service');
-define('MODULE_SHIPPING_USPS_TEXT_DESCRIPTION', 'United States Postal Service<br><br>Sie ben&ouml;tigen einen Account bei USPS unter http://www.uspsprioritymail.com/et_regcert.html um dieses Modul nutzen zu k&ouml;nnen<br><br>USPS erwartet, dass Sie <b>lbs</b> als Gewichtseinheit bei Ihren Produkten verwenden.');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_PP', 'Parcel Post');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_PM', 'Priority Mail');
-define('MODULE_SHIPPING_USPS_TEXT_OPT_EX', 'Express Mail');
-define('MODULE_SHIPPING_USPS_TEXT_ERROR', 'Es ist ein Fehler bei der Berechnung der USPS Versandkosten aufgetreten.<br>Wenn Sie USPS als Ihre gew&uuml;nschte Versandart verwenden wollen, nehmen Sie bitte Kontakt mit uns auf.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/modules/shipping/zones.php 2.3.1.src/includes/languages/german/modules/shipping/zones.php
--- 2.2rc2a.cp.src/includes/languages/german/modules/shipping/zones.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/modules/shipping/zones.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('MODULE_SHIPPING_ZONES_TEXT_TITLE', 'Versandkosten nach Zonen');
-define('MODULE_SHIPPING_ZONES_TEXT_DESCRIPTION', 'Versandkosten Zonenbasierend');
-define('MODULE_SHIPPING_ZONES_TEXT_WAY', 'Versand nach:');
-define('MODULE_SHIPPING_ZONES_TEXT_UNITS', 'kg');
-define('MODULE_SHIPPING_ZONES_INVALID_ZONE', 'Es ist kein Versand in dieses Land m&ouml;glich!');
-define('MODULE_SHIPPING_ZONES_UNDEFINED_RATE', 'Die Versandkosten k&ouml;nnen im Moment nicht berechnet werden.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/password_forgotten.php 2.3.1.src/includes/languages/german/password_forgotten.php
--- 2.2rc2a.cp.src/includes/languages/german/password_forgotten.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/password_forgotten.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-<?php
-/*
-  $Id: password_forgotten.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE_1', 'Anmelden');
-define('NAVBAR_TITLE_2', 'Passwort vergessen');
-
-define('HEADING_TITLE', 'Wie war noch mal mein Passwort?');
-
-define('TEXT_MAIN', 'Sollten Sie Ihr Passwort nicht mehr wissen, geben Sie bitte unten Ihre eMail-Adresse ein um umgehend ein neues Passwort per eMail zu erhalten.');
-
-define('TEXT_NO_EMAIL_ADDRESS_FOUND', 'Fehler: Die eingegebene eMail-Adresse ist nicht registriert. Bitte versuchen Sie es noch einmal.');
-
-define('EMAIL_PASSWORD_REMINDER_SUBJECT', STORE_NAME . ' - Ihr neues Passwort.');
-define('EMAIL_PASSWORD_REMINDER_BODY', 'ber die Adresse ' . $REMOTE_ADDR . ' haben wir eine Anfrage zur Passworterneuerung erhalten.' . "\n\n" . 'Ihr neues Passwort fr \'' . STORE_NAME . '\' lautet ab sofort:' . "\n\n" . '   %s' . "\n\n");
-
-define('SUCCESS_PASSWORD_SENT', 'Success: Ein neues Passwort wurde per eMail verschickt.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/privacy.php 2.3.1.src/includes/languages/german/privacy.php
--- 2.2rc2a.cp.src/includes/languages/german/privacy.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/privacy.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: privacy.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Privatsph&auml;re und Datenschutz');
-define('HEADING_TITLE', 'Privatsph&auml;re und Datenschutz');
-
-define('TEXT_INFORMATION', 'F&uuml;gen Sie hier Ihre Informationen &uuml;ber Privatsph&auml;re und Datenschutz ein.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/product_info.php 2.3.1.src/includes/languages/german/product_info.php
--- 2.2rc2a.cp.src/includes/languages/german/product_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/product_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-<?php
-/*
-  $Id: product_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('TEXT_PRODUCT_NOT_FOUND', 'Produkt wurde nicht gefunden!');
-define('TEXT_CURRENT_REVIEWS', 'Aktuelle Meinungen:');
-define('TEXT_MORE_INFORMATION', 'F&uuml;r weitere Informationen, besuchen Sie bitte die <a href="%s" target="_blank"><u>Homepage</u></a> zu diesem Produkt.');
-define('TEXT_DATE_ADDED', 'Dieses Produkt haben wir am %s in unseren Katalog aufgenommen.');
-define('TEXT_DATE_AVAILABLE', '<font color="#ff0000">Dieses Produkt wird voraussichtlich ab dem %s wieder vorr&auml;tig sein.</font>');
-define('TEXT_ALSO_PURCHASED_PRODUCTS', 'Kunden, die dieses Produkt gekauft haben, haben auch folgende Produkte gekauft:');
-define('TEXT_PRODUCT_OPTIONS', 'Optionen:');
-define('TEXT_CLICK_TO_ENLARGE', 'F&uuml;r eine gr&ouml;ssere Darstellung<br>klicken Sie auf das Bild.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/product_reviews_info.php 2.3.1.src/includes/languages/german/product_reviews_info.php
--- 2.2rc2a.cp.src/includes/languages/german/product_reviews_info.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/product_reviews_info.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-<?php
-/*
-  $Id: product_reviews_info.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Meinungen');
-define('HEADING_TITLE', 'Meinung zu \'%s\'');
-define('SUB_TITLE_PRODUCT', 'Produkt:');
-define('SUB_TITLE_FROM', 'Autor:');
-define('SUB_TITLE_DATE', 'Datum:');
-define('SUB_TITLE_REVIEW', 'Meinung:');
-define('SUB_TITLE_RATING', 'Bewertung:');
-define('TEXT_OF_5_STARS', '%s von 5 Sternen!');
-define('TEXT_CLICK_TO_ENLARGE', 'F&uuml;r eine gr&ouml;ssere Darstellung<br>klicken Sie auf das Bild.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/product_reviews.php 2.3.1.src/includes/languages/german/product_reviews.php
--- 2.2rc2a.cp.src/includes/languages/german/product_reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/product_reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,18 +0,0 @@
-<?php
-/*
-  $Id: product_reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Meinungen');
-
-define('TEXT_CLICK_TO_ENLARGE', 'F&uuml;r eine gr&ouml;ssere Darstellung<br>klicken Sie auf das Bild.');
-
-define('TEXT_OF_5_STARS', '%s von 5 Sternen!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/product_reviews_write.php 2.3.1.src/includes/languages/german/product_reviews_write.php
--- 2.2rc2a.cp.src/includes/languages/german/product_reviews_write.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/product_reviews_write.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,24 +0,0 @@
-<?php
-/*
-  $Id: product_reviews_write.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Meinungen');
-
-define('SUB_TITLE_FROM', 'Autor:');
-define('SUB_TITLE_REVIEW', 'Ihre Meinung:');
-define('SUB_TITLE_RATING', 'Bewertung:');
-
-define('TEXT_NO_HTML', '<small><font color="#ff0000"><b>ACHTUNG:</b></font></small>&nbsp;HTML wird nicht unterst&uuml;tzt!');
-define('TEXT_BAD', '<small><font color="#ff0000"><b>SCHLECHT</b></font></small>');
-define('TEXT_GOOD', '<small><font color="#ff0000"><b>SEHR GUT</b></font></small>');
-
-define('TEXT_CLICK_TO_ENLARGE', 'F&uuml;r eine gr&ouml;ssere Darstellung<br>klicken Sie auf das Bild.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/products_new.php 2.3.1.src/includes/languages/german/products_new.php
--- 2.2rc2a.cp.src/includes/languages/german/products_new.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/products_new.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-<?php
-/*
-  $Id: products_new.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Neue Produkte');
-define('HEADING_TITLE', 'Neue Produkte');
-
-define('TEXT_DATE_ADDED', 'aufgenommen am:');
-define('TEXT_MANUFACTURER', 'Hersteller:');
-define('TEXT_PRICE', 'Preis:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/reviews.php 2.3.1.src/includes/languages/german/reviews.php
--- 2.2rc2a.cp.src/includes/languages/german/reviews.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/reviews.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-<?php
-/*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Meinungen');
-define('HEADING_TITLE', 'Was sagen die Anderen?');
-define('TEXT_OF_5_STARS', '%s von 5 Sternen!');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/shipping.php 2.3.1.src/includes/languages/german/shipping.php
--- 2.2rc2a.cp.src/includes/languages/german/shipping.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/shipping.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-<?php
-/*
-  $Id: shipping.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Liefer- und Versandkosten');
-define('HEADING_TITLE', 'Liefer- und Versandkosten');
-
-define('TEXT_INFORMATION', 'F&uuml;gen Sie hier Ihre Informationen &uuml;ber Liefer- und Versandkosten ein.');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/shopping_cart.php 2.3.1.src/includes/languages/german/shopping_cart.php
--- 2.2rc2a.cp.src/includes/languages/german/shopping_cart.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,28 +0,0 @@
-<?php
-/*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Warenkorb');
-define('HEADING_TITLE', 'Ihr Warenkorb enth&auml;lt :');
-define('TABLE_HEADING_REMOVE', 'Entfernen');
-define('TABLE_HEADING_QUANTITY', 'Anzahl');
-define('TABLE_HEADING_MODEL', 'Artikelnr.');
-define('TABLE_HEADING_PRODUCTS', 'Artikel');
-define('TABLE_HEADING_TOTAL', 'Summe');
-define('TEXT_CART_EMPTY', 'Sie haben noch nichts in Ihrem Warenkorb.');
-define('SUB_TITLE_SUB_TOTAL', 'Zwischensumme:');
-define('SUB_TITLE_TOTAL', 'Summe:');
-
-define('OUT_OF_STOCK_CANT_CHECKOUT', 'Die mit ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' markierten Produkte, sind leider nicht in der von Ihnen gew&uuml;nschten Menge auf Lager.<br>Bitte reduzieren Sie Ihre Bestellmenge f&uuml;r die gekennzeichneten Produkte, vielen Dank');
-define('OUT_OF_STOCK_CAN_CHECKOUT', 'Die mit ' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . ' markierten Produkte, sind leider nicht in der von Ihnen gew&uuml;nschten Menge auf Lager.<br>Die bestellte Menge wird kurzfristig von uns geliefert, wenn Sie es w&uuml;nschen nehmen wir auch eine Teillieferung vor.');
-
-define('TEXT_ALTERNATIVE_CHECKOUT_METHODS', '- ODER -');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/specials.php 2.3.1.src/includes/languages/german/specials.php
--- 2.2rc2a.cp.src/includes/languages/german/specials.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/specials.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-<?php
-/*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2002 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Angebote');
-define('HEADING_TITLE', 'Unsere Sonderangebote:');
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/ssl_check.php 2.3.1.src/includes/languages/german/ssl_check.php
--- 2.2rc2a.cp.src/includes/languages/german/ssl_check.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/ssl_check.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,20 +0,0 @@
-<?php
-/*
-  $Id: ssl_check.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Sicherheitshinweis');
-define('HEADING_TITLE', 'Sicherheitshinweis');
-
-define('TEXT_INFORMATION', 'Unsere Sicherheits&uuml;berpr&uuml;fung hat ergeben, dass der Ihrerseits verwendete Browser die SSL-Session-Id w&auml;hrend Ihres Besuches gewechselt hat.<br><br>Aus Sicherheitsgr&uuml;nden bitten wir Sie sich noch einmal anzumelden.<br><br>Manche Browser, z.B. Konqueror 3.1, k&ouml;nnen die  Secure SSL Session-Id nicht automatisch erzeugen - dies ist jedoch bei uns Voraussetzung. Wenn Sein einen solchen Browser verwenden, bitten wir SIe netweder eine aktualisierte Version zu installieren oder einen anderen Browser zu verwenden. Zum Beipiel  <a href="http://www.microsoft.com/ie/" target="_blank">Microsoft Internet Explorer</a>, <a href="http://channels.netscape.com/ns/browsers/download_other.jsp" target="_blank">Netscape</a>, oderr <a href="http://www.mozilla.org/releases/" target="_blank">Mozilla</a>. Nach diesem Update sollten sie problemlos bei euns einkaufen k&ouml;nnen, mit der Gewissheit auf der sicheren Seite zu sein.<br><br>Diese Sicherheitsmassnahme dient Ihrer Sicherheit. Sollten Sie trotzdem Probleme haben, bitten wir um Entschuldigung und bieten Ihnen gerne an, mit uns Kontakt aufzunehmen.');
-
-define('BOX_INFORMATION_HEADING', 'Privatsph&auml;re und Sicherheit');
-define('BOX_INFORMATION', 'Die von Ihrem Browser erzeugte SSL-Session ID wird von uns bei jedem Zugriff auf eine sichere Seite &Uuml;berpr&uuml;ft.<br><br>Diese &Uuml;berpr&uuml;fung garantiert, dass der Zugriff tatschlich von Ihrem Browser erfolgte und nicht von einem anderen Browser stammt.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german/tell_a_friend.php 2.3.1.src/includes/languages/german/tell_a_friend.php
--- 2.2rc2a.cp.src/includes/languages/german/tell_a_friend.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german/tell_a_friend.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,37 +0,0 @@
-<?php
-/*
-  $Id: tell_a_friend.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-define('NAVBAR_TITLE', 'Produkt weiterempfehlen');
-
-define('HEADING_TITLE', 'Empfehlen Sie \'%s\' weiter');
-
-define('FORM_TITLE_CUSTOMER_DETAILS', 'Ihre Angaben');
-define('FORM_TITLE_FRIEND_DETAILS', 'Angaben Ihres Freundes');
-define('FORM_TITLE_FRIEND_MESSAGE', 'Ihre Nachricht (wird mit der Empfehlung versendet)');
-
-define('FORM_FIELD_CUSTOMER_NAME', 'Ihr Name:');
-define('FORM_FIELD_CUSTOMER_EMAIL', 'Ihre eMail-Adresse:');
-define('FORM_FIELD_FRIEND_NAME', 'Name Ihres Freundes:');
-define('FORM_FIELD_FRIEND_EMAIL', 'eMail-Adresse Ihres Freundes:');
-
-define('TEXT_EMAIL_SUCCESSFUL_SENT', 'Ihre eMail &uuml;ber <b>%s</b> wurde gesendet an <b>%s</b>.');
-
-define('TEXT_EMAIL_SUBJECT', 'Ihr Freund %s, hat dieses Produkt gefunden, und zwar hier: %s');
-define('TEXT_EMAIL_INTRO', 'Hallo %s!' . "\n\n" . 'Ihr Freund, %s, hat dieses Produkt %s bei %s gefunden.');
-define('TEXT_EMAIL_LINK', 'Um das Produkt anzusehen, klicken Sie bitte auf den Link oder kopieren diesen und fgen Sie ihn in der Adress-Zeile Ihres Browsers ein:' . "\n\n" . '%s');
-define('TEXT_EMAIL_SIGNATURE', 'Mit freundlichen Grssen,' . "\n\n" . '%s');
-
-define('ERROR_TO_NAME', 'Fehler: Der Empf&auml;ngername darf nicht leer sein.');
-define('ERROR_TO_ADDRESS', 'Fehler: Die Empf&auml;nger-Email-Adresse darf nicht leer sein.');
-define('ERROR_FROM_NAME', 'Fehler: Der Absendername (Ihr Name) muss angegeben werden.');
-define('ERROR_FROM_ADDRESS', 'Fehler: Die Absenderadresse muss eine g&uuml;ltige Mail-Adresse sein.');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/languages/german.php 2.3.1.src/includes/languages/german.php
--- 2.2rc2a.cp.src/includes/languages/german.php	2008-01-31 16:34:13.000000000 -0600
+++ 2.3.1.src/includes/languages/german.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,318 +0,0 @@
-<?php
-/*
-  $Id: german.php 1743 2007-12-20 18:02:36Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-// look in your $PATH_LOCALE/locale directory for available locales
-// or type locale -a on the server.
-// Examples:
-// on RedHat try 'de_DE'
-// on FreeBSD try 'de_DE.ISO_8859-1'
-// on Windows try 'de' or 'German'
-@setlocale(LC_TIME, 'de_DE.ISO_8859-1');
-
-define('DATE_FORMAT_SHORT', '%d.%m.%Y');  // this is used for strftime()
-define('DATE_FORMAT_LONG', '%A, %d. %B %Y'); // this is used for strftime()
-define('DATE_FORMAT', 'd.m.Y');  // this is used for strftime()
-define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
-
-////
-// Return date in raw format
-// $date should be in format mm/dd/yyyy
-// raw date is in format YYYYMMDD, or DDMMYYYY
-function tep_date_raw($date, $reverse = false) {
-  if ($reverse) {
-    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
-  } else {
-    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
-  }
-}
-
-// if USE_DEFAULT_LANGUAGE_CURRENCY is true, use the following currency, instead of the applications default currency (used when changing language)
-define('LANGUAGE_CURRENCY', 'EUR');
-
-// Global entries for the <html> tag
-define('HTML_PARAMS','dir="LTR" lang="de"');
-
-// charset for web pages and emails
-define('CHARSET', 'iso-8859-1');
-
-// page title
-define('TITLE', STORE_NAME);
-
-// header text in includes/header.php
-define('HEADER_TITLE_CREATE_ACCOUNT', 'Neues Konto');
-define('HEADER_TITLE_MY_ACCOUNT', 'Ihr Konto');
-define('HEADER_TITLE_CART_CONTENTS', 'Warenkorb');
-define('HEADER_TITLE_CHECKOUT', 'Kasse');
-define('HEADER_TITLE_TOP', 'Startseite');
-define('HEADER_TITLE_CATALOG', 'Katalog');
-define('HEADER_TITLE_LOGOFF', 'Abmelden');
-define('HEADER_TITLE_LOGIN', 'Anmelden');
-
-// footer text in includes/footer.php
-define('FOOTER_TEXT_REQUESTS_SINCE', 'Zugriffe seit');
-
-// text for gender
-define('MALE', 'Herr');
-define('FEMALE', 'Frau');
-define('MALE_ADDRESS', 'Herr');
-define('FEMALE_ADDRESS', 'Frau');
-
-// text for date of birth example
-define('DOB_FORMAT_STRING', 'tt.mm.jjjj');
-
-// categories box text in includes/boxes/categories.php
-define('BOX_HEADING_CATEGORIES', 'Kategorien');
-
-// manufacturers box text in includes/boxes/manufacturers.php
-define('BOX_HEADING_MANUFACTURERS', 'Hersteller');
-
-// whats_new box text in includes/boxes/whats_new.php
-define('BOX_HEADING_WHATS_NEW', 'Neue Produkte');
-
-// quick_find box text in includes/boxes/quick_find.php
-define('BOX_HEADING_SEARCH', 'Schnellsuche');
-define('BOX_SEARCH_TEXT', 'Verwenden Sie Stichworte, um ein Produkt zu finden.');
-define('BOX_SEARCH_ADVANCED_SEARCH', 'erweiterte Suche');
-
-// specials box text in includes/boxes/specials.php
-define('BOX_HEADING_SPECIALS', 'Angebote');
-
-// reviews box text in includes/boxes/reviews.php
-define('BOX_HEADING_REVIEWS', 'Bewertungen');
-define('BOX_REVIEWS_WRITE_REVIEW', 'Bewerten Sie dieses Produkt!');
-define('BOX_REVIEWS_NO_REVIEWS', 'Es liegen noch keine Bewertungen vor');
-define('BOX_REVIEWS_TEXT_OF_5_STARS', '%s von 5 Sternen!');
-
-// shopping_cart box text in includes/boxes/shopping_cart.php
-define('BOX_HEADING_SHOPPING_CART', 'Warenkorb');
-define('BOX_SHOPPING_CART_EMPTY', '0 Produkte');
-
-// order_history box text in includes/boxes/order_history.php
-define('BOX_HEADING_CUSTOMER_ORDERS', 'Bestell&uuml;bersicht');
-
-// best_sellers box text in includes/boxes/best_sellers.php
-define('BOX_HEADING_BESTSELLERS', 'Bestseller');
-define('BOX_HEADING_BESTSELLERS_IN', 'Bestseller<br>&nbsp;&nbsp;');
-
-// notifications box text in includes/boxes/products_notifications.php
-define('BOX_HEADING_NOTIFICATIONS', 'Benachrichtigungen');
-define('BOX_NOTIFICATIONS_NOTIFY', 'Benachrichtigen Sie mich &uuml;ber Aktuelles zu diesem Artikel <b>%s</b>');
-define('BOX_NOTIFICATIONS_NOTIFY_REMOVE', 'Benachrichtigen Sie mich nicht mehr zu diesem Artikel <b>%s</b>');
-
-// manufacturer box text
-define('BOX_HEADING_MANUFACTURER_INFO', 'Hersteller Info');
-define('BOX_MANUFACTURER_INFO_HOMEPAGE', '%s Homepage');
-define('BOX_MANUFACTURER_INFO_OTHER_PRODUCTS', 'Mehr Produkte');
-
-// languages box test in includes/boxes/languages.php
-define('BOX_HEADING_LANGUAGES', 'Sprachen');
-
-// currencies box text in includes/boxes/currencies.php
-define('BOX_HEADING_CURRENCIES', 'W&auml;hrungen');
-
-// information box text in includes/boxes/information.php
-define('BOX_HEADING_INFORMATION', 'Informationen');
-define('BOX_INFORMATION_PRIVACY', 'Privatsph&auml;re<br>&nbsp;und Datenschutz');
-define('BOX_INFORMATION_CONDITIONS', 'Unsere AGB\'s');
-define('BOX_INFORMATION_SHIPPING', 'Liefer- und<br>&nbsp;Versandkosten');
-define('BOX_INFORMATION_CONTACT', 'Kontakt');
-
-// tell a friend box text in includes/boxes/tell_a_friend.php
-define('BOX_HEADING_TELL_A_FRIEND', 'Weiterempfehlen');
-define('BOX_TELL_A_FRIEND_TEXT', 'Empfehlen Sie diesen Artikel einfach per eMail weiter.');
-
-// checkout procedure text
-define('CHECKOUT_BAR_DELIVERY', 'Versandinformationen');
-define('CHECKOUT_BAR_PAYMENT', 'Zahlungsweise');
-define('CHECKOUT_BAR_CONFIRMATION', 'Best&auml;tigung');
-define('CHECKOUT_BAR_FINISHED', 'Fertig!');
-
-// pull down default text
-define('PULL_DOWN_DEFAULT', 'Bitte w&auml;hlen');
-define('TYPE_BELOW', 'bitte unten eingeben');
-
-// javascript messages
-define('JS_ERROR', 'Notwendige Angaben fehlen!\nBitte richtig ausf&uml;llen.\n\n');
-
-define('JS_REVIEW_TEXT', '* Der Text muss mindestens aus ' . REVIEW_TEXT_MIN_LENGTH . ' Buchstaben bestehen.\n');
-define('JS_REVIEW_RATING', '* Geben Sie Ihre Bewertung ein.\n');
-
-define('JS_ERROR_NO_PAYMENT_MODULE_SELECTED', '* Bitte whlen Sie eine Zahlungsweise fr Ihre Bestellung.\n');
-
-define('JS_ERROR_SUBMITTED', 'Diese Seite wurde bereits besttigt. Bettigen Sie bitte OK und warten bis der Prozess durchgefhrt wurde.');
-
-define('ERROR_NO_PAYMENT_MODULE_SELECTED', 'Bitte whlen Sie eine Zahlungsweise fr Ihre Bestellung.');
-
-define('CATEGORY_COMPANY', 'Firmendaten');
-define('CATEGORY_PERSONAL', 'Ihre pers&ouml;nlichen Daten');
-define('CATEGORY_ADDRESS', 'Ihre Adresse');
-define('CATEGORY_CONTACT', 'Ihre Kontaktinformationen');
-define('CATEGORY_OPTIONS', 'Optionen');
-define('CATEGORY_PASSWORD', 'Ihr Passwort');
-
-define('ENTRY_COMPANY', 'Firmenname:');
-define('ENTRY_COMPANY_ERROR', '');
-define('ENTRY_COMPANY_TEXT', '');
-define('ENTRY_GENDER', 'Anrede:');
-define('ENTRY_GENDER_ERROR', 'Bitte das Geschlecht angeben.');
-define('ENTRY_GENDER_TEXT', '*');
-define('ENTRY_FIRST_NAME', 'Vorname:');
-define('ENTRY_FIRST_NAME_ERROR', 'Der Vorname sollte mindestens ' . ENTRY_FIRST_NAME_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_FIRST_NAME_TEXT', '*');
-define('ENTRY_LAST_NAME', 'Nachname:');
-define('ENTRY_LAST_NAME_ERROR', 'Der Nachname sollte mindestens ' . ENTRY_LAST_NAME_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_LAST_NAME_TEXT', '*');
-define('ENTRY_DATE_OF_BIRTH', 'Geburtsdatum:');
-define('ENTRY_DATE_OF_BIRTH_ERROR', 'Bitte geben Sie Ihr Geburtsdatum in folgendem Format ein: TT.MM.JJJJ (z.B. 21.05.1970)');
-define('ENTRY_DATE_OF_BIRTH_TEXT', '* (z.B. 21.05.1970)');
-define('ENTRY_EMAIL_ADDRESS', 'eMail-Adresse:');
-define('ENTRY_EMAIL_ADDRESS_ERROR', 'Die eMail Adresse sollte mindestens ' . ENTRY_EMAIL_ADDRESS_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_EMAIL_ADDRESS_CHECK_ERROR', 'Die eMail Adresse scheint nicht gltig zu sein - bitte korrigieren.');
-define('ENTRY_EMAIL_ADDRESS_ERROR_EXISTS', 'Die eMail Adresse ist bereits gespeichert - bitte melden Sie sich mit dieser Adresse an oder erffnen Sie ein neues Konto mit einer anderen Adresse.');
-define('ENTRY_EMAIL_ADDRESS_TEXT', '*');
-define('ENTRY_STREET_ADDRESS', 'Strasse/Nr.:');
-define('ENTRY_STREET_ADDRESS_ERROR', 'Die Strassenadresse sollte mindestens ' . ENTRY_STREET_ADDRESS_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_STREET_ADDRESS_TEXT', '*');
-define('ENTRY_SUBURB', 'Stadtteil:');
-define('ENTRY_SUBURB_ERROR', '');
-define('ENTRY_SUBURB_TEXT', '');
-define('ENTRY_POST_CODE', 'Postleitzahl:');
-define('ENTRY_POST_CODE_ERROR', 'Die Postleitzahl sollte mindestens ' . ENTRY_POSTCODE_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_POST_CODE_TEXT', '*');
-define('ENTRY_CITY', 'Ort:');
-define('ENTRY_CITY_ERROR', 'Die Stadt sollte mindestens ' . ENTRY_CITY_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_CITY_TEXT', '*');
-define('ENTRY_STATE', 'Bundesland:');
-define('ENTRY_STATE_ERROR', 'Das Bundesland sollte mindestens ' . ENTRY_STATE_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_STATE_ERROR_SELECT', 'Bitte whlen Sie ein Bundesland aus der Liste.');
-define('ENTRY_STATE_TEXT', '*');
-define('ENTRY_COUNTRY', 'Land:');
-define('ENTRY_COUNTRY_ERROR', 'Bitte whlen Sie ein Land aus der Liste.');
-define('ENTRY_COUNTRY_TEXT', '*');
-define('ENTRY_TELEPHONE_NUMBER', 'Telefonnummer:');
-define('ENTRY_TELEPHONE_NUMBER_ERROR', 'Die Telefonnummer sollte mindestens ' . ENTRY_TELEPHONE_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_TELEPHONE_NUMBER_TEXT', '*');
-define('ENTRY_FAX_NUMBER', 'Telefaxnummer:');
-define('ENTRY_FAX_NUMBER_ERROR', '');
-define('ENTRY_FAX_NUMBER_TEXT', '');
-define('ENTRY_NEWSLETTER', 'Newsletter:');
-define('ENTRY_NEWSLETTER_TEXT', '');
-define('ENTRY_NEWSLETTER_YES', 'abonniert');
-define('ENTRY_NEWSLETTER_NO', 'nicht abonniert');
-define('ENTRY_NEWSLETTER_ERROR', '');
-define('ENTRY_PASSWORD', 'Passwort:');
-define('ENTRY_PASSWORD_ERROR', 'Das Passwort sollte mindestens ' . ENTRY_PASSWORD_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_PASSWORD_ERROR_NOT_MATCHING', 'Beide eingegebenen Passwrter mssen identisch sein.');
-define('ENTRY_PASSWORD_TEXT', '*');
-define('ENTRY_PASSWORD_CONFIRMATION', 'Best&auml;tigung:');
-define('ENTRY_PASSWORD_CONFIRMATION_TEXT', '*');
-define('ENTRY_PASSWORD_CURRENT', 'Current Password:');
-define('ENTRY_PASSWORD_CURRENT_TEXT', '*');
-define('ENTRY_PASSWORD_CURRENT_ERROR', 'Das Passwort sollte mindestens ' . ENTRY_PASSWORD_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_PASSWORD_NEW', 'New Password:');
-define('ENTRY_PASSWORD_NEW_TEXT', '*');
-define('ENTRY_PASSWORD_NEW_ERROR', 'Das neue Passwort sollte mindestens ' . ENTRY_PASSWORD_MIN_LENGTH . ' Zeichen enthalten.');
-define('ENTRY_PASSWORD_NEW_ERROR_NOT_MATCHING', 'Die Passwort-Besttigung muss mit Ihrem neuen Passwort bereinstimmen.');
-define('PASSWORD_HIDDEN', '--VERSTECKT--');
-
-define('FORM_REQUIRED_INFORMATION', '* Notwendige Eingabe');
-
-// constants for use in tep_prev_next_display function
-define('TEXT_RESULT_PAGE', 'Seiten:');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS', 'angezeigte Produkte: <b>%d</b> bis <b>%d</b> (von <b>%d</b> insgesamt)');
-define('TEXT_DISPLAY_NUMBER_OF_ORDERS', 'angezeigte Bestellungen: <b>%d</b> bis <b>%d</b> (von <b>%d</b> insgesamt)');
-define('TEXT_DISPLAY_NUMBER_OF_REVIEWS', 'angezeigte Meinungen: <b>%d</b> bis <b>%d</b> (von <b>%d</b> insgesamt)');
-define('TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW', 'angezeigte neue Produkte: <b>%d</b> bis <b>%d</b> (von <b>%d</b> insgesamt)');
-define('TEXT_DISPLAY_NUMBER_OF_SPECIALS', 'angezeigte Angebote <b>%d</b> bis <b>%d</b> (von <b>%d</b> insgesamt)');
-
-define('PREVNEXT_TITLE_FIRST_PAGE', 'erste Seite');
-define('PREVNEXT_TITLE_PREVIOUS_PAGE', 'vorherige Seite');
-define('PREVNEXT_TITLE_NEXT_PAGE', 'n&auml;chste Seite');
-define('PREVNEXT_TITLE_LAST_PAGE', 'letzte Seite');
-define('PREVNEXT_TITLE_PAGE_NO', 'Seite %d');
-define('PREVNEXT_TITLE_PREV_SET_OF_NO_PAGE', 'Vorhergehende %d Seiten');
-define('PREVNEXT_TITLE_NEXT_SET_OF_NO_PAGE', 'N&auml;chste %d Seiten');
-define('PREVNEXT_BUTTON_FIRST', '&lt;&lt;ERSTE');
-define('PREVNEXT_BUTTON_PREV', '[&lt;&lt;&nbsp;vorherige]');
-define('PREVNEXT_BUTTON_NEXT', '[n&auml;chste&nbsp;&gt;&gt;]');
-define('PREVNEXT_BUTTON_LAST', 'LETZTE&gt;&gt;');
-
-define('IMAGE_BUTTON_ADD_ADDRESS', 'Neue Adresse');
-define('IMAGE_BUTTON_ADDRESS_BOOK', 'Adressbuch');
-define('IMAGE_BUTTON_BACK', 'Zurck');
-define('IMAGE_BUTTON_BUY_NOW', 'Buy Now');
-define('IMAGE_BUTTON_CHANGE_ADDRESS', 'Adresse ndern');
-define('IMAGE_BUTTON_CHECKOUT', 'Kasse');
-define('IMAGE_BUTTON_CONFIRM_ORDER', 'Bestellung besttigen');
-define('IMAGE_BUTTON_CONTINUE', 'Weiter');
-define('IMAGE_BUTTON_CONTINUE_SHOPPING', 'Einkauf fortsetzen');
-define('IMAGE_BUTTON_DELETE', 'Lschen');
-define('IMAGE_BUTTON_EDIT_ACCOUNT', 'Daten ndern');
-define('IMAGE_BUTTON_HISTORY', 'Bestellbersicht');
-define('IMAGE_BUTTON_LOGIN', 'Anmelden');
-define('IMAGE_BUTTON_IN_CART', 'In den Warenkorb');
-define('IMAGE_BUTTON_NOTIFICATIONS', 'Benachrichtigungen');
-define('IMAGE_BUTTON_QUICK_FIND', 'Schnellsuche');
-define('IMAGE_BUTTON_REMOVE_NOTIFICATIONS', 'Benachrichtigungen lschen');
-define('IMAGE_BUTTON_REVIEWS', 'Bewertungen');
-define('IMAGE_BUTTON_SEARCH', 'Suchen');
-define('IMAGE_BUTTON_SHIPPING_OPTIONS', 'Versandoptionen');
-define('IMAGE_BUTTON_TELL_A_FRIEND', 'Weiterempfehlen');
-define('IMAGE_BUTTON_UPDATE', 'Aktualisieren');
-define('IMAGE_BUTTON_UPDATE_CART', 'Warenkorb aktualisieren');
-define('IMAGE_BUTTON_WRITE_REVIEW', 'Bewertung schreiben');
-
-define('SMALL_IMAGE_BUTTON_DELETE', 'Delete');
-define('SMALL_IMAGE_BUTTON_EDIT', 'Edit');
-define('SMALL_IMAGE_BUTTON_VIEW', 'View');
-
-define('ICON_ARROW_RIGHT', 'Zeige mehr');
-define('ICON_CART', 'In den Warenkorb');
-define('ICON_ERROR', 'Fehler');
-define('ICON_SUCCESS', 'Success');
-define('ICON_WARNING', 'Warnung');
-
-define('TEXT_GREETING_PERSONAL', 'Sch&ouml;n das Sie wieder da sind <span class="greetUser">%s!</span> M&ouml;chten Sie die <a href="%s"><u>neue Produkte</u></a> ansehen?');
-define('TEXT_GREETING_PERSONAL_RELOGON', '<small>Wenn Sie nicht %s sind, melden Sie sich bitte <a href="%s"><u>hier</u></a> mit Ihrem Kundenkonto an.</small>');
-define('TEXT_GREETING_GUEST', 'Herzlich Willkommen <span class="greetUser">Gast!</span> M&ouml;chten Sie sich <a href="%s"><u>anmelden</u></a>? Oder wollen Sie ein <a href="%s"><u>Kundenkonto</u></a> er&ouml;ffnen?');
-
-define('TEXT_SORT_PRODUCTS', 'Sortierung der Artikel ist ');
-define('TEXT_DESCENDINGLY', 'absteigend');
-define('TEXT_ASCENDINGLY', 'aufsteigend');
-define('TEXT_BY', ' nach ');
-
-define('TEXT_REVIEW_BY', 'von %s');
-define('TEXT_REVIEW_WORD_COUNT', '%s Worte');
-define('TEXT_REVIEW_RATING', 'Bewertung: %s [%s]');
-define('TEXT_REVIEW_DATE_ADDED', 'Datum hinzugef&uuml;gt: %s');
-define('TEXT_NO_REVIEWS', 'Es liegen noch keine Bewertungen vor.');
-
-define('TEXT_NO_NEW_PRODUCTS', 'Zur Zeit gibt es keine neuen Produkte.');
-
-define('TEXT_UNKNOWN_TAX_RATE', 'Unbekannter Steuersatz');
-
-define('TEXT_REQUIRED', '<span class="errorText">erforderlich</span>');
-
-define('ERROR_TEP_MAIL', '<font face="Verdana, Arial" size="2" color="#ff0000"><b><small>Fehler:</small> Die eMail kann nicht &uuml;ber den angegebenen SMTP-Server verschickt werden. Bitte kontrollieren Sie die Einstellungen in der php.ini Datei und f&uuml;hren Sie notwendige Korrekturen durch!</b></font>');
-define('WARNING_INSTALL_DIRECTORY_EXISTS', 'Warnung: Das Installationverzeichnis ist noch vorhanden auf: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/install. Bitte l&ouml;schen Sie das Verzeichnis aus Gr&uuml;nden der Sicherheit!');
-define('WARNING_CONFIG_FILE_WRITEABLE', 'Warnung: osC kann in die Konfigurationsdatei schreiben: ' . dirname($HTTP_SERVER_VARS['SCRIPT_FILENAME']) . '/includes/configure.php. Das stellt ein m&ouml;gliches Sicherheitsrisiko dar - bitte korrigieren Sie die Benutzerberechtigungen zu dieser Datei!');
-define('WARNING_SESSION_DIRECTORY_NON_EXISTENT', 'Warnung: Das Verzeichnis f&uuml;r die Sessions existiert nicht: ' . tep_session_save_path() . '. Die Sessions werden nicht funktionieren bis das Verzeichnis erstellt wurde!');
-define('WARNING_SESSION_DIRECTORY_NOT_WRITEABLE', 'Warnung: osC kann nicht in das Sessions Verzeichnis schreiben: ' . tep_session_save_path() . '. Die Sessions werden nicht funktionieren bis die richtigen Benutzerberechtigungen gesetzt wurden!');
-define('WARNING_SESSION_AUTO_START', 'Warnung: session.auto_start ist enabled - Bitte disablen Sie dieses PHP Feature in der php.ini und starten Sie den WEB-Server neu!');
-define('WARNING_DOWNLOAD_DIRECTORY_NON_EXISTENT', 'Warnung: Das Verzeichnis fr den Artikel Download existiert nicht: ' . DIR_FS_DOWNLOAD . '. Diese Funktion wird nicht funktionieren bis das Verzeichnis erstellt wurde!');
-
-define('TEXT_CCVAL_ERROR_INVALID_DATE', 'Das "G&uuml;ltig bis" Datum ist ung&uuml;ltig. Bitte korrigieren Sie Ihre Angaben.');
-define('TEXT_CCVAL_ERROR_INVALID_NUMBER', 'Die "KreditkarteNummer", die Sie angegeben haben, ist ung&uuml;ltig. Bitte korrigieren Sie Ihre Angaben.');
-define('TEXT_CCVAL_ERROR_UNKNOWN_CARD', 'Die ersten 4 Ziffern Ihrer Kreditkarte sind: %s. Wenn diese Angaben stimmen, wird dieser Kartentyp leider nicht akzeptiert. Bitte korrigieren Sie Ihre Angaben gegebenfalls.');
-
-define('FOOTER_TEXT_BODY', 'Copyright &copy; ' . date('Y') . ' <a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . STORE_NAME . '</a><br>Powered by <a href="http://www.oscommerce.com" target="_blank">osCommerce</a>');
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/action_recorder/ar_admin_login.php 2.3.1.src/includes/modules/action_recorder/ar_admin_login.php
--- 2.2rc2a.cp.src/includes/modules/action_recorder/ar_admin_login.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/action_recorder/ar_admin_login.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,70 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ar_admin_login {
+    var $code = 'ar_admin_login';
+    var $title;
+    var $description;
+    var $sort_order = 0;
+    var $minutes = 5;
+    var $attempts = 3;
+    var $identifier;
+
+    function ar_admin_login() {
+      $this->title = MODULE_ACTION_RECORDER_ADMIN_LOGIN_TITLE;
+      $this->description = MODULE_ACTION_RECORDER_ADMIN_LOGIN_DESCRIPTION;
+
+      if ($this->check()) {
+        $this->minutes = (int)MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES;
+        $this->attempts = (int)MODULE_ACTION_RECORDER_ADMIN_LOGIN_ATTEMPTS;
+      }
+    }
+
+    function setIdentifier() {
+      $this->identifier = tep_get_ip_address();
+    }
+
+    function canPerform($user_id, $user_name) {
+      $check_query = tep_db_query("select id from " . TABLE_ACTION_RECORDER . " where module = '" . tep_db_input($this->code) . "' and (" . (!empty($user_name) ? "user_name = '" . tep_db_input($user_name) . "' or " : "") . " identifier = '" . tep_db_input($this->identifier) . "') and date_added >= date_sub(now(), interval " . (int)$this->minutes  . " minute) and success = 0 order by date_added desc limit " . (int)$this->attempts);
+      if (tep_db_num_rows($check_query) == $this->attempts) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+
+    function expireEntries() {
+      global $db_link;
+
+      tep_db_query("delete from " . TABLE_ACTION_RECORDER . " where module = '" . $this->code . "' and date_added < date_sub(now(), interval " . (int)$this->minutes  . " minute)");
+
+      return mysql_affected_rows($db_link);
+    }
+
+    function check() {
+      return defined('MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('Allowed Minutes', 'MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES', '5', 'Number of minutes to allow login attempts to occur.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('Allowed Attempts', 'MODULE_ACTION_RECORDER_ADMIN_LOGIN_ATTEMPTS', '3', 'Number of login attempts to allow within the specified period.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ACTION_RECORDER_ADMIN_LOGIN_MINUTES', 'MODULE_ACTION_RECORDER_ADMIN_LOGIN_ATTEMPTS');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/action_recorder/ar_contact_us.php 2.3.1.src/includes/modules/action_recorder/ar_contact_us.php
--- 2.2rc2a.cp.src/includes/modules/action_recorder/ar_contact_us.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/action_recorder/ar_contact_us.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ar_contact_us {
+    var $code = 'ar_contact_us';
+    var $title;
+    var $description;
+    var $sort_order = 0;
+    var $minutes = 15;
+    var $identifier;
+
+    function ar_contact_us() {
+      $this->title = MODULE_ACTION_RECORDER_CONTACT_US_TITLE;
+      $this->description = MODULE_ACTION_RECORDER_CONTACT_US_DESCRIPTION;
+
+      if ($this->check()) {
+        $this->minutes = (int)MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES;
+      }
+    }
+
+    function setIdentifier() {
+      $this->identifier = tep_get_ip_address();
+    }
+
+    function canPerform($user_id, $user_name) {
+      $check_query = tep_db_query("select date_added from " . TABLE_ACTION_RECORDER . " where module = '" . tep_db_input($this->code) . "' and (" . (!empty($user_id) ? "user_id = '" . (int)$user_id . "' or " : "") . " identifier = '" . tep_db_input($this->identifier) . "') and date_added >= date_sub(now(), interval " . (int)$this->minutes  . " minute) and success = 1 order by date_added desc limit 1");
+      if (tep_db_num_rows($check_query)) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+
+    function expireEntries() {
+      global $db_link;
+
+      tep_db_query("delete from " . TABLE_ACTION_RECORDER . " where module = '" . $this->code . "' and date_added < date_sub(now(), interval " . (int)$this->minutes  . " minute)");
+
+      return mysql_affected_rows($db_link);
+    }
+
+    function check() {
+      return defined('MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('Minimum Minutes Per E-Mail', 'MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES', '15', 'Minimum number of minutes to allow 1 e-mail to be sent (eg, 15 for 1 e-mail every 15 minutes)', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ACTION_RECORDER_CONTACT_US_EMAIL_MINUTES');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/action_recorder/ar_tell_a_friend.php 2.3.1.src/includes/modules/action_recorder/ar_tell_a_friend.php
--- 2.2rc2a.cp.src/includes/modules/action_recorder/ar_tell_a_friend.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/action_recorder/ar_tell_a_friend.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ar_tell_a_friend {
+    var $code = 'ar_tell_a_friend';
+    var $title;
+    var $description;
+    var $sort_order = 0;
+    var $minutes = 15;
+    var $identifier;
+
+    function ar_tell_a_friend() {
+      $this->title = MODULE_ACTION_RECORDER_TELL_A_FRIEND_TITLE;
+      $this->description = MODULE_ACTION_RECORDER_TELL_A_FRIEND_DESCRIPTION;
+
+      if ($this->check()) {
+        $this->minutes = (int)MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES;
+      }
+    }
+
+    function setIdentifier() {
+      $this->identifier = tep_get_ip_address();
+    }
+
+    function canPerform($user_id, $user_name) {
+      $check_query = tep_db_query("select date_added from " . TABLE_ACTION_RECORDER . " where module = '" . tep_db_input($this->code) . "' and (" . (!empty($user_id) ? "user_id = '" . (int)$user_id . "' or " : "") . " identifier = '" . tep_db_input($this->identifier) . "') and date_added >= date_sub(now(), interval " . (int)$this->minutes  . " minute) and success = 1 order by date_added desc limit 1");
+      if (tep_db_num_rows($check_query)) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+
+    function expireEntries() {
+      global $db_link;
+
+      tep_db_query("delete from " . TABLE_ACTION_RECORDER . " where module = '" . $this->code . "' and date_added < date_sub(now(), interval " . (int)$this->minutes  . " minute)");
+
+      return mysql_affected_rows($db_link);
+    }
+
+    function check() {
+      return defined('MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('Minimum Minutes Per E-Mail', 'MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES', '15', 'Minimum number of minutes to allow 1 e-mail to be sent (eg, 15 for 1 e-mail every 15 minutes)', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/address_book_details.php 2.3.1.src/includes/modules/address_book_details.php
--- 2.2rc2a.cp.src/includes/modules/address_book_details.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/address_book_details.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,30 +1,26 @@
 <?php
 /*
-  $Id: address_book_details.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   if (!isset($process)) $process = false;
 ?>
-<table border="0" width="100%" cellspacing="0" cellpadding="2">
-  <tr>
-    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-      <tr>
-        <td class="main"><b><?php echo NEW_ADDRESS_TITLE; ?></b></td>
-        <td class="inputRequirement" align="right"><?php echo FORM_REQUIRED_INFORMATION; ?></td>
-      </tr>
-    </table></td>
-  </tr>
-  <tr>
-    <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-      <tr class="infoBoxContents">
-        <td><table border="0" cellspacing="2" cellpadding="2">
+
+  <div>
+    <span class="inputRequirement" style="float: right;"><?php echo FORM_REQUIRED_INFORMATION; ?></span>
+    <h2><?php echo NEW_ADDRESS_TITLE; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="2" cellpadding="2">
+
 <?php
   if (ACCOUNT_GENDER == 'true') {
     $male = $female = false;
@@ -36,65 +32,72 @@
       $female = !$male;
     }
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_GENDER; ?></td>
-            <td class="main"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_GENDER; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_FIRST_NAME; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('firstname', $entry['entry_firstname']) . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
-          </tr>
-          <tr>
-            <td class="main"><?php echo ENTRY_LAST_NAME; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('lastname', $entry['entry_lastname']) . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
-          </tr>
-          <tr>
-            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_FIRST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('firstname', (isset($entry['entry_firstname']) ? $entry['entry_firstname'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_LAST_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('lastname', (isset($entry['entry_lastname']) ? $entry['entry_lastname'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_COMPANY == 'true') {
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_COMPANY; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('company', $entry['entry_company']) . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
-          </tr>
-          <tr>
-            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_COMPANY; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('company', (isset($entry['entry_company']) ? $entry['entry_company'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_STREET_ADDRESS; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('street_address', $entry['entry_street_address']) . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_STREET_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('street_address', (isset($entry['entry_street_address']) ? $entry['entry_street_address'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_SUBURB == 'true') {
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_SUBURB; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('suburb', $entry['entry_suburb']) . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_SUBURB; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('suburb', (isset($entry['entry_suburb']) ? $entry['entry_suburb'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   }
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_POST_CODE; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('postcode', $entry['entry_postcode']) . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
-          </tr>
-          <tr>
-            <td class="main"><?php echo ENTRY_CITY; ?></td>
-            <td class="main"><?php echo tep_draw_input_field('city', $entry['entry_city']) . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_POST_CODE; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('postcode', (isset($entry['entry_postcode']) ? $entry['entry_postcode'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_CITY; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('city', (isset($entry['entry_city']) ? $entry['entry_city'] : '')) . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if (ACCOUNT_STATE == 'true') {
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_STATE; ?></td>
-            <td class="main">
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_STATE; ?></td>
+        <td class="fieldValue">
 <?php
     if ($process == true) {
       if ($entry_state_has_zones == true) {
@@ -108,33 +111,33 @@
         echo tep_draw_input_field('state');
       }
     } else {
-      echo tep_draw_input_field('state', tep_get_zone_name($entry['entry_country_id'], $entry['entry_zone_id'], $entry['entry_state']));
+      echo tep_draw_input_field('state', (isset($entry['entry_country_id']) ? tep_get_zone_name($entry['entry_country_id'], $entry['entry_zone_id'], $entry['entry_state']) : ''));
     }
 
-    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT;
-?></td>
-          </tr>
+    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT . '</span>';
+?>
+        </td>
+      </tr>
+
 <?php
   }
 ?>
-          <tr>
-            <td class="main"><?php echo ENTRY_COUNTRY; ?></td>
-            <td class="main"><?php echo tep_get_country_list('country', $entry['entry_country_id']) . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldKey"><?php echo ENTRY_COUNTRY; ?></td>
+        <td class="fieldValue"><?php echo tep_get_country_list('country', (isset($entry['entry_country_id']) ? $entry['entry_country_id'] : STORE_COUNTRY)) . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
+      </tr>
+
 <?php
   if ((isset($HTTP_GET_VARS['edit']) && ($customer_default_address_id != $HTTP_GET_VARS['edit'])) || (isset($HTTP_GET_VARS['edit']) == false) ) {
 ?>
-          <tr>
-            <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td colspan="2" class="main"><?php echo tep_draw_checkbox_field('primary', 'on', false, 'id="primary"') . ' ' . SET_AS_PRIMARY; ?></td>
-          </tr>
+
+      <tr>
+        <td class="fieldValue" colspan="2"><?php echo tep_draw_checkbox_field('primary', 'on', false, 'id="primary"') . ' ' . SET_AS_PRIMARY; ?></td>
+      </tr>
+
 <?php
   }
 ?>
-        </table></td>
-      </tr>
-    </table></td>
-  </tr>
-</table>
+    </table>
+  </div>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/also_purchased_products.php 2.3.1.src/includes/modules/also_purchased_products.php
--- 2.2rc2a.cp.src/includes/modules/also_purchased_products.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/also_purchased_products.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: also_purchased_products.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -14,33 +14,43 @@
     $orders_query = tep_db_query("select p.products_id, p.products_image from " . TABLE_ORDERS_PRODUCTS . " opa, " . TABLE_ORDERS_PRODUCTS . " opb, " . TABLE_ORDERS . " o, " . TABLE_PRODUCTS . " p where opa.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and opa.orders_id = opb.orders_id and opb.products_id != '" . (int)$HTTP_GET_VARS['products_id'] . "' and opb.products_id = p.products_id and opb.orders_id = o.orders_id and p.products_status = '1' group by p.products_id order by o.date_purchased desc limit " . MAX_DISPLAY_ALSO_PURCHASED);
     $num_products_ordered = tep_db_num_rows($orders_query);
     if ($num_products_ordered >= MIN_DISPLAY_ALSO_PURCHASED) {
-?>
-<!-- also_purchased_products //-->
-<?php
-      $info_box_contents = array();
-      $info_box_contents[] = array('text' => TEXT_ALSO_PURCHASED_PRODUCTS);
-
-      new contentBoxHeading($info_box_contents);
-
-      $row = 0;
+      $counter = 0;
       $col = 0;
-      $info_box_contents = array();
+
+      $also_pur_prods_content = '<table border="0" width="100%" cellspacing="0" cellpadding="2" class="ui-widget-content ui-corner-bottom">';
       while ($orders = tep_db_fetch_array($orders_query)) {
+        $counter++;
+
         $orders['products_name'] = tep_get_products_name($orders['products_id']);
-        $info_box_contents[$row][$col] = array('align' => 'center',
-                                               'params' => 'class="smallText" width="33%" valign="top"',
-                                               'text' => '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $orders['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $orders['products_image'], $orders['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $orders['products_id']) . '">' . $orders['products_name'] . '</a>');
+
+        if ($col === 0) {
+          $also_pur_prods_content .= '<tr>';
+        }
+
+        $also_pur_prods_content .= '<td width="33%" valign="top" align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $orders['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $orders['products_image'], $orders['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br /><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $orders['products_id']) . '">' . $orders['products_name'] . '</a></td>';
 
         $col ++;
-        if ($col > 2) {
+
+        if (($col > 2) || ($counter == $num_products_ordered)) {
+          $also_pur_prods_content .= '</tr>';
+
           $col = 0;
-          $row ++;
         }
       }
 
-      new contentBox($info_box_contents);
+      $also_pur_prods_content .= '</table>';
 ?>
-<!-- also_purchased_products_eof //-->
+
+  <br />
+
+  <div class="ui-widget infoBoxContainer">
+    <div class="ui-widget-header ui-corner-top infoBoxHeading">
+      <span><?php echo TEXT_ALSO_PURCHASED_PRODUCTS; ?></span>
+    </div>
+
+    <?php echo $also_pur_prods_content; ?>
+  </div>
+
 <?php
     }
   }
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_best_sellers.php 2.3.1.src/includes/modules/boxes/bm_best_sellers.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_best_sellers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_best_sellers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,82 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_best_sellers {
+    var $code = 'bm_best_sellers';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_best_sellers() {
+      $this->title = MODULE_BOXES_BEST_SELLERS_TITLE;
+      $this->description = MODULE_BOXES_BEST_SELLERS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_BEST_SELLERS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_BEST_SELLERS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_BEST_SELLERS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_BEST_SELLERS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $HTTP_GET_VARS, $current_category_id, $languages_id, $oscTemplate;
+
+      if (!isset($HTTP_GET_VARS['products_id'])) {
+        if (isset($current_category_id) && ($current_category_id > 0)) {
+          $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and '" . (int)$current_category_id . "' in (c.categories_id, c.parent_id) order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
+        } else {
+          $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
+        }
+
+        if (tep_db_num_rows($best_sellers_query) >= MIN_DISPLAY_BESTSELLERS) {
+          $bestsellers_list = '<ol style="margin: 0; padding-left: 25px;">';
+          while ($best_sellers = tep_db_fetch_array($best_sellers_query)) {
+            $bestsellers_list .= '<li><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $best_sellers['products_id']) . '">' . $best_sellers['products_name'] . '</a></li>';
+          }
+          $bestsellers_list .= '</ol>';
+
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_BEST_SELLERS_BOX_TITLE . '</div>' .
+                  '  <div class="ui-widget-content infoBoxContents">' . $bestsellers_list . '</div>' .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_BEST_SELLERS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Best Sellers Module', 'MODULE_BOXES_BEST_SELLERS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_BEST_SELLERS_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_BEST_SELLERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_BEST_SELLERS_STATUS', 'MODULE_BOXES_BEST_SELLERS_CONTENT_PLACEMENT', 'MODULE_BOXES_BEST_SELLERS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_categories.php 2.3.1.src/includes/modules/boxes/bm_categories.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_categories.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_categories.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,187 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_categories {
+    var $code = 'bm_categories';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_categories() {
+      $this->title = MODULE_BOXES_CATEGORIES_TITLE;
+      $this->description = MODULE_BOXES_CATEGORIES_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_CATEGORIES_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_CATEGORIES_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_CATEGORIES_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function tep_show_category($counter) {
+      global $tree, $categories_string, $cPath_array;
+
+      for ($i=0; $i<$tree[$counter]['level']; $i++) {
+        $categories_string .= "&nbsp;&nbsp;";
+      }
+
+      $categories_string .= '<a href="';
+
+      if ($tree[$counter]['parent'] == 0) {
+        $cPath_new = 'cPath=' . $counter;
+      } else {
+        $cPath_new = 'cPath=' . $tree[$counter]['path'];
+      }
+
+      $categories_string .= tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">';
+
+      if (isset($cPath_array) && in_array($counter, $cPath_array)) {
+        $categories_string .= '<strong>';
+      }
+
+// display category name
+      $categories_string .= $tree[$counter]['name'];
+
+      if (isset($cPath_array) && in_array($counter, $cPath_array)) {
+        $categories_string .= '</strong>';
+      }
+
+      if (tep_has_category_subcategories($counter)) {
+        $categories_string .= '-&gt;';
+      }
+
+      $categories_string .= '</a>';
+
+      if (SHOW_COUNTS == 'true') {
+        $products_in_category = tep_count_products_in_category($counter);
+        if ($products_in_category > 0) {
+          $categories_string .= '&nbsp;(' . $products_in_category . ')';
+        }
+      }
+
+      $categories_string .= '<br />';
+
+      if ($tree[$counter]['next_id'] != false) {
+        $this->tep_show_category($tree[$counter]['next_id']);
+      }
+    }
+
+    function getData() {
+      global $categories_string, $tree, $languages_id, $cPath, $cPath_array;
+
+      $categories_string = '';
+      $tree = array();
+
+      $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '0' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
+      while ($categories = tep_db_fetch_array($categories_query))  {
+        $tree[$categories['categories_id']] = array('name' => $categories['categories_name'],
+                                                    'parent' => $categories['parent_id'],
+                                                    'level' => 0,
+                                                    'path' => $categories['categories_id'],
+                                                    'next_id' => false);
+
+        if (isset($parent_id)) {
+          $tree[$parent_id]['next_id'] = $categories['categories_id'];
+        }
+
+        $parent_id = $categories['categories_id'];
+
+        if (!isset($first_element)) {
+          $first_element = $categories['categories_id'];
+        }
+      }
+
+      if (tep_not_null($cPath)) {
+        $new_path = '';
+        reset($cPath_array);
+        while (list($key, $value) = each($cPath_array)) {
+          unset($parent_id);
+          unset($first_id);
+          $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.parent_id = '" . (int)$value . "' and c.categories_id = cd.categories_id and cd.language_id='" . (int)$languages_id ."' order by sort_order, cd.categories_name");
+          if (tep_db_num_rows($categories_query)) {
+            $new_path .= $value;
+            while ($row = tep_db_fetch_array($categories_query)) {
+              $tree[$row['categories_id']] = array('name' => $row['categories_name'],
+                                                   'parent' => $row['parent_id'],
+                                                   'level' => $key+1,
+                                                   'path' => $new_path . '_' . $row['categories_id'],
+                                                   'next_id' => false);
+
+              if (isset($parent_id)) {
+                $tree[$parent_id]['next_id'] = $row['categories_id'];
+              }
+
+              $parent_id = $row['categories_id'];
+
+              if (!isset($first_id)) {
+                $first_id = $row['categories_id'];
+              }
+
+              $last_id = $row['categories_id'];
+            }
+            $tree[$last_id]['next_id'] = $tree[$value]['next_id'];
+            $tree[$value]['next_id'] = $first_id;
+            $new_path .= '_';
+          } else {
+            break;
+          }
+        }
+      }
+
+      $this->tep_show_category($first_element);
+
+      $data = '<div class="ui-widget infoBoxContainer">' .
+              '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_CATEGORIES_BOX_TITLE . '</div>' .
+              '  <div class="ui-widget-content infoBoxContents">' . $categories_string . '</div>' .
+              '</div>';
+
+      return $data;
+    }
+
+    function execute() {
+      global $SID, $oscTemplate;
+
+      if ((USE_CACHE == 'true') && empty($SID)) {
+        $output = tep_cache_categories_box();
+      } else {
+        $output = $this->getData();
+      }
+
+      $oscTemplate->addBlock($output, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_CATEGORIES_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Categories Module', 'MODULE_BOXES_CATEGORIES_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'Left Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_CATEGORIES_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_CATEGORIES_STATUS', 'MODULE_BOXES_CATEGORIES_CONTENT_PLACEMENT', 'MODULE_BOXES_CATEGORIES_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_currencies.php 2.3.1.src/includes/modules/boxes/bm_currencies.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_currencies.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_currencies.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,87 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_currencies {
+    var $code = 'bm_currencies';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_currencies() {
+      $this->title = MODULE_BOXES_CURRENCIES_TITLE;
+      $this->description = MODULE_BOXES_CURRENCIES_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_CURRENCIES_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_CURRENCIES_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_CURRENCIES_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_CURRENCIES_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $currencies, $HTTP_GET_VARS, $request_type, $currency, $oscTemplate;
+
+      if (substr(basename($PHP_SELF), 0, 8) != 'checkout') {
+        if (isset($currencies) && is_object($currencies) && (count($currencies->currencies) > 1)) {
+          reset($currencies->currencies);
+          $currencies_array = array();
+          while (list($key, $value) = each($currencies->currencies)) {
+            $currencies_array[] = array('id' => $key, 'text' => $value['title']);
+          }
+
+          $hidden_get_variables = '';
+          reset($HTTP_GET_VARS);
+          while (list($key, $value) = each($HTTP_GET_VARS)) {
+            if ( is_string($value) && ($key != 'currency') && ($key != tep_session_name()) && ($key != 'x') && ($key != 'y') ) {
+              $hidden_get_variables .= tep_draw_hidden_field($key, $value);
+            }
+          }
+
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_CURRENCIES_BOX_TITLE . '</div>' .
+                  '  <div class="ui-widget-content infoBoxContents">' . 
+                  '    ' . tep_draw_form('currencies', tep_href_link(basename($PHP_SELF), '', $request_type, false), 'get') .
+                  '    ' . tep_draw_pull_down_menu('currency', $currencies_array, $currency, 'onchange="this.form.submit();" style="width: 100%"') . $hidden_get_variables . tep_hide_session_id() . '</form>' .
+                  '  </div>' .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_CURRENCIES_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Currencies Module', 'MODULE_BOXES_CURRENCIES_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_CURRENCIES_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_CURRENCIES_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_CURRENCIES_STATUS', 'MODULE_BOXES_CURRENCIES_CONTENT_PLACEMENT', 'MODULE_BOXES_CURRENCIES_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_information.php 2.3.1.src/includes/modules/boxes/bm_information.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_information.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_information.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,71 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_information {
+    var $code = 'bm_information';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_information() {
+      $this->title = MODULE_BOXES_INFORMATION_TITLE;
+      $this->description = MODULE_BOXES_INFORMATION_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_INFORMATION_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_INFORMATION_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_INFORMATION_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_INFORMATION_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $oscTemplate;
+
+      $data = '<div class="ui-widget infoBoxContainer">' .
+              '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_INFORMATION_BOX_TITLE . '</div>' .
+              '  <div class="ui-widget-content infoBoxContents">' .
+              '    <a href="' . tep_href_link(FILENAME_SHIPPING) . '">' . MODULE_BOXES_INFORMATION_BOX_SHIPPING . '</a><br />' .
+              '    <a href="' . tep_href_link(FILENAME_PRIVACY) . '">' . MODULE_BOXES_INFORMATION_BOX_PRIVACY . '</a><br />' .
+              '    <a href="' . tep_href_link(FILENAME_CONDITIONS) . '">' . MODULE_BOXES_INFORMATION_BOX_CONDITIONS . '</a><br />' .
+              '    <a href="' . tep_href_link(FILENAME_CONTACT_US) . '">' . MODULE_BOXES_INFORMATION_BOX_CONTACT . '</a>' .
+              '  </div>' .
+              '</div>';
+
+      $oscTemplate->addBlock($data, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_INFORMATION_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Information Module', 'MODULE_BOXES_INFORMATION_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_INFORMATION_CONTENT_PLACEMENT', 'Left Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_INFORMATION_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_INFORMATION_STATUS', 'MODULE_BOXES_INFORMATION_CONTENT_PLACEMENT', 'MODULE_BOXES_INFORMATION_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_languages.php 2.3.1.src/includes/modules/boxes/bm_languages.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_languages.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_languages.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,81 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_languages {
+    var $code = 'bm_languages';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_languages() {
+      $this->title = MODULE_BOXES_LANGUAGES_TITLE;
+      $this->description = MODULE_BOXES_LANGUAGES_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_LANGUAGES_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_LANGUAGES_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_LANGUAGES_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_LANGUAGES_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $lng, $request_type, $oscTemplate;
+
+      if (substr(basename($PHP_SELF), 0, 8) != 'checkout') {
+        if (!isset($lng) || (isset($lng) && !is_object($lng))) {
+          include(DIR_WS_CLASSES . 'language.php');
+          $lng = new language;
+        }
+
+        if (count($lng->catalog_languages) > 1) {
+          $languages_string = '';
+          reset($lng->catalog_languages);
+          while (list($key, $value) = each($lng->catalog_languages)) {
+            $languages_string .= ' <a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('language', 'currency')) . 'language=' . $key, $request_type) . '">' . tep_image(DIR_WS_LANGUAGES .  $value['directory'] . '/images/' . $value['image'], $value['name']) . '</a> ';
+          }
+
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_LANGUAGES_BOX_TITLE . '</div>' .
+                  '  <div class="ui-widget-content infoBoxContents" style="text-align: center;">' . $languages_string . '</div>' .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_LANGUAGES_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Languages Module', 'MODULE_BOXES_LANGUAGES_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_LANGUAGES_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_LANGUAGES_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_LANGUAGES_STATUS', 'MODULE_BOXES_LANGUAGES_CONTENT_PLACEMENT', 'MODULE_BOXES_LANGUAGES_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_manufacturer_info.php 2.3.1.src/includes/modules/boxes/bm_manufacturer_info.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_manufacturer_info.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_manufacturer_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,79 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_manufacturer_info {
+    var $code = 'bm_manufacturer_info';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_manufacturer_info() {
+      $this->title = MODULE_BOXES_MANUFACTURER_INFO_TITLE;
+      $this->description = MODULE_BOXES_MANUFACTURER_INFO_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_MANUFACTURER_INFO_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_MANUFACTURER_INFO_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_MANUFACTURER_INFO_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_MANUFACTURER_INFO_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $HTTP_GET_VARS, $languages_id, $oscTemplate;
+
+      if (isset($HTTP_GET_VARS['products_id'])) {
+        $manufacturer_query = tep_db_query("select m.manufacturers_id, m.manufacturers_name, m.manufacturers_image, mi.manufacturers_url from " . TABLE_MANUFACTURERS . " m left join " . TABLE_MANUFACTURERS_INFO . " mi on (m.manufacturers_id = mi.manufacturers_id and mi.languages_id = '" . (int)$languages_id . "'), " . TABLE_PRODUCTS . " p  where p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and p.manufacturers_id = m.manufacturers_id");
+        if (tep_db_num_rows($manufacturer_query)) {
+          $manufacturer = tep_db_fetch_array($manufacturer_query);
+
+          $manufacturer_info_string = '<table border="0" width="100%" cellspacing="0" cellpadding="0" class="ui-widget-content infoBoxContents">';
+          if (tep_not_null($manufacturer['manufacturers_image'])) $manufacturer_info_string .= '<tr><td align="center" colspan="2">' . tep_image(DIR_WS_IMAGES . $manufacturer['manufacturers_image'], $manufacturer['manufacturers_name']) . '</td></tr>';
+          if (tep_not_null($manufacturer['manufacturers_url'])) $manufacturer_info_string .= '<tr><td valign="top">-&nbsp;</td><td valign="top"><a href="' . tep_href_link(FILENAME_REDIRECT, 'action=manufacturer&manufacturers_id=' . $manufacturer['manufacturers_id']) . '" target="_blank">' . sprintf(MODULE_BOXES_MANUFACTURER_INFO_BOX_HOMEPAGE, $manufacturer['manufacturers_name']) . '</a></td></tr>';
+          $manufacturer_info_string .= '<tr><td valign="top">-&nbsp;</td><td valign="top"><a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $manufacturer['manufacturers_id']) . '">' . MODULE_BOXES_MANUFACTURER_INFO_BOX_OTHER_PRODUCTS . '</a></td></tr>' .
+                                       '</table>';
+
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_MANUFACTURER_INFO_BOX_TITLE . '</div>' .
+                  '  ' . $manufacturer_info_string .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_MANUFACTURER_INFO_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Manufacturer Info Module', 'MODULE_BOXES_MANUFACTURER_INFO_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_MANUFACTURER_INFO_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_MANUFACTURER_INFO_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_MANUFACTURER_INFO_STATUS', 'MODULE_BOXES_MANUFACTURER_INFO_CONTENT_PLACEMENT', 'MODULE_BOXES_MANUFACTURER_INFO_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_manufacturers.php 2.3.1.src/includes/modules/boxes/bm_manufacturers.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_manufacturers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_manufacturers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,113 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_manufacturers {
+    var $code = 'bm_manufacturers';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_manufacturers() {
+      $this->title = MODULE_BOXES_MANUFACTURERS_TITLE;
+      $this->description = MODULE_BOXES_MANUFACTURERS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_MANUFACTURERS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_MANUFACTURERS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_MANUFACTURERS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_MANUFACTURERS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function getData() {
+      global $HTTP_GET_VARS, $oscTemplate;
+
+      $data = '';
+
+      $manufacturers_query = tep_db_query("select manufacturers_id, manufacturers_name from " . TABLE_MANUFACTURERS . " order by manufacturers_name");
+      if ($number_of_rows = tep_db_num_rows($manufacturers_query)) {
+        if ($number_of_rows <= MAX_DISPLAY_MANUFACTURERS_IN_A_LIST) {
+// Display a list
+          $manufacturers_list = '<ul style="list-style: none; margin: 0; padding: 0;">';
+          while ($manufacturers = tep_db_fetch_array($manufacturers_query)) {
+            $manufacturers_name = ((strlen($manufacturers['manufacturers_name']) > MAX_DISPLAY_MANUFACTURER_NAME_LEN) ? substr($manufacturers['manufacturers_name'], 0, MAX_DISPLAY_MANUFACTURER_NAME_LEN) . '..' : $manufacturers['manufacturers_name']);
+            if (isset($HTTP_GET_VARS['manufacturers_id']) && ($HTTP_GET_VARS['manufacturers_id'] == $manufacturers['manufacturers_id'])) $manufacturers_name = '<strong>' . $manufacturers_name .'</strong>';
+            $manufacturers_list .= '<li><a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $manufacturers['manufacturers_id']) . '">' . $manufacturers_name . '</a></li>';
+          }
+
+          $manufacturers_list .= '</ul>';
+
+          $content = $manufacturers_list;
+        } else {
+// Display a drop-down
+          $manufacturers_array = array();
+          if (MAX_MANUFACTURERS_LIST < 2) {
+            $manufacturers_array[] = array('id' => '', 'text' => PULL_DOWN_DEFAULT);
+          }
+
+          while ($manufacturers = tep_db_fetch_array($manufacturers_query)) {
+            $manufacturers_name = ((strlen($manufacturers['manufacturers_name']) > MAX_DISPLAY_MANUFACTURER_NAME_LEN) ? substr($manufacturers['manufacturers_name'], 0, MAX_DISPLAY_MANUFACTURER_NAME_LEN) . '..' : $manufacturers['manufacturers_name']);
+            $manufacturers_array[] = array('id' => $manufacturers['manufacturers_id'],
+                                           'text' => $manufacturers_name);
+          }
+
+          $content = tep_draw_form('manufacturers', tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false), 'get') .
+                     tep_draw_pull_down_menu('manufacturers_id', $manufacturers_array, (isset($HTTP_GET_VARS['manufacturers_id']) ? $HTTP_GET_VARS['manufacturers_id'] : ''), 'onchange="this.form.submit();" size="' . MAX_MANUFACTURERS_LIST . '" style="width: 100%"') . tep_hide_session_id() .
+                     '</form>';
+        }
+
+        $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_MANUFACTURERS_BOX_TITLE . '</div>' .
+                  '  <div class="ui-widget-content infoBoxContents">' . $content . '</div>' .
+                  '</div>';
+      }
+
+      return $data;
+    }
+
+    function execute() {
+      global $SID, $oscTemplate;
+
+      if ((USE_CACHE == 'true') && empty($SID)) {
+        $output = tep_cache_manufacturers_box();
+      } else {
+        $output = $this->getData();
+      }
+
+      $oscTemplate->addBlock($output, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_MANUFACTURERS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Manufacturers Module', 'MODULE_BOXES_MANUFACTURERS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_MANUFACTURERS_CONTENT_PLACEMENT', 'Left Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_MANUFACTURERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_MANUFACTURERS_STATUS', 'MODULE_BOXES_MANUFACTURERS_CONTENT_PLACEMENT', 'MODULE_BOXES_MANUFACTURERS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_order_history.php 2.3.1.src/includes/modules/boxes/bm_order_history.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_order_history.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_order_history.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,88 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_order_history {
+    var $code = 'bm_order_history';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_order_history() {
+      $this->title = MODULE_BOXES_ORDER_HISTORY_TITLE;
+      $this->description = MODULE_BOXES_ORDER_HISTORY_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_ORDER_HISTORY_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_ORDER_HISTORY_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_ORDER_HISTORY_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_ORDER_HISTORY_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $customer_id, $languages_id, $PHP_SELF, $oscTemplate;
+
+      if (tep_session_is_registered('customer_id')) {
+// retreive the last x products purchased
+        $orders_query = tep_db_query("select distinct op.products_id from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op, " . TABLE_PRODUCTS . " p where o.customers_id = '" . (int)$customer_id . "' and o.orders_id = op.orders_id and op.products_id = p.products_id and p.products_status = '1' group by products_id order by o.date_purchased desc limit " . MAX_DISPLAY_PRODUCTS_IN_ORDER_HISTORY_BOX);
+        if (tep_db_num_rows($orders_query)) {
+          $product_ids = '';
+          while ($orders = tep_db_fetch_array($orders_query)) {
+            $product_ids .= (int)$orders['products_id'] . ',';
+          }
+          $product_ids = substr($product_ids, 0, -1);
+
+          $customer_orders_string = '<table border="0" width="100%" cellspacing="0" cellpadding="1" class="ui-widget-content infoBoxContents">';
+          $products_query = tep_db_query("select products_id, products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id in (" . $product_ids . ") and language_id = '" . (int)$languages_id . "' order by products_name");
+          while ($products = tep_db_fetch_array($products_query)) {
+            $customer_orders_string .= '  <tr>' .
+                                       '    <td><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . '">' . $products['products_name'] . '</a></td>' .
+                                       '    <td align="right" valign="top"><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=cust_order&pid=' . $products['products_id']) . '">' . tep_image(DIR_WS_ICONS . 'cart.gif', ICON_CART) . '</a></td>' .
+                                       '  </tr>';
+          }
+          $customer_orders_string .= '</table>';
+
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_ORDER_HISTORY_BOX_TITLE . '</div>' .
+                  '  ' . $customer_orders_string .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_ORDER_HISTORY_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Order History Module', 'MODULE_BOXES_ORDER_HISTORY_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_ORDER_HISTORY_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_ORDER_HISTORY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_ORDER_HISTORY_STATUS', 'MODULE_BOXES_ORDER_HISTORY_CONTENT_PLACEMENT', 'MODULE_BOXES_ORDER_HISTORY_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_product_notifications.php 2.3.1.src/includes/modules/boxes/bm_product_notifications.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_product_notifications.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_product_notifications.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,85 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_product_notifications {
+    var $code = 'bm_product_notifications';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_product_notifications() {
+      $this->title = MODULE_BOXES_PRODUCT_NOTIFICATIONS_TITLE;
+      $this->description = MODULE_BOXES_PRODUCT_NOTIFICATIONS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_PRODUCT_NOTIFICATIONS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_PRODUCT_NOTIFICATIONS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_PRODUCT_NOTIFICATIONS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_PRODUCT_NOTIFICATIONS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $HTTP_GET_VARS, $customer_id, $PHP_SELF, $request_type, $oscTemplate;
+
+      if (isset($HTTP_GET_VARS['products_id'])) {
+        if (tep_session_is_registered('customer_id')) {
+          $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and customers_id = '" . (int)$customer_id . "'");
+          $check = tep_db_fetch_array($check_query);
+
+          $notification_exists = (($check['count'] > 0) ? true : false);
+        } else {
+          $notification_exists = false;
+        }
+
+        $notif_contents = '';
+
+        if ($notification_exists == true) {
+          $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications_remove.gif', IMAGE_BUTTON_REMOVE_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify_remove', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY_REMOVE, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
+        } else {
+          $notif_contents = '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . tep_image(DIR_WS_IMAGES . 'box_products_notifications.gif', IMAGE_BUTTON_NOTIFICATIONS) . '</a></td><td><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=notify', $request_type) . '">' . sprintf(MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_NOTIFY, tep_get_products_name($HTTP_GET_VARS['products_id'])) .'</a></td></tr></table>';
+        }
+
+        $data = '<div class="ui-widget infoBoxContainer">' .
+                '  <div class="ui-widget-header infoBoxHeading"><a href="' . tep_href_link(FILENAME_ACCOUNT_NOTIFICATIONS, '', 'SSL') . '">' . MODULE_BOXES_PRODUCT_NOTIFICATIONS_BOX_TITLE . '</a></div>' .
+                '  ' . $notif_contents .
+                '</div>';
+
+        $oscTemplate->addBlock($data, $this->group);
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_PRODUCT_NOTIFICATIONS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Product Notifications Module', 'MODULE_BOXES_PRODUCT_NOTIFICATIONS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_PRODUCT_NOTIFICATIONS_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_PRODUCT_NOTIFICATIONS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_PRODUCT_NOTIFICATIONS_STATUS', 'MODULE_BOXES_PRODUCT_NOTIFICATIONS_CONTENT_PLACEMENT', 'MODULE_BOXES_PRODUCT_NOTIFICATIONS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_product_social_bookmarks.php 2.3.1.src/includes/modules/boxes/bm_product_social_bookmarks.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_product_social_bookmarks.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_product_social_bookmarks.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,89 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_product_social_bookmarks {
+    var $code = 'bm_product_social_bookmarks';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_product_social_bookmarks() {
+      $this->title = MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_TITLE;
+      $this->description = MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $HTTP_GET_VARS, $language, $oscTemplate;
+
+      if ( isset($HTTP_GET_VARS['products_id']) && defined('MODULE_SOCIAL_BOOKMARKS_INSTALLED') && tep_not_null(MODULE_SOCIAL_BOOKMARKS_INSTALLED) ) {
+        $sbm_array = explode(';', MODULE_SOCIAL_BOOKMARKS_INSTALLED);
+
+        $social_bookmarks = array();
+
+        foreach ( $sbm_array as $sbm ) {
+          $class = substr($sbm, 0, strrpos($sbm, '.'));
+
+          if ( !class_exists($class) ) {
+            include(DIR_WS_LANGUAGES . $language . '/modules/social_bookmarks/' . $sbm);
+            include(DIR_WS_MODULES . 'social_bookmarks/' . $class . '.php');
+          }
+
+          $sb = new $class();
+
+          if ( $sb->isEnabled() ) {
+            $social_bookmarks[] = $sb->getOutput();
+          }
+        }
+
+        if ( !empty($social_bookmarks) ) {
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_BOX_TITLE . '</div>' .
+                  '  <div class="ui-widget-content infoBoxContents" style="text-align: center;">' . implode(' ', $social_bookmarks) . '</div>' .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Product Social Bookmarks Module', 'MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_STATUS', 'MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_CONTENT_PLACEMENT', 'MODULE_BOXES_PRODUCT_SOCIAL_BOOKMARKS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_reviews.php 2.3.1.src/includes/modules/boxes/bm_reviews.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_reviews.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,91 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_reviews {
+    var $code = 'bm_reviews';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_reviews() {
+      $this->title = MODULE_BOXES_REVIEWS_TITLE;
+      $this->description = MODULE_BOXES_REVIEWS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_REVIEWS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_REVIEWS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_REVIEWS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_REVIEWS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $languages_id, $HTTP_GET_VARS, $currencies, $oscTemplate;
+
+      $random_select = "select r.reviews_id, r.reviews_rating, p.products_id, p.products_image, pd.products_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = r.products_id and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and r.reviews_status = 1";
+      if (isset($HTTP_GET_VARS['products_id'])) {
+        $random_select .= " and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'";
+      }
+      $random_select .= " order by r.reviews_id desc limit " . MAX_RANDOM_SELECT_REVIEWS;
+      $random_product = tep_random_select($random_select);
+
+      $reviews_box_contents = '';
+
+      if ($random_product) {
+// display random review box
+        $rand_review_query = tep_db_query("select substring(reviews_text, 1, 60) as reviews_text from " . TABLE_REVIEWS_DESCRIPTION . " where reviews_id = '" . (int)$random_product['reviews_id'] . "' and languages_id = '" . (int)$languages_id . "'");
+        $rand_review = tep_db_fetch_array($rand_review_query);
+
+        $rand_review_text = tep_break_string(tep_output_string_protected($rand_review['reviews_text']), 15, '-<br />');
+
+        $reviews_box_contents .= '<div class="ui-widget-content infoBoxContents"><div align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $random_product['products_id'] . '&reviews_id=' . $random_product['reviews_id']) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></div><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $random_product['products_id'] . '&reviews_id=' . $random_product['reviews_id']) . '">' . $rand_review_text . ' ..</a><br /><div align="center">' . tep_image(DIR_WS_IMAGES . 'stars_' . $random_product['reviews_rating'] . '.gif' , sprintf(MODULE_BOXES_REVIEWS_BOX_TEXT_OF_5_STARS, $random_product['reviews_rating'])) . '</div></div>';
+      } elseif (isset($HTTP_GET_VARS['products_id'])) {
+// display 'write a review' box
+        $reviews_box_contents .= '<table border="0" cellspacing="0" cellpadding="2" class="ui-widget-content infoBoxContents"><tr><td><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'products_id=' . $HTTP_GET_VARS['products_id']) . '">' . tep_image(DIR_WS_IMAGES . 'box_write_review.gif', IMAGE_BUTTON_WRITE_REVIEW) . '</a></td><td><a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'products_id=' . $HTTP_GET_VARS['products_id']) . '">' . MODULE_BOXES_REVIEWS_BOX_WRITE_REVIEW .'</a></td></tr></table>';
+      } else {
+// display 'no reviews' box
+        $reviews_box_contents .= '<div class="ui-widget-content infoBoxContents">' . MODULE_BOXES_REVIEWS_BOX_NO_REVIEWS . '</div>';
+      }
+
+      $data = '<div class="ui-widget infoBoxContainer">' .
+              '  <div class="ui-widget-header infoBoxHeading"><a href="' . tep_href_link(FILENAME_REVIEWS) . '">' . MODULE_BOXES_REVIEWS_BOX_TITLE . '</a></div>' .
+              '  ' . $reviews_box_contents .
+              '</div>';
+
+      $oscTemplate->addBlock($data, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_REVIEWS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Reviews Module', 'MODULE_BOXES_REVIEWS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_REVIEWS_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_REVIEWS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_REVIEWS_STATUS', 'MODULE_BOXES_REVIEWS_CONTENT_PLACEMENT', 'MODULE_BOXES_REVIEWS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_search.php 2.3.1.src/includes/modules/boxes/bm_search.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_search.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_search.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,70 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_search {
+    var $code = 'bm_search';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_search() {
+      $this->title = MODULE_BOXES_SEARCH_TITLE;
+      $this->description = MODULE_BOXES_SEARCH_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_SEARCH_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_SEARCH_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_SEARCH_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_SEARCH_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $oscTemplate;
+
+      $data = '<div class="ui-widget infoBoxContainer">' .
+              '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_SEARCH_BOX_TITLE . '</div>' .
+              '  <div class="ui-widget-content infoBoxContents" style="text-align: center;">' .
+              '    ' . tep_draw_form('quick_find', tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, '', 'NONSSL', false), 'get') .
+              '    ' . tep_draw_input_field('keywords', '', 'size="10" maxlength="30" style="width: 75%"') . '&nbsp;' . tep_draw_hidden_field('search_in_description', '1') . tep_hide_session_id() . tep_image_submit('button_quick_find.gif', MODULE_BOXES_SEARCH_BOX_TITLE) . '<br />' . MODULE_BOXES_SEARCH_BOX_TEXT . '<br /><a href="' . tep_href_link(FILENAME_ADVANCED_SEARCH) . '"><strong>' . MODULE_BOXES_SEARCH_BOX_ADVANCED_SEARCH . '</strong></a>' .
+              '    </form>' .
+              '  </div>' .
+              '</div>';
+
+      $oscTemplate->addBlock($data, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_SEARCH_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Search Module', 'MODULE_BOXES_SEARCH_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_SEARCH_CONTENT_PLACEMENT', 'Left Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_SEARCH_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_SEARCH_STATUS', 'MODULE_BOXES_SEARCH_CONTENT_PLACEMENT', 'MODULE_BOXES_SEARCH_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_shopping_cart.php 2.3.1.src/includes/modules/boxes/bm_shopping_cart.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_shopping_cart.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,110 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_shopping_cart {
+    var $code = 'bm_shopping_cart';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_shopping_cart() {
+      $this->title = MODULE_BOXES_SHOPPING_CART_TITLE;
+      $this->description = MODULE_BOXES_SHOPPING_CART_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_SHOPPING_CART_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_SHOPPING_CART_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_SHOPPING_CART_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_SHOPPING_CART_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $cart, $new_products_id_in_cart, $currencies, $oscTemplate;
+
+      $cart_contents_string = '';
+
+      if ($cart->count_contents() > 0) {
+        $cart_contents_string = '<table border="0" width="100%" cellspacing="0" cellpadding="0" class="ui-widget-content infoBoxContents">';
+        $products = $cart->get_products();
+        for ($i=0, $n=sizeof($products); $i<$n; $i++) {
+          $cart_contents_string .= '<tr><td align="right" valign="top">';
+
+          if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
+            $cart_contents_string .= '<span class="newItemInCart">';
+          }
+
+          $cart_contents_string .= $products[$i]['quantity'] . '&nbsp;x&nbsp;';
+
+          if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
+            $cart_contents_string .= '</span>';
+          }
+
+          $cart_contents_string .= '</td><td valign="top"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '">';
+
+          if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
+            $cart_contents_string .= '<span class="newItemInCart">';
+          }
+
+          $cart_contents_string .= $products[$i]['name'];
+
+          if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
+            $cart_contents_string .= '</span>';
+          }
+
+          $cart_contents_string .= '</a></td></tr>';
+
+          if ((tep_session_is_registered('new_products_id_in_cart')) && ($new_products_id_in_cart == $products[$i]['id'])) {
+            tep_session_unregister('new_products_id_in_cart');
+          }
+        }
+
+        $cart_contents_string .= '<tr><td colspan="2" style="padding-top: 5px; padding-bottom: 2px;">' . tep_draw_separator() . '</td></tr>' .
+                                 '<tr><td colspan="2" align="right">' . $currencies->format($cart->show_total()) . '</td></tr>' .
+                                 '</table>';
+      } else {
+        $cart_contents_string .= '<div class="ui-widget-content infoBoxContents">' . MODULE_BOXES_SHOPPING_CART_BOX_CART_EMPTY . '</div>';
+      }
+
+      $data = '<div class="ui-widget infoBoxContainer">' .
+              '  <div class="ui-widget-header infoBoxHeading"><a href="' . tep_href_link(FILENAME_SHOPPING_CART) . '">' . MODULE_BOXES_SHOPPING_CART_BOX_TITLE . '</a></div>' .
+              '  ' . $cart_contents_string .
+              '</div>';
+
+      $oscTemplate->addBlock($data, $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_SHOPPING_CART_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Shopping Cart Module', 'MODULE_BOXES_SHOPPING_CART_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_SHOPPING_CART_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_SHOPPING_CART_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_SHOPPING_CART_STATUS', 'MODULE_BOXES_SHOPPING_CART_CONTENT_PLACEMENT', 'MODULE_BOXES_SHOPPING_CART_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_specials.php 2.3.1.src/includes/modules/boxes/bm_specials.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_specials.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,70 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_specials {
+    var $code = 'bm_specials';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_specials() {
+      $this->title = MODULE_BOXES_SPECIALS_TITLE;
+      $this->description = MODULE_BOXES_SPECIALS_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_SPECIALS_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_SPECIALS_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_SPECIALS_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_SPECIALS_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $HTTP_GET_VARS, $languages_id, $currencies, $oscTemplate;
+
+      if (!isset($HTTP_GET_VARS['products_id'])) {
+        if ($random_product = tep_random_select("select p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_image, s.specials_new_products_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_SPECIALS . " s where p.products_status = '1' and p.products_id = s.products_id and pd.products_id = s.products_id and pd.language_id = '" . (int)$languages_id . "' and s.status = '1' order by s.specials_date_added desc limit " . MAX_RANDOM_SELECT_SPECIALS)) {
+          $data = '<div class="ui-widget infoBoxContainer">' .
+                  '  <div class="ui-widget-header infoBoxHeading"><a href="' . tep_href_link(FILENAME_SPECIALS) . '">' . MODULE_BOXES_SPECIALS_BOX_TITLE . '</a></div>' .
+                  '  <div class="ui-widget-content infoBoxContents" style="text-align: center;"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product["products_id"]) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br /><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . $random_product['products_name'] . '</a><br /><del>' . $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</del><br /><span class="productSpecialPrice">' . $currencies->display_price($random_product['specials_new_products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</span></div>' .
+                  '</div>';
+
+          $oscTemplate->addBlock($data, $this->group);
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_SPECIALS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Specials Module', 'MODULE_BOXES_SPECIALS_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_SPECIALS_CONTENT_PLACEMENT', 'Right Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_SPECIALS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_SPECIALS_STATUS', 'MODULE_BOXES_SPECIALS_CONTENT_PLACEMENT', 'MODULE_BOXES_SPECIALS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/boxes/bm_whats_new.php 2.3.1.src/includes/modules/boxes/bm_whats_new.php
--- 2.2rc2a.cp.src/includes/modules/boxes/bm_whats_new.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/boxes/bm_whats_new.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,78 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class bm_whats_new {
+    var $code = 'bm_whats_new';
+    var $group = 'boxes';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function bm_whats_new() {
+      $this->title = MODULE_BOXES_WHATS_NEW_TITLE;
+      $this->description = MODULE_BOXES_WHATS_NEW_DESCRIPTION;
+
+      if ( defined('MODULE_BOXES_WHATS_NEW_STATUS') ) {
+        $this->sort_order = MODULE_BOXES_WHATS_NEW_SORT_ORDER;
+        $this->enabled = (MODULE_BOXES_WHATS_NEW_STATUS == 'True');
+
+        $this->group = ((MODULE_BOXES_WHATS_NEW_CONTENT_PLACEMENT == 'Left Column') ? 'boxes_column_left' : 'boxes_column_right');
+      }
+    }
+
+    function execute() {
+      global $currencies, $oscTemplate;
+
+      if ($random_product = tep_random_select("select products_id, products_image, products_tax_class_id, products_price from " . TABLE_PRODUCTS . " where products_status = '1' order by products_date_added desc limit " . MAX_RANDOM_SELECT_NEW)) {
+        $random_product['products_name'] = tep_get_products_name($random_product['products_id']);
+        $random_product['specials_new_products_price'] = tep_get_products_special_price($random_product['products_id']);
+
+        if (tep_not_null($random_product['specials_new_products_price'])) {
+          $whats_new_price = '<del>' . $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</del><br />';
+          $whats_new_price .= '<span class="productSpecialPrice">' . $currencies->display_price($random_product['specials_new_products_price'], tep_get_tax_rate($random_product['products_tax_class_id'])) . '</span>';
+        } else {
+          $whats_new_price = $currencies->display_price($random_product['products_price'], tep_get_tax_rate($random_product['products_tax_class_id']));
+        }
+
+        $data = '<div class="ui-widget infoBoxContainer">' .
+                '  <div class="ui-widget-header infoBoxHeading"><a href="' . tep_href_link(FILENAME_PRODUCTS_NEW) . '">' . MODULE_BOXES_WHATS_NEW_BOX_TITLE . '</a></div>' .
+                '  <div class="ui-widget-content infoBoxContents" style="text-align: center;"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $random_product['products_image'], $random_product['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br /><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $random_product['products_id']) . '">' . $random_product['products_name'] . '</a><br />' . $whats_new_price . '</div>' .
+                '</div>';
+
+        $oscTemplate->addBlock($data, $this->group);
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_BOXES_WHATS_NEW_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable What\'s New Module', 'MODULE_BOXES_WHATS_NEW_STATUS', 'True', 'Do you want to add the module to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Content Placement', 'MODULE_BOXES_WHATS_NEW_CONTENT_PLACEMENT', 'Left Column', 'Should the module be loaded in the left or right column?', '6', '1', 'tep_cfg_select_option(array(\'Left Column\', \'Right Column\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_BOXES_WHATS_NEW_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_BOXES_WHATS_NEW_STATUS', 'MODULE_BOXES_WHATS_NEW_CONTENT_PLACEMENT', 'MODULE_BOXES_WHATS_NEW_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/checkout_new_address.php 2.3.1.src/includes/modules/checkout_new_address.php
--- 2.2rc2a.cp.src/includes/modules/checkout_new_address.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/checkout_new_address.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,18 +1,21 @@
 <?php
 /*
-  $Id: checkout_new_address.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   if (!isset($process)) $process = false;
 ?>
-<table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
   if (ACCOUNT_GENDER == 'true') {
     if (isset($gender)) {
@@ -23,59 +26,73 @@
       $female = false;
     }
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_GENDER; ?></td>
-    <td class="main"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_GENDER; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_radio_field('gender', 'm', $male) . '&nbsp;&nbsp;' . MALE . '&nbsp;&nbsp;' . tep_draw_radio_field('gender', 'f', $female) . '&nbsp;&nbsp;' . FEMALE . '&nbsp;' . (tep_not_null(ENTRY_GENDER_TEXT) ? '<span class="inputRequirement">' . ENTRY_GENDER_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   }
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_FIRST_NAME; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('firstname') . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
-  </tr>
-  <tr>
-    <td class="main"><?php echo ENTRY_LAST_NAME; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('lastname') . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_FIRST_NAME; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('firstname') . '&nbsp;' . (tep_not_null(ENTRY_FIRST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>': ''); ?></td>
+    </tr>
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_LAST_NAME; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('lastname') . '&nbsp;' . (tep_not_null(ENTRY_LAST_NAME_TEXT) ? '<span class="inputRequirement">' . ENTRY_LAST_NAME_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   if (ACCOUNT_COMPANY == 'true') {
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_COMPANY; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('company') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_COMPANY; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('company') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   }
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_STREET_ADDRESS; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('street_address') . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_STREET_ADDRESS; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('street_address') . '&nbsp;' . (tep_not_null(ENTRY_STREET_ADDRESS_TEXT) ? '<span class="inputRequirement">' . ENTRY_STREET_ADDRESS_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   if (ACCOUNT_SUBURB == 'true') {
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_SUBURB; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('suburb') . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_SUBURB; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('suburb') . '&nbsp;' . (tep_not_null(ENTRY_SUBURB_TEXT) ? '<span class="inputRequirement">' . ENTRY_SUBURB_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   }
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_POST_CODE; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('postcode') . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
-  </tr>
-  <tr>
-    <td class="main"><?php echo ENTRY_CITY; ?></td>
-    <td class="main"><?php echo tep_draw_input_field('city') . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
-  </tr>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_POST_CODE; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('postcode') . '&nbsp;' . (tep_not_null(ENTRY_POST_CODE_TEXT) ? '<span class="inputRequirement">' . ENTRY_POST_CODE_TEXT . '</span>': ''); ?></td>
+    </tr>
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_CITY; ?></td>
+      <td class="fieldValue"><?php echo tep_draw_input_field('city') . '&nbsp;' . (tep_not_null(ENTRY_CITY_TEXT) ? '<span class="inputRequirement">' . ENTRY_CITY_TEXT . '</span>': ''); ?></td>
+    </tr>
+
 <?php
   if (ACCOUNT_STATE == 'true') {
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_STATE; ?></td>
-    <td class="main">
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_STATE; ?></td>
+      <td class="fieldValue">
+
 <?php
     if ($process == true) {
       if ($entry_state_has_zones == true) {
@@ -92,15 +109,19 @@
       echo tep_draw_input_field('state');
     }
 
-    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT;
+    if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT . '</span>';
 ?>
-    </td>
-  </tr>
+
+      </td>
+    </tr>
+
 <?php
   }
 ?>
-  <tr>
-    <td class="main"><?php echo ENTRY_COUNTRY; ?></td>
-    <td class="main"><?php echo tep_get_country_list('country') . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
-  </tr>
-</table>
+
+    <tr>
+      <td class="fieldKey"><?php echo ENTRY_COUNTRY; ?></td>
+      <td class="fieldValue"><?php echo tep_get_country_list('country', STORE_COUNTRY) . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>
+    </tr>
+  </table>
+</div>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/downloads.php 2.3.1.src/includes/modules/downloads.php
--- 2.2rc2a.cp.src/includes/modules/downloads.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/downloads.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,17 +1,15 @@
 <?php
 /*
-  $Id: downloads.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- downloads //-->
-<?php
+
   if (!strstr($PHP_SELF, FILENAME_ACCOUNT_HISTORY_INFO)) {
 // Get last order id for checkout_success
     $orders_query = tep_db_query("select orders_id from " . TABLE_ORDERS . " where customers_id = '" . (int)$customer_id . "' order by orders_id desc limit 1");
@@ -25,60 +23,52 @@
   $downloads_query = tep_db_query("select date_format(o.date_purchased, '%Y-%m-%d') as date_purchased_day, opd.download_maxdays, op.products_name, opd.orders_products_download_id, opd.orders_products_filename, opd.download_count, opd.download_maxdays from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op, " . TABLE_ORDERS_PRODUCTS_DOWNLOAD . " opd, " . TABLE_ORDERS_STATUS . " os where o.customers_id = '" . (int)$customer_id . "' and o.orders_id = '" . (int)$last_order . "' and o.orders_id = op.orders_id and op.orders_products_id = opd.orders_products_id and opd.orders_products_filename != '' and o.orders_status = os.orders_status_id and os.downloads_flag = '1' and os.language_id = '" . (int)$languages_id . "'");
   if (tep_db_num_rows($downloads_query) > 0) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><b><?php echo HEADING_DOWNLOAD; ?></b></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-<!-- list of products -->
+
+  <h2><?php echo HEADING_DOWNLOAD; ?></h2>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="1" cellpadding="2">
+
 <?php
     while ($downloads = tep_db_fetch_array($downloads_query)) {
 // MySQL 3.22 does not have INTERVAL
       list($dt_year, $dt_month, $dt_day) = explode('-', $downloads['date_purchased_day']);
       $download_timestamp = mktime(23, 59, 59, $dt_month, $dt_day + $downloads['download_maxdays'], $dt_year);
       $download_expiry = date('Y-m-d H:i:s', $download_timestamp);
-?>
-          <tr class="infoBoxContents">
-<!-- left box -->
-<?php
+
+      echo '      <tr>' . "\n";
+
 // The link will appear only if:
 // - Download remaining count is > 0, AND
 // - The file is present in the DOWNLOAD directory, AND EITHER
 // - No expiry date is enforced (maxdays == 0), OR
 // - The expiry date is not reached
       if ( ($downloads['download_count'] > 0) && (file_exists(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'])) && ( ($downloads['download_maxdays'] == 0) || ($download_timestamp > time())) ) {
-        echo '            <td class="main"><a href="' . tep_href_link(FILENAME_DOWNLOAD, 'order=' . $last_order . '&id=' . $downloads['orders_products_download_id']) . '">' . $downloads['products_name'] . '</a></td>' . "\n";
+        echo '        <td><a href="' . tep_href_link(FILENAME_DOWNLOAD, 'order=' . $last_order . '&id=' . $downloads['orders_products_download_id']) . '">' . $downloads['products_name'] . '</a></td>' . "\n";
       } else {
-        echo '            <td class="main">' . $downloads['products_name'] . '</td>' . "\n";
+        echo '        <td>' . $downloads['products_name'] . '</td>' . "\n";
       }
-?>
-<!-- right box -->
-<?php
-      echo '            <td class="main">' . TABLE_HEADING_DOWNLOAD_DATE . tep_date_long($download_expiry) . '</td>' . "\n" .
-           '            <td class="main" align="right">' . $downloads['download_count'] . TABLE_HEADING_DOWNLOAD_COUNT . '</td>' . "\n" .
-           '          </tr>' . "\n";
+
+      echo '        <td>' . TABLE_HEADING_DOWNLOAD_DATE . tep_date_long($download_expiry) . '</td>' . "\n" .
+           '        <td align="right">' . $downloads['download_count'] . TABLE_HEADING_DOWNLOAD_COUNT . '</td>' . "\n" .
+           '      </tr>' . "\n";
     }
 ?>
-          </tr>
-        </table></td>
-      </tr>
+
+    </table>
+
 <?php
     if (!strstr($PHP_SELF, FILENAME_ACCOUNT_HISTORY_INFO)) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="smalltext" colspan="4"><p><?php printf(FOOTER_DOWNLOAD, '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . HEADER_TITLE_MY_ACCOUNT . '</a>'); ?></p></td>
-      </tr>
+
+    <p><?php printf(FOOTER_DOWNLOAD, '<a href="' . tep_href_link(FILENAME_ACCOUNT, '', 'SSL') . '">' . HEADER_TITLE_MY_ACCOUNT . '</a>'); ?></p>
+
 <?php
     }
+?>
+
+  </div>
+
+<?php
   }
 ?>
-<!-- downloads_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_category_title.php 2.3.1.src/includes/modules/header_tags/ht_category_title.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_category_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_category_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,73 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_category_title {
+    var $code = 'ht_category_title';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_category_title() {
+      $this->title = MODULE_HEADER_TAGS_CATEGORY_TITLE_TITLE;
+      $this->description = MODULE_HEADER_TAGS_CATEGORY_TITLE_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_CATEGORY_TITLE_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_CATEGORY_TITLE_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_CATEGORY_TITLE_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $oscTemplate, $categories, $current_category_id, $languages_id;
+
+      if (basename($PHP_SELF) == FILENAME_DEFAULT) {
+// $categories is set in application_top.php to add the category to the breadcrumb
+        if (isset($categories) && (sizeof($categories) == 1) && isset($categories['categories_name'])) {
+          $oscTemplate->setTitle($categories['categories_name'] . ', ' . $oscTemplate->getTitle());
+        } else {
+// $categories is not set so a database query is needed
+          if ($current_category_id > 0) {
+            $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$current_category_id . "' and language_id = '" . (int)$languages_id . "' limit 1");
+            if (tep_db_num_rows($categories_query) > 0) {
+              $categories = tep_db_fetch_array($categories_query);
+
+              $oscTemplate->setTitle($categories['categories_name'] . ', ' . $oscTemplate->getTitle());
+            }
+          }
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_CATEGORY_TITLE_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Category Title Module', 'MODULE_HEADER_TAGS_CATEGORY_TITLE_STATUS', 'True', 'Do you want to allow category titles to be added to the page title?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_CATEGORY_TITLE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_CATEGORY_TITLE_STATUS', 'MODULE_HEADER_TAGS_CATEGORY_TITLE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_google_analytics.php 2.3.1.src/includes/modules/header_tags/ht_google_analytics.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_google_analytics.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_google_analytics.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,136 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_google_analytics {
+    var $code = 'ht_google_analytics';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_google_analytics() {
+      $this->title = MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_TITLE;
+      $this->description = MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $oscTemplate, $customer_id;
+
+      if (tep_not_null(MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_ID)) {
+        if (MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_JS_PLACEMENT != 'Header') {
+          $this->group = 'footer_scripts';
+        }
+
+        $header = '<script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push([\'_setAccount\', \'' . tep_output_string(MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_ID) . '\']);
+  _gaq.push([\'_trackPageview\']);' . "\n";
+
+        if ( (MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_EC_TRACKING == 'True') && (basename($PHP_SELF) == FILENAME_CHECKOUT_SUCCESS) && tep_session_is_registered('customer_id') ) {
+          $order_query = tep_db_query("select orders_id, billing_city, billing_state, billing_country from " . TABLE_ORDERS . " where customers_id = '" . (int)$customer_id . "' order by date_purchased desc limit 1");
+
+          if (tep_db_num_rows($order_query) == 1) {
+            $order = tep_db_fetch_array($order_query);
+
+            $totals = array();
+
+            $order_totals_query = tep_db_query("select value, class from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order['orders_id'] . "'");
+            while ($order_totals = tep_db_fetch_array($order_totals_query)) {
+              $totals[$order_totals['class']] = $order_totals['value'];
+            }
+
+            $header .= '  _gaq.push([\'_addTrans\',
+    \'' . (int)$order['orders_id'] . '\', // order ID - required
+    \'' . tep_output_string(STORE_NAME) . '\', // store name
+    \'' . (isset($totals['ot_total']) ? $this->format_raw($totals['ot_total'], DEFAULT_CURRENCY) : 0) . '\', // total - required
+    \'' . (isset($totals['ot_tax']) ? $this->format_raw($totals['ot_tax'], DEFAULT_CURRENCY) : 0) . '\', // tax
+    \'' . (isset($totals['ot_shipping']) ? $this->format_raw($totals['ot_shipping'], DEFAULT_CURRENCY) : 0) . '\', // shipping
+    \'' . tep_output_string_protected($order['billing_city']) . '\', // city
+    \'' . tep_output_string_protected($order['billing_state']) . '\', // state or province
+    \'' . tep_output_string_protected($order['billing_country']) . '\' // country
+  ]);' . "\n";
+
+            $order_products_query = tep_db_query("select op.products_id, pd.products_name, op.final_price, op.products_quantity from " . TABLE_ORDERS_PRODUCTS . " op, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_LANGUAGES . " l where op.orders_id = '" . (int)$order['orders_id'] . "' and op.products_id = pd.products_id and l.code = '" . tep_db_input(DEFAULT_LANGUAGE) . "' and l.languages_id = pd.language_id");
+            while ($order_products = tep_db_fetch_array($order_products_query)) {
+              $category_query = tep_db_query("select cd.categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " cd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_LANGUAGES . " l where p2c.products_id = '" . (int)$order_products['products_id'] . "' and p2c.categories_id = cd.categories_id and l.code = '" . tep_db_input(DEFAULT_LANGUAGE) . "' and l.languages_id = cd.language_id limit 1");
+              $category = tep_db_fetch_array($category_query);
+
+              $header .= '  _gaq.push([\'_addItem\',
+    \'' . (int)$order['orders_id'] . '\', // order ID - required
+    \'' . (int)$order_products['products_id'] . '\', // SKU/code - required
+    \'' . tep_output_string($order_products['products_name']) . '\', // product name
+    \'' . tep_output_string($category['categories_name']) . '\', // category
+    \'' . $this->format_raw($order_products['final_price']) . '\', // unit price - required
+    \'' . (int)$order_products['products_quantity'] . '\' // quantity - required
+  ]);' . "\n";
+            }
+
+            $header .= '  _gaq.push([\'_trackTrans\']); //submits transaction to the Analytics servers' . "\n";
+          }
+        }
+
+        $header .= '  (function() {
+    var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;
+    ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';
+    var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+</script>' . "\n";
+
+        $oscTemplate->addBlock($header, $this->group);
+      }
+    }
+
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Google Analytics Module', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_STATUS', 'True', 'Do you want to add Google Analytics to your shop?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Google Analytics ID', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_ID', '', 'The Google Analytics profile ID to track.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('E-Commerce Tracking', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_EC_TRACKING', 'True', 'Do you want to enable e-commerce tracking? (E-Commerce tracking must also be enabled in your Google Analytics profile settings)', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Javascript Placement', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_JS_PLACEMENT', 'Header', 'Should the Google Analytics javascript be loaded in the header or footer?', '6', '1', 'tep_cfg_select_option(array(\'Header\', \'Footer\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_STATUS', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_ID', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_EC_TRACKING', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_JS_PLACEMENT', 'MODULE_HEADER_TAGS_GOOGLE_ANALYTICS_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360/mc360.php 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360/mc360.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360/mc360.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360/mc360.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,193 @@
+<?php
+class mc360 {
+    var $system = "osc";
+    var $version = "1.1";
+    
+    var $debug = false;
+
+    var $apikey = '';
+    var $key_valid = false;
+    var $store_id = '';
+    
+    function mc360() {
+        $this->apikey = MODULE_HEADER_TAGS_MAILCHIMP_360_API_KEY;
+        $this->store_id = MODULE_HEADER_TAGS_MAILCHIMP_360_STORE_ID;
+        $this->key_valid = ((MODULE_HEADER_TAGS_MAILCHIMP_360_KEY_VALID == 'true') ? true : false);
+
+        if (tep_not_null(MODULE_HEADER_TAGS_MAILCHIMP_360_DEBUG_EMAIL)) {
+          $this->debug = true;
+        }
+
+        $this->validate_cfg();
+    }
+    
+    function complain($msg){
+            echo '<div style="position:absolute;left:0;top:0;width:100%;font-size:24px;text-align:center;background:#CCCCCC;color:#660000">MC360 Module: '.$msg.'</div><br />';
+    }
+
+    function validate_cfg(){
+        $this->valid_cfg = false;
+        if (empty($this->apikey)){
+            $this->complain('You have not entered your API key. Please read the installation instructions.');
+            return;
+        }
+        
+        if (!$this->key_valid){
+            $GLOBALS["mc_api_key"] = $this->apikey;
+            $api = new MCAPI('notused','notused');
+            $res = $api->ping();
+            if ($api->errorMessage!=''){
+                $this->complain('Server said: "'.$api->errorMessage.'". Your API key is likely invalid. Please read the installation instructions.');
+                return;
+            } else {
+                $this->key_valid = true;
+                tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = 'true' where configuration_key = 'MODULE_HEADER_TAGS_MAILCHIMP_360_KEY_VALID'");
+                
+                if (empty($this->store_id)){
+                    $this->store_id = md5(uniqid(rand(), true));
+                    tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . $this->store_id . "' where configuration_key = 'MODULE_HEADER_TAGS_MAILCHIMP_360_STORE_ID'");
+                }
+            }
+        }
+        
+        if (empty($this->store_id)){
+            $this->complain('Your Store ID has not been set. This is not good. Contact support.');
+        } else {
+            $this->valid_cfg = true;
+        }
+    }
+    function set_cookies(){
+        if (!$this->valid_cfg){
+            return;
+        }
+        $thirty_days = time()+60*60*24*30;
+        if (isset($_REQUEST['mc_cid'])){
+            setcookie('mailchimp_campaign_id',trim($_REQUEST['mc_cid']), $thirty_days);
+        }
+        if (isset($_REQUEST['mc_eid'])){
+            setcookie('mailchimp_email_id',trim($_REQUEST['mc_eid']), $thirty_days);
+        }
+        return;    
+    }
+    
+    function process() {
+        if (!$this->valid_cfg){
+            return;
+        }
+
+        global $order, $insert_id;
+
+        $orderId = $insert_id; // just to make it obvious.
+
+        $debug_email = '';
+
+        if ($this->debug){
+            $debug_email .= '------------[New Order ' . $orderId . ']-----------------' . "\n" .
+                            '$order =' . "\n" .
+                            print_r($order, true) .
+                            '$_COOKIE =' . "\n" .
+                            print_r($_COOKIE, true);
+        }
+        
+        if (!isset($_COOKIE['mailchimp_campaign_id']) || !isset($_COOKIE['mailchimp_email_id'])){
+            return;
+        }
+        
+        if ($this->debug){
+            $debug_email .= date('Y-m-d H:i:s') . ' current ids:' . "\n" .
+                            date('Y-m-d H:i:s') . ' eid =' . $_COOKIE['mailchimp_email_id'] . "\n" .
+                            date('Y-m-d H:i:s') . ' cid =' . $_COOKIE['mailchimp_campaign_id'] . "\n";
+        }
+
+        $customer_id = $_SESSION['customer_id'];
+
+        $orders_query = tep_db_query("select orders_id from " . TABLE_ORDERS . " where customers_id = '" . (int)$customer_id . "' order by date_purchased desc limit 1");
+        $orders = tep_db_fetch_array($orders_query);
+
+        $totals_array = array();
+        $totals_query = tep_db_query("select value, class from " . TABLE_ORDERS_TOTAL . " where orders_id = " . (int)$orders['orders_id']);
+        while ($totals = tep_db_fetch_array($totals_query)) {
+            $totals_array[$totals['class']] = $totals['value'];
+        }
+        
+        $products_array = array();
+        $products_query = tep_db_query("select products_id, products_model, products_name, products_tax, products_quantity, final_price from " . TABLE_ORDERS_PRODUCTS . " where orders_id = " . (int)$orders['orders_id']);
+        while ($products = tep_db_fetch_array($products_query)) {
+            $products_array[] = array('id' => $products['products_id'],
+                                    'name' => $products['products_name'],
+                                    'model' => $products['products_model'],
+                                    'qty' => $products['products_quantity'],
+                                    'final_price' => $products['final_price'],
+                                    );
+            $totals_array['ot_tax'] += $products['product_tax'];
+        }
+
+        $mcorder = array(
+                'id' => $orders['orders_id'],
+                'total'=>$totals_array['ot_total'],
+                'shipping'=>$totals_array['ot_shipping'],
+                'tax'  =>$totals_array['ot_tax'],
+                'items'=>array(),
+                'store_id'=>$this->store_id,
+                'store_name' => $_SERVER['SERVER_NAME'],
+                'campaign_id'=>$_COOKIE['mailchimp_campaign_id'],
+                'email_id'=>$_COOKIE['mailchimp_email_id'],
+                'plugin_id'=>1216
+                );
+
+        foreach($products_array as $product){
+            $item = array();
+            $item['line_num'] = $line;
+            $item['product_id'] = $product['id'];
+            $item['product_name'] = $product['name'];
+            $item['sku'] = $product['model'];
+            $item['qty'] = $product['qty'];
+            $item['cost'] = $product['final_price'];
+
+            //All this to get a silly category name from here
+            $cat_qry = tep_db_query("select categories_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = " . (int)$product['id']." limit 1");
+            $cats = tep_db_fetch_array($cat_qry);
+            $cat_id = $cats['categories_id'];
+            
+            $item['category_id'] = $cat_id;
+            $cat_name == '';
+            $continue = true; 
+            while($continue){            
+            //now recurse up the categories tree...
+                $cat_qry = tep_db_query("select c.categories_id, c.parent_id, cd.categories_name from  " . TABLE_CATEGORIES . " c inner join " . TABLE_CATEGORIES_DESCRIPTION . " cd on c.categories_id = cd.categories_id where c.categories_id =".$cat_id);
+                $cats = tep_db_fetch_array($cat_qry);
+                if ($cat_name == ''){
+                    $cat_name = $cats['categories_name'];
+                } else {
+                    $cat_name = $cats['categories_name'] .' - '.$cat_name;
+                }
+                $cat_id = $cats['parent_id'];
+                if ($cat_id==0){
+                    $continue = false;
+                }
+            }
+            $item['category_name'] = $cat_name;
+            
+            $mcorder['items'][] = $item;
+        }
+
+        $GLOBALS["mc_api_key"] = $this->apikey;
+        $api = new MCAPI('notused','notused');
+        $res = $api->campaignEcommAddOrder($mcorder);
+        if ($api->errorMessage!=''){
+            if ($this->debug) {
+              $debug_email .= 'Error:' . "\n" .
+                               $api->errorMessage . "\n";
+            }
+        } else {
+            //nothing
+        }
+        // send!()
+
+        if ($this->debug && !empty($debug_email)) {
+            tep_mail('', MODULE_HEADER_TAGS_MAILCHIMP_360_DEBUG_EMAIL, 'MailChimp Debug E-Mail', $debug_email, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+        }
+  }//update
+}//mc360 class
+
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360/MCAPI.class.php 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360/MCAPI.class.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360/MCAPI.class.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360/MCAPI.class.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,1664 @@
+<?php
+
+class MCAPI {
+    var $version = "1.2";
+    var $errorMessage;
+    var $errorCode;
+    
+    /**
+     * Cache the information on the API location on the server
+     */
+    var $apiUrl;
+    
+    /**
+     * Default to a 300 second timeout on server calls
+     */
+    var $timeout = 300; 
+    
+    /**
+     * Default to a 8K chunk size
+     */
+    var $chunkSize = 8192;
+    
+    /**
+     * Cache the user api_key so we only have to log in once per client instantiation
+     */
+    var $api_key;
+
+    /**
+     * Cache the user api_key so we only have to log in once per client instantiation
+     */
+    var $secure = false;
+    
+    /**
+     * Connect to the MailChimp API for a given list. All MCAPI calls require login before functioning
+     * 
+     * @param string $username_or_apikey Your MailChimp login user name OR apikey - always required
+     * @param string $password Your MailChimp login password - only required when username passed instead of API Key
+     */
+    function MCAPI($username_or_apikey, $password=null, $secure=false) {
+        //do more "caching" of the uuid for those people that keep instantiating this...
+        $this->secure = $secure;
+        $this->apiUrl = parse_url("http://api.mailchimp.com/" . $this->version . "/?output=php");
+        if ( isset($GLOBALS["mc_api_key"]) && $GLOBALS["mc_api_key"]!="" ){
+            $this->api_key = $GLOBALS["mc_api_key"];
+        } elseif( $username_or_apikey && !$password ){
+            $this->api_key = $GLOBALS["mc_api_key"] = $username_or_apikey;
+        }  else {
+            $this->api_key = $this->callServer("login", array("username" => $username_or_apikey, "password" => $password));
+            $GLOBALS["mc_api_key"] = $this->api_key;
+        }
+    }
+    function setTimeout($seconds){
+        if (is_int($seconds)){
+            $this->timeout = $seconds;
+            return true;
+        }
+    }
+    function getTimeout(){
+        return $this->timeout;
+    }
+    function useSecure($val){
+        if ($val===true){
+            $this->secure = true;
+        } else {
+            $this->secure = false;
+        }
+    }
+    
+    /**
+     * Unschedule a campaign that is scheduled to be sent in the future
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignUnschedule.php
+     * @example xml-rpc_campaignUnschedule.php
+     *
+     * @param string $cid the id of the campaign to unschedule
+     * @return boolean true on success
+     */
+    function campaignUnschedule($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignUnschedule", $params);
+    }
+
+    /**
+     * Schedule a campaign to be sent in the future
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignSchedule.php
+     * @example xml-rpc_campaignSchedule.php
+     *
+     * @param string $cid the id of the campaign to schedule
+     * @param string $schedule_time the time to schedule the campaign. For A/B Split "schedule" campaigns, the time for Group A - in YYYY-MM-DD HH:II:SS format in <strong>GMT</strong>
+     * @param string $schedule_time_b optional -the time to schedule Group B of an A/B Split "schedule" campaign - in YYYY-MM-DD HH:II:SS format in <strong>GMT</strong>
+     * @return boolean true on success
+     */
+    function campaignSchedule($cid, $schedule_time, $schedule_time_b=NULL) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["schedule_time"] = $schedule_time;
+        $params["schedule_time_b"] = $schedule_time_b;
+        return $this->callServer("campaignSchedule", $params);
+    }
+
+    /**
+     * Resume sending an AutoResponder or RSS campaign
+     *
+     * @section Campaign  Related
+     *
+     * @param string $cid the id of the campaign to pause
+     * @return boolean true on success
+     */
+    function campaignResume($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignResume", $params);
+    }
+
+    /**
+     * Pause an AutoResponder orRSS campaign from sending
+     *
+     * @section Campaign  Related
+     *
+     * @param string $cid the id of the campaign to pause
+     * @return boolean true on success
+     */
+    function campaignPause($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignPause", $params);
+    }
+
+    /**
+     * Send a given campaign immediately
+     *
+     * @section Campaign  Related
+     *
+     * @example mcapi_campaignSendNow.php
+     * @example xml-rpc_campaignSendNow.php
+     *
+     * @param string $cid the id of the campaign to resume
+     * @return boolean true on success
+     */
+    function campaignSendNow($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignSendNow", $params);
+    }
+
+    /**
+     * Send a test of this campaign to the provided email address
+     *
+     * @section Campaign  Related
+     *
+     * @example mcapi_campaignSendTest.php
+     * @example xml-rpc_campaignSendTest.php
+     *
+     * @param string $cid the id of the campaign to test
+     * @param array $test_emails an array of email address to receive the test message
+     * @param string $send_type optional by default (null) both formats are sent - "html" or "text" send just that format
+     * @return boolean true on success
+     */
+    function campaignSendTest($cid, $test_emails=array (
+), $send_type=NULL) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["test_emails"] = $test_emails;
+        $params["send_type"] = $send_type;
+        return $this->callServer("campaignSendTest", $params);
+    }
+
+    /**
+     * Retrieve all templates defined for your user account
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignTemplates.php
+     * @example xml-rpc_campaignTemplates.php
+     *
+     * @return array An array of structs, one for each template (see Returned Fields for details)
+     * @returnf integer id Id of the template
+     * @returnf string name Name of the template
+     * @returnf string layout Layout of the template - "basic", "left_column", "right_column", or "postcard"
+     * @returnf array sections associative array of editable sections in the template that can accept custom HTML when sending a campaign
+     */
+    function campaignTemplates() {
+        $params = array();
+        return $this->callServer("campaignTemplates", $params);
+    }
+
+    /**
+     * Allows one to test their segmentation rules before creating a campaign using them
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignSegmentTest.php
+     * @example xml-rpc_campaignSegmentTest.php
+     *
+     * @param string $list_id the list to test segmentation on - get lists using lists()
+     * @param array $options with 2 keys:  
+             string "match" controls whether to use AND or OR when applying your options - expects "<strong>any</strong>" (for OR) or "<strong>all</strong>" (for AND)
+             array "conditions" - up to 10 different criteria to apply while segmenting. Each criteria row must contain 3 keys - "<strong>field</strong>", "<strong>op</strong>", and "<strong>value</strong>" - and possibly a fourth, "<strong>extra</strong>", based on these definitions:
+    
+            Field = "<strong>date</strong>" : Select based on various dates we track
+                Valid Op(eration): <strong>eq</strong> (is) / <strong>gt</strong> (after) / <strong>lt</strong> (before)
+                Valid Values: 
+                string last_campaign_sent  uses the date of the last campaign sent
+                string campaign_id - uses the send date of the campaign that carriers the Id submitted - see campaigns()
+                string YYYY-MM-DD - any date in the form of YYYY-MM-DD - <em>note:</em> anything that appears to start with YYYY will be treated as a date
+                          
+            Field = "<strong>interests</strong>":
+                Valid Op(erations): <strong>one</strong> / <strong>none</strong> / <strong>all</strong> 
+                Valid Values: a comma delimited of interest groups for the list - see listInterestGroups()    
+        
+            Field = "<strong>aim</strong>"
+                Valid Op(erations): <strong>open</strong> / <strong>noopen</strong> / <strong>click</strong> / <strong>noclick</strong>
+                Valid Values: "<strong>any</strong>" or a valid AIM-enabled Campaign that has been sent
+    
+            Field = "<strong>rating</strong>" : allows matching based on list member ratings
+                Valid Op(erations):  <strong>eq</strong> (=) / <strong>ne</strong> (!=) / <strong>gt</strong> (&gt;) / <strong>lt</strong> (&lt;)
+                Valid Values: a number between 0 and 5
+    
+            Field = "<strong>ecomm_prod</strong>" or "<strong>ecomm_prod</strong>": allows matching product and category names from purchases
+                Valid Op(erations): 
+                 <strong>eq</strong> (=) / <strong>ne</strong> (!=) / <strong>gt</strong> (&gt;) / <strong>lt</strong> (&lt;) / <strong>like</strong> (like '%blah%') / <strong>nlike</strong> (not like '%blah%') / <strong>starts</strong> (like 'blah%') / <strong>ends</strong> (like '%blah')
+                Valid Values: any string
+    
+            Field = "<strong>ecomm_spent_one</strong>" or "<strong>ecomm_spent_all</strong>" : allows matching purchase amounts on a single order or all orders
+                Valid Op(erations): <strong>gt</strong> (&gt;) / <strong>lt</strong> (&lt;)
+                Valid Values: a number
+    
+            Field = "<strong>ecomm_date</strong>" : allow matching based on order dates
+                Valid Op(eration): <strong>eq</strong> (is) / <strong>gt</strong> (after) / <strong>lt</strong> (before)
+                Valid Values: 
+                string YYYY-MM-DD - any date in the form of YYYY-MM-DD
+    
+            Field = An <strong>Address</strong> Merge Var. Use <strong>Merge0-Merge30</strong> or the <strong>Custom Tag</strong> you've setup for your merge field - see listMergeVars(). Note, Address fields can still be used with the default operations below - this section is broken out solely to highlight the differences in using the geolocation routines.
+                Valid Op(erations): <strong>geoin</strong>
+                Valid Values: The number of miles an address should be within
+                Extra Value: The Zip Code to be used as the center point
+        
+            Default Field = A Merge Var. Use <strong>Merge0-Merge30</strong> or the <strong>Custom Tag</strong> you've setup for your merge field - see listMergeVars()
+                Valid Op(erations): 
+                 <strong>eq</strong> (=) / <strong>ne</strong> (!=) / <strong>gt</strong> (&gt;) / <strong>lt</strong> (&lt;) / <strong>like</strong> (like '%blah%') / <strong>nlike</strong> (not like '%blah%') / <strong>starts</strong> (like 'blah%') / <strong>ends</strong> (like '%blah')
+                Valid Values: any string
+     * @return integer total The total number of subscribers matching your segmentation options
+     */
+    function campaignSegmentTest($list_id, $options) {
+        $params = array();
+        $params["list_id"] = $list_id;
+        $params["options"] = $options;
+        return $this->callServer("campaignSegmentTest", $params);
+    }
+
+    /**
+     * Create a new draft campaign to send
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignCreate.php
+     * @example xml-rpc_campaignCreate.php
+     * @example xml-rpc_campaignCreateABSplit.php
+     * @example xml-rpc_campaignCreateRss.php
+     *
+     * @param string $type the Campaign Type to create - one of "regular", "plaintext", "absplit", "rss", "trans", "auto"
+     * @param array $options a hash of the standard options for this campaign :
+            string list_id the list to send this campaign to- get lists using lists()
+            string subject the subject line for your campaign message
+            string from_email the From: email address for your campaign message
+            string from_name the From: name for your campaign message (not an email address)
+            string to_email the To: name recipients will see (not email address)
+            integer template_id optional - use this template to generate the HTML content of the campaign
+            integer folder_id optional - automatically file the new campaign in the folder_id passed
+            array tracking optional - set which recipient actions will be tracked, as a struct of boolean values with the following keys: "opens", "html_clicks", and "text_clicks".  By default, opens and HTML clicks will be tracked.
+            string title optional - an internal name to use for this campaign.  By default, the campaign subject will be used.
+            boolean authenticate optional - set to true to enable SenderID, DomainKeys, and DKIM authentication, defaults to false.
+            array analytics optional - if provided, use a struct with "service type" as a key and the "service tag" as a value. For Google, this should be "google"=>"your_google_analytics_key_here". Note that only "google" is currently supported - a Google Analytics tags will be added to all links in the campaign with this string attached. Others may be added in the future
+            boolean auto_footer optional Whether or not we should auto-generate the footer for your content. Mostly useful for content from URLs or Imports
+            boolean inline_css optional Whether or not css should be automatically inlined when this campaign is sent, defaults to false.
+            boolean generate_text optional Whether of not to auto-generate your Text content from the HTML content. Note that this will be ignored if the Text part of the content passed is not empty, defaults to false.
+    
+    * @param array $content the content for this campaign - use a struct with the following keys: 
+                "html" for pasted HTML content
+                "text" for the plain-text version
+                "url" to have us pull in content from a URL. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
+                "archive" to send a Base64 encoded archive file for us to import all media from. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
+                "archive_type" optional - only necessary for the "archive" option. Supported formats are: zip, tar.gz, tar.bz2, tar, tgz, tbz . If not included, we will default to zip
+                
+                
+                If you chose a template instead of pasting in your HTML content, then use "html_" followed by the template sections as keys - for example, use a key of "html_MAIN" to fill in the "MAIN" section of a template. Supported template sections include: "html_HEADER", "html_MAIN", "html_SIDECOLUMN", and "html_FOOTER"
+    * @param array $segment_opts optional - if you wish to do Segmentation with this campaign this array should contain: see campaignSegmentTest(). It's suggested that you test your options against campaignSegmentTest(). Also, "trans" campaigns <strong>do not</strong> support segmentation.
+    * @param array $type_opts optional - 
+            For RSS Campaigns this, array should contain:
+                string url the URL to pull RSS content from - it will be verified and must exist
+                string schedule optional one of "daily", "weekly", "monthly" - defaults to "daily"
+                string schedule_hour optional an hour between 0 and 24 - default to 4 (4am <em>local time</em>) - applies to all schedule types
+                string schedule_weekday optional for "weekly" only, a number specifying the day of the week to send: 0 (Sunday) - 6 (Saturday) - defaults to 1 (Monday)
+                string schedule_monthday optional for "monthly" only, a number specifying the day of the month to send (1 - 28) or "last" for the last day of a given month. Defaults to the 1st day of the month
+             
+            For A/B Split campaigns, this array should contain:
+                string split_test The values to segment based on. Currently, one of: "subject", "from_name", "schedule". NOTE, for "schedule", you will need to call campaignSchedule() separately!
+                string pick_winner How the winner will be picked, one of: "opens" (by the open_rate), "clicks" (by the click rate), "manual" (you pick manually)
+                integer wait_units optional the default time unit to wait before auto-selecting a winner - use "3600" for hours, "86400" for days. Defaults to 86400.
+                integer wait_time optional the number of units to wait before auto-selecting a winner - defaults to 1, so if not set, a winner will be selected after 1 Day.
+                integer split_size optional this is a percentage of what size the Campaign's List plus any segmentation options results in. "schedule" type forces 50%, all others default to 10%
+                string from_name_a optional sort of, required when split_test is "from_name"
+                string from_name_b optional sort of, required when split_test is "from_name"
+                string from_email_a optional sort of, required when split_test is "from_name"
+                string from_email_b optional sort of, required when split_test is "from_name"
+                string subject_a optional sort of, required when split_test is "subject"
+                string subject_b optional sort of, required when split_test is "subject"
+                
+            For AutoResponder campaigns, this array should contain:
+                string offset-units one of "day", "week", "month", "year" - required
+                string offset-time the number of units, must be a number greater than 0 - required
+                string offset-dir either "before" or "after"
+                string event optional "signup" (default) to base this on double-optin signup, "date" or "annual" to base this on merge field in the list
+                string event-datemerge optional sort of, this is required if the event is "date" or "annual"
+    
+     *
+     * @return string the ID for the created campaign
+     */
+    function campaignCreate($type, $options, $content, $segment_opts=NULL, $type_opts=NULL) {
+        $params = array();
+        $params["type"] = $type;
+        $params["options"] = $options;
+        $params["content"] = $content;
+        $params["segment_opts"] = $segment_opts;
+        $params["type_opts"] = $type_opts;
+        return $this->callServer("campaignCreate", $params);
+    }
+
+    /** Update just about any setting for a campaign that has <em>not</em> been sent. See campaignCreate() for details
+     *
+     *  Caveats:<br/><ul>
+     *        <li>If you set list_id, all segmentation options will be deleted and must be re-added.</li>
+     *        <li>If you set template_id, you need to follow that up by setting it's 'content'</li>
+     *        <li>If you set segment_opts, you should have tested your options against campaignSegmentTest() as campaignUpdate() will not allow you to set a segment that includes no members.</li></ul>
+     * @section Campaign  Related
+     *
+     * @example mcapi_campaignUpdate.php
+     * @example mcapi_campaignUpdateAB.php
+     * @example xml-rpc_campaignUpdate.php
+     * @example xml-rpc_campaignUpdateAB.php
+     *
+     * @param string $cid the Campaign Id to update
+     * @param string $name the parameter name ( see campaignCreate() )
+     * @param mixed  $value an appropriate value for the parameter ( see campaignCreate() )
+     * @return boolean true if the update succeeds, otherwise an error will be thrown
+     */
+    function campaignUpdate($cid, $name, $value) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["name"] = $name;
+        $params["value"] = $value;
+        return $this->callServer("campaignUpdate", $params);
+    }
+
+    /** Replicate a campaign.
+    *
+    * @section Campaign  Related
+    *
+    * @example mcapi_campaignReplicate.php
+    *
+    * @param string $cid the Campaign Id to replicate
+    * @return string the id of the replicated Campaign created, otherwise an error will be thrown
+    */
+    function campaignReplicate($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignReplicate", $params);
+    }
+
+    /** Delete a campaign. Seriously, "poof, gone!" - be careful!
+    *
+    * @section Campaign  Related
+    *
+    * @example mcapi_campaignDelete.php
+    *
+    * @param string $cid the Campaign Id to delete
+    * @return boolean true if the delete succeeds, otherwise an error will be thrown
+    */
+    function campaignDelete($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignDelete", $params);
+    }
+
+    /**
+     * Get the list of campaigns and their details matching the specified filters
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaigns.php
+     * @example xml-rpc_campaigns.php
+     *
+     * @param array $filters a hash of filters to apply to this query - all are optional:
+            string  campaign_id optional - return a single campaign using a know campaign_id
+            string  list_id optional - the list to send this campaign to- get lists using lists()
+            integer folder_id optional - only show campaigns from this folder id - get folders using campaignFolders()
+            string  type optional - return campaigns of a specific type - one of "regular", "plaintext", "absplit", "rss", "trans", "auto"
+            string  from_name optional - only show campaigns that have this "From Name"
+            string  from_email optional - only show campaigns that have this "Reply-to Email"
+            string  title optional - only show campaigns that have this title
+            string  subject optional - only show campaigns that have this subject
+            string  sendtime_start optional - only show campaigns that have been sent since this date/time (in GMT) - format is YYYY-MM-DD HH:mm:ss (24hr)
+            string  sendtime_end optional - only show campaigns that have been sent before this date/time (in GMT) - format is YYYY-MM-DD HH:mm:ss (24hr)
+            boolean exact optional - flag for whether to filter on exact values when filtering, or search within content for filter values - defaults to true
+     * @param integer $start optional - control paging of campaigns, start results at this campaign #, defaults to 1st page of data  (page 0)
+     * @param integer $limit optional - control paging of campaigns, number of campaigns to return with each call, defaults to 25 (max=1000)
+     * @return array list of campaigns and their associated information (see Returned Fields for description)
+     * @returnf string id Campaign Id (used for all other campaign functions)
+     * @returnf integer web_id The Campaign id used in our web app, allows you to create a link directly to it
+     * @returnf string title Title of the campaign
+     * @returnf string type The type of campaign this is (regular,plaintext,absplit,rss,inspection,trans,auto)
+     * @returnf date create_time Creation time for the campaign
+     * @returnf date send_time Send time for the campaign
+     * @returnf integer emails_sent Number of emails email was sent to
+     * @returnf string status Status of the given campaign (save,paused,schedule,sending,sent)
+     * @returnf string from_name From name of the given campaign
+     * @returnf string from_email Reply-to email of the given campaign
+     * @returnf string subject Subject of the given campaign
+     * @returnf string to_email Custom "To:" email string using merge variables
+     * @returnf string archive_url Archive link for the given campaign
+     * @returnf boolean inline_css Whether or not the campaigns content auto-css-lined
+     * @returnf string analytics Either "google" if enabled or "N" if disabled
+     * @returnf string analytcs_tag The name/tag the campaign's links were tagged with if analytics were enabled.
+     * @returnf boolean track_clicks_text Whether or not links in the text version of the campaign were tracked
+     * @returnf boolean track_clicks_html Whether or not links in the html version of the campaign were tracked
+     * @returnf boolean track_opens Whether or not opens for the campaign were tracked
+     * @returnf array segment_opts the segment used for the campaign - can be passed to campaignSegmentTest() or campaignCreate()
+     */
+    function campaigns($filters=array (
+), $start=0, $limit=25) {
+        $params = array();
+        $params["filters"] = $filters;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaigns", $params);
+    }
+
+    /**
+     * List all the folders for a user account
+     *
+     * @section Campaign  Related
+     * @example mcapi_campaignFolders.php
+     * @example xml-rpc_campaignFolders.php
+     *
+     * @return array Array of folder structs (see Returned Fields for details)
+     * @returnf integer folder_id Folder Id for the given folder, this can be used in the campaigns() function to filter on.
+     * @returnf string name Name of the given folder
+     */
+    function campaignFolders() {
+        $params = array();
+        return $this->callServer("campaignFolders", $params);
+    }
+
+    /**
+     * Given a list and a campaign, get all the relevant campaign statistics (opens, bounces, clicks, etc.)
+     *
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignStats.php
+     * @example xml-rpc_campaignStats.php
+     *
+     * @param string $cid the campaign id to pull stats for (can be gathered using campaigns())
+     * @return array struct of the statistics for this campaign
+     * @returnf integer syntax_errors Number of email addresses in campaign that had syntactical errors.
+     * @returnf integer hard_bounces Number of email addresses in campaign that hard bounced.
+     * @returnf integer soft_bounces Number of email addresses in campaign that soft bounced.
+     * @returnf integer unsubscribes Number of email addresses in campaign that unsubscribed.
+     * @returnf integer abuse_reports Number of email addresses in campaign that reported campaign for abuse.
+     * @returnf integer forwards Number of times email was forwarded to a friend.
+     * @returnf integer forwards_opens Number of times a forwarded email was opened.
+     * @returnf integer opens Number of times the campaign was opened.
+     * @returnf date last_open Date of the last time the email was opened.
+     * @returnf integer unique_opens Number of people who opened the campaign.
+     * @returnf integer clicks Number of times a link in the campaign was clicked.
+     * @returnf integer unique_clicks Number of unique recipient/click pairs for the campaign.
+     * @returnf date last_click Date of the last time a link in the email was clicked.
+     * @returnf integer users_who_clicked Number of unique recipients who clicked on a link in the campaign.
+     * @returnf integer emails_sent Number of email addresses campaign was sent to.
+     */
+    function campaignStats($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignStats", $params);
+    }
+
+    /**
+     * Get an array of the urls being tracked, and their click counts for a given campaign
+     *
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignClickStats.php
+     * @example xml-rpc_campaignClickStats.php
+     *
+     * @param string $cid the campaign id to pull stats for (can be gathered using campaigns())
+     * @return struct urls will be keys and contain their associated statistics:
+     * @returnf integer clicks Number of times the specific link was clicked
+     * @returnf integer unique Number of unique people who clicked on the specific link
+     */
+    function campaignClickStats($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignClickStats", $params);
+    }
+
+    /**
+     * Get the top 5 performing email domains for this campaign. Users want more than 5 should use campaign campaignEmailStatsAIM()
+     * or campaignEmailStatsAIMAll() and generate any additional stats they require.
+     * 
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignEmailDomainPerformance.php
+     *
+     * @param string $cid the campaign id to pull email domain performance for (can be gathered using campaigns())
+     * @return array domains email domains and their associated stats
+     * @returnf string domain Domain name or special "Other" to roll-up stats past 5 domains
+     * @returnf integer total_sent Total Email across all domains - this will be the same in every row
+     * @returnf integer emails Number of emails sent to this domain
+     * @returnf integer bounces Number of bounces
+     * @returnf integer opens Number of opens
+     * @returnf integer clicks Number of clicks
+     * @returnf integer unsubs Number of unsubs
+     * @returnf integer delivered Number of deliveries
+     * @returnf integer emails_pct Percentage of emails that went to this domain (whole number)
+     * @returnf integer bounces_pct Percentage of bounces from this domain (whole number)
+     * @returnf integer opens_pct Percentage of opens from this domain (whole number)
+     * @returnf integer clicks_pct Percentage of clicks from this domain (whole number)
+     * @returnf integer unsubs_pct Percentage of unsubs from this domain (whole number) 
+     */
+    function campaignEmailDomainPerformance($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignEmailDomainPerformance", $params);
+    }
+
+    /**
+     * Get all email addresses with Hard Bounces for a given campaign
+     *
+     * @section Campaign  Stats
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array Arrays of email addresses with Hard Bounces
+     */
+    function campaignHardBounces($cid, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignHardBounces", $params);
+    }
+
+    /**
+     * Get all email addresses with Soft Bounces for a given campaign
+     *
+     * @section Campaign  Stats
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array Arrays of email addresses with Soft Bounces
+     */
+    function campaignSoftBounces($cid, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignSoftBounces", $params);
+    }
+
+    /**
+     * Get all unsubscribed email addresses for a given campaign
+     *
+     * @section Campaign  Stats
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array list of email addresses that unsubscribed from this campaign
+     */
+    function campaignUnsubscribes($cid, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignUnsubscribes", $params);
+    }
+
+    /**
+     * Get all email addresses that complained about a given campaign
+     *
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignAbuseReports.php
+     *
+     * @param string $cid the campaign id to pull abuse reports for (can be gathered using campaigns())
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 500, upper limit set at 1000
+     * @param string $since optional pull only messages since this time - use YYYY-MM-DD HH:II:SS format in <strong>GMT</strong>
+     * @return array reports the abuse reports for this campaign
+     * @returnf string date date/time the abuse report was received and processed
+     * @returnf string email the email address that reported abuse
+     * @returnf string type an internal type generally specifying the orginating mail provider - may not be useful outside of filling report views
+     */
+    function campaignAbuseReports($cid, $since=NULL, $start=0, $limit=500) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["since"] = $since;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignAbuseReports", $params);
+    }
+
+    /**
+     * Retrieve the text presented in our app for how a campaign performed and any advice we may have for you - best
+     * suited for display in customized reports pages. Note: some messages will contain HTML - clean tags as necessary
+     *
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignAdvice.php
+     *
+     * @param string $cid the campaign id to pull advice text for (can be gathered using campaigns())
+     * @return array advice on the campaign's performance
+     * @returnf msg the advice message
+     * @returnf type the "type" of the message. one of: negative, positive, or neutral
+     */
+    function campaignAdvice($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignAdvice", $params);
+    }
+
+    /**
+     * Retrieve the Google Analytics data we've collected for this campaign. Note, requires Google Analytics Add-on to be installed and configured.
+     *
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignAnalytics.php
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @return array analytics we've collected for the passed campaign.
+     * @returnf integer visits number of visits
+     * @returnf integer pages number of page views
+     * @returnf integer new_visits new visits recorded
+     * @returnf integer bounces vistors who "bounced" from your site
+     * @returnf double time_on_site
+     * @returnf integer goal_conversions number of goals converted
+     * @returnf double goal_value value of conversion in dollars
+     * @returnf double revenue revenue generated by campaign
+     * @returnf integer transactions number of transactions tracked
+     * @returnf integer ecomm_conversions number Ecommerce transactions tracked
+     * @returnf array goals an array containing goal names and number of conversions
+     */
+    function campaignAnalytics($cid) {
+        $params = array();
+        $params["cid"] = $cid;
+        return $this->callServer("campaignAnalytics", $params);
+    }
+
+    /**
+     * Retrieve the full bounce messages for the given campaign. Note that this can return very large amounts
+     * of data depending on how large the campaign was and how much cruft the bounce provider returned. Also,
+     * message over 30 days old are subject to being removed
+     * 
+     * @section Campaign  Stats
+     *
+     * @example mcapi_campaignBounceMessages.php
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 25, upper limit set at 50
+     * @param string $since optional pull only messages since this time - use YYYY-MM-DD format in <strong>GMT</strong> (we only store the date, not the time)
+     * @return array bounces the full bounce messages for this campaign
+     * @returnf string date date/time the bounce was received and processed
+     * @returnf string email the email address that bounced
+     * @returnf string message the entire bounce message received
+     */
+    function campaignBounceMessages($cid, $start=0, $limit=25, $since=NULL) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        $params["since"] = $since;
+        return $this->callServer("campaignBounceMessages", $params);
+    }
+
+    /**
+     * Retrieve the Ecommerce Orders tracked by campaignEcommAddOrder()
+     * 
+     * @section Campaign  Stats
+     *
+     * @param string $cid the campaign id to pull bounces for (can be gathered using campaigns())
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 100, upper limit set at 500
+     * @param string $since optional pull only messages since this time - use YYYY-MM-DD HH:II:SS format in <strong>GMT</strong>
+     * @return array orders the orders and their details that we've collected for this campaign
+     * @returnf store_id string the store id generated by the plugin used to uniquely identify a store
+     * @returnf store_name string the store name collected by the plugin - often the domain name
+     * @returnf order_id string the internal order id the store tracked this order by
+     * @returnf email string the email address that received this campaign and is associated with this order
+     * @returnf order_total double the order total
+     * @returnf tax_total double the total tax for the order (if collected)
+     * @returnf ship_total double the shipping total for the order (if collected)
+     * @returnf order_date string the date the order was tracked - from the store if possible, otherwise the GMT time we recieved it
+     * @returnf lines array containing detail of the order - product, category, quantity, item cost
+     */
+    function campaignEcommOrders($cid, $start=0, $limit=100, $since=NULL) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        $params["since"] = $since;
+        return $this->callServer("campaignEcommOrders", $params);
+    }
+
+    /**
+     * Get the URL to a customized VIP Report for the specified campaign and optionally send an email to someone with links to it. Note subsequent calls will overwrite anything already set for the same campign (eg, the password)
+     *
+     * @section Campaign  Related
+     *
+     * @param string $cid the campaign id to share a report for (can be gathered using campaigns())
+     * @param array  $opts optional various parameters which can be used to configure the shared report
+            string  header_type optional - "text" or "image', defaults to "text'
+            string  header_data optional - if "header_type" is text, the text to display. if "header_type" is "image" a valid URL to an image file. Note that images will be resized to be no more than 500x150. Defaults to the Accounts Company Name.
+            bool    secure optional - whether to require a password for the shared report. defaults to "true"
+            string  password optional - if secure is true and a password is not included, we will generate one. It is always returned.
+            string  to_email optional - optional, email address to share the report with - no value means an email will not be sent
+            array   theme  optional - an array containing either 3 or 6 character color code values for: "bg_color", "header_color", "current_tab", "current_tab_text", "normal_tab", "normal_tab_text", "hover_tab", "hover_tab_text"
+            string  css_url    optional - a link to an external CSS file to be included after our default CSS (http://vip-reports.net/css/vip.css) <strong>only if</strong> loaded in an IFRAME - max 255 characters
+     * @return struct Struct containing details for the shared report
+     * @returnf string title The Title of the Campaign being shared
+     * @returnf string url The URL to the shared report
+     * @returnf string secure_url The URL to the shared report, including the password (good for loading in an IFRAME). For non-secure reports, this will not be returned
+     * @returnf string password If secured, the password for the report, otherwise this field will not be returned
+     */
+    function campaignShareReport($cid, $opts=array (
+)) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["opts"] = $opts;
+        return $this->callServer("campaignShareReport", $params);
+    }
+
+    /**
+     * Get the content (both html and text) for a campaign either as it would appear in the campaign archive or as the raw, original content
+     *
+     * @section Campaign  Related
+     *
+     * @param string $cid the campaign id to get content for (can be gathered using campaigns())
+     * @param bool   $for_archive optional controls whether we return the Archive version (true) or the Raw version (false), defaults to true
+     * @return struct Struct containing all content for the campaign (see Returned Fields for details
+     * @returnf string html The HTML content used for the campgain with merge tags intact
+     * @returnf string text The Text content used for the campgain with merge tags intact
+     */
+    function campaignContent($cid, $for_archive=true) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["for_archive"] = $for_archive;
+        return $this->callServer("campaignContent", $params);
+    }
+
+    /**
+     * Retrieve the list of email addresses that opened a given campaign with how many times they opened - note: this AIM function is free and does
+     * not actually require the AIM module to be installed
+     *
+     * @section Campaign AIM
+     *
+     * @param string $cid the campaign id to get opens for (can be gathered using campaigns())
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array Array of structs containing email addresses and open counts
+     * @returnf string email Email address that opened the campaign
+     * @returnf integer open_count Total number of times the campaign was opened by this email address
+     */
+    function campaignOpenedAIM($cid, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignOpenedAIM", $params);
+    }
+
+    /**
+     * Retrieve the list of email addresses that did not open a given campaign
+     *
+     * @section Campaign AIM
+     *
+     * @param string $cid the campaign id to get no opens for (can be gathered using campaigns())
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array list of email addresses that did not open a campaign
+     */
+    function campaignNotOpenedAIM($cid, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignNotOpenedAIM", $params);
+    }
+
+    /**
+     * Return the list of email addresses that clicked on a given url, and how many times they clicked
+     *
+     * @section Campaign AIM
+     *
+     * @param string $cid the campaign id to get click stats for (can be gathered using campaigns())
+     * @param string $url the URL of the link that was clicked on
+     * @param integer    $start optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
+     * @param integer    $limit optional for large data sets, the number of results to return - defaults to 1000, upper limit set at 15000
+     * @return array Array of structs containing email addresses and click counts
+     * @returnf string email Email address that opened the campaign
+     * @returnf integer clicks Total number of times the URL was clicked on by this email address
+     */
+    function campaignClickDetailAIM($cid, $url, $start=0, $limit=1000) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["url"] = $url;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignClickDetailAIM", $params);
+    }
+
+    /**
+     * Given a campaign and email address, return the entire click and open history with timestamps, ordered by time
+     *
+     * @section Campaign AIM
+     *
+     * @param string $cid the campaign id to get stats for (can be gathered using campaigns())
+     * @param string $email_address the email address to check
+     * @return array Array of structs containing the actions (opens and clicks) that the email took, with timestamps
+     * @returnf string action The action taken (open or click)
+     * @returnf date timestamp Time the action occurred
+     * @returnf string url For clicks, the URL that was clicked
+     */
+    function campaignEmailStatsAIM($cid, $email_address) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["email_address"] = $email_address;
+        return $this->callServer("campaignEmailStatsAIM", $params);
+    }
+
+    /**
+     * Given a campaign and correct paging limits, return the entire click and open history with timestamps, ordered by time, 
+     * for every user a campaign was delivered to.
+     *
+     * @section Campaign AIM
+     * @example mcapi_campaignEmailStatsAIMAll.php
+     *
+     * @param string $cid the campaign id to get stats for (can be gathered using campaigns())
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 100, upper limit set at 1000
+     * @return array Array of structs containing actions  (opens and clicks) for each email, with timestamps
+     * @returnf string action The action taken (open or click)
+     * @returnf date timestamp Time the action occurred
+     * @returnf string url For clicks, the URL that was clicked
+     */
+    function campaignEmailStatsAIMAll($cid, $start=0, $limit=100) {
+        $params = array();
+        $params["cid"] = $cid;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("campaignEmailStatsAIMAll", $params);
+    }
+
+    /**
+     * Attach Ecommerce Order Information to a Campaign. This will generall be used by ecommerce package plugins 
+     * <a href="/plugins/ecomm360.phtml">that we provide</a> or by 3rd part system developers.
+     * @section Campaign  Related
+     *
+     * @param array $order an array of information pertaining to the order that has completed. Use the following keys:
+                string id the Order Id
+                string campaign_id the Campaign Id to track this order with (see the "mc_cid" query string variable a campaign passes)
+                string email_id the Email Id of the subscriber we should attach this order to (see the "mc_eid" query string variable a campaign passes)
+                double total The Order Total (ie, the full amount the customer ends up paying)
+                double shipping optional the total paid for Shipping Fees
+                double tax optional the total tax paid
+                string store_id a unique id for the store sending the order in
+                string store_name optional a "nice" name for the store - typically the base web address (ie, "store.mailchimp.com"). We will automatically update this if it changes (based on store_id)
+                string plugin_id the MailChimp assigned Plugin Id. Get yours by <a href="/api/register.php">registering here</a>
+                array items the individual line items for an order using these keys:
+                <div style="padding-left:30px"><table><tr><td colspan=*>
+                    integer line_num optional the line number of the item on the order. We will generate these if they are not passed
+                    integer product_id the store's internal Id for the product. Lines that do no contain this will be skipped 
+                    string product_name the product name for the product_id associated with this item. We will auto update these as they change (based on product_id)
+                    integer category_id the store's internal Id for the (main) category associated with this product. Our testing has found this to be a "best guess" scenario
+                    string category_name the category name for the category_id this product is in. Our testing has found this to be a "best guess" scenario. Our plugins walk the category heirarchy up and send "Root - SubCat1 - SubCat4", etc.
+                    double qty the quantity of the item ordered
+                    double cost the cost of a single item (ie, not the extended cost of the line)
+                </td></tr></table></div>
+     * @return bool true if the data is saved, otherwise an error is thrown.
+     */
+    function campaignEcommAddOrder($order) {
+        $params = array();
+        $params["order"] = $order;
+        return $this->callServer("campaignEcommAddOrder", $params);
+    }
+
+    /**
+     * Retrieve all of the lists defined for your user account
+     *
+     * @section List Related
+     * @example mcapi_lists.php
+     * @example xml-rpc_lists.php
+     *
+     * @return array list of your Lists and their associated information (see Returned Fields for description)
+     * @returnf string id The list id for this list. This will be used for all other list management functions.
+     * @returnf integer web_id The list id used in our web app, allows you to create a link directly to it
+     * @returnf string name The name of the list.
+     * @returnf date date_created The date that this list was created.
+     * @returnf integer member_count The number of active members in the given list.
+     * @returnf integer unsubscribe_count The number of members who have unsubscribed from the given list.
+     * @returnf integer cleaned_count The number of members cleaned from the given list.
+     * @returnf boolean email_type_option Whether or not the List supports multiple formats for emails or just HTML
+     * @returnf string default_from_name Default From Name for campaigns using this list
+     * @returnf string default_from_email Default From Email for campaigns using this list
+     * @returnf string default_subject Default Subject Line for campaigns using this list
+     * @returnf string default_language Default Language for this list's forms
+     */
+    function lists() {
+        $params = array();
+        return $this->callServer("lists", $params);
+    }
+
+    /**
+     * Get the list of merge tags for a given list, including their name, tag, and required setting
+     *
+     * @section List Related
+     * @example xml-rpc_listMergeVars.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @return array list of merge tags for the list
+     * @returnf string name Name of the merge field
+     * @returnf char req Denotes whether the field is required (Y) or not (N)
+     * @returnf string tag The merge tag that's used for forms and listSubscribe() and listUpdateMember()
+     */
+    function listMergeVars($id) {
+        $params = array();
+        $params["id"] = $id;
+        return $this->callServer("listMergeVars", $params);
+    }
+
+    /**
+     * Add a new merge tag to a given list
+     *
+     * @section List Related
+     * @example xml-rpc_listMergeVarAdd.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $tag The merge tag to add, e.g. FNAME
+     * @param string $name The long description of the tag being added, used for user displays
+     * @param array $req optional Various options for this merge var. <em>note:</em> for historical purposes this can also take a "boolean"
+                    string field_type optional one of: text, number, radio, dropdownn, date, address, phone, url, imageurl - defaults to text
+                    boolean req optional indicates whether the field is required - defaults to false
+                    boolean public optional indicates whether the field is displayed in public - defaults to true
+                    boolean show optional indicates whether the field is displayed in the app's list member view - defaults to true
+                    string default_value optional the default value for the field. See listSubscribe() for formatting info. Defaults to blank
+                    array choices optional kind of - an array of strings to use as the choices for radio and dropdown type fields
+    
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listMergeVarAdd($id, $tag, $name, $req=array (
+)) {
+        $params = array();
+        $params["id"] = $id;
+        $params["tag"] = $tag;
+        $params["name"] = $name;
+        $params["req"] = $req;
+        return $this->callServer("listMergeVarAdd", $params);
+    }
+
+    /**
+     * Update most parameters for a merge tag on a given list. You cannot currently change the merge type
+     *
+     * @section List Related
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $tag The merge tag to update
+     * @param array $options The options to change for a merge var. See listMergeVarAdd() for valid options
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listMergeVarUpdate($id, $tag, $options) {
+        $params = array();
+        $params["id"] = $id;
+        $params["tag"] = $tag;
+        $params["options"] = $options;
+        return $this->callServer("listMergeVarUpdate", $params);
+    }
+
+    /**
+     * Delete a merge tag from a given list and all its members. Seriously - the data is removed from all members as well! 
+     * Note that on large lists this method may seem a bit slower than calls you typically make.
+     *
+     * @section List Related
+     * @example xml-rpc_listMergeVarDel.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $tag The merge tag to delete
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listMergeVarDel($id, $tag) {
+        $params = array();
+        $params["id"] = $id;
+        $params["tag"] = $tag;
+        return $this->callServer("listMergeVarDel", $params);
+    }
+
+    /**
+     * Get the list of interest groups for a given list, including the label and form information
+     *
+     * @section List Related
+     * @example xml-rpc_listInterestGroups.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @return struct list of interest groups for the list
+     * @returnf string name Name for the Interest groups
+     * @returnf string form_field Gives the type of interest group: checkbox,radio,select
+     * @returnf array groups Array of the group names
+     */
+    function listInterestGroups($id) {
+        $params = array();
+        $params["id"] = $id;
+        return $this->callServer("listInterestGroups", $params);
+    }
+
+    /** Add a single Interest Group - if interest groups for the List are not yet enabled, adding the first
+     *  group will automatically turn them on.
+     *
+     * @section List Related
+     * @example xml-rpc_listInterestGroupAdd.php
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $group_name the interest group to add
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listInterestGroupAdd($id, $group_name) {
+        $params = array();
+        $params["id"] = $id;
+        $params["group_name"] = $group_name;
+        return $this->callServer("listInterestGroupAdd", $params);
+    }
+
+    /** Delete a single Interest Group - if the last group for a list is deleted, this will also turn groups for the list off.
+     *
+     * @section List Related
+     * @example xml-rpc_listInterestGroupDel.php
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $group_name the interest group to delete
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listInterestGroupDel($id, $group_name) {
+        $params = array();
+        $params["id"] = $id;
+        $params["group_name"] = $group_name;
+        return $this->callServer("listInterestGroupDel", $params);
+    }
+
+    /** Change the name of an Interest Group
+     *
+     * @section List Related
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $old_name the interest group name to be changed
+     * @param string $new_name the new interest group name to be set
+     * @return bool true if the request succeeds, otherwise an error will be thrown
+     */
+    function listInterestGroupUpdate($id, $old_name, $new_name) {
+        $params = array();
+        $params["id"] = $id;
+        $params["old_name"] = $old_name;
+        $params["new_name"] = $new_name;
+        return $this->callServer("listInterestGroupUpdate", $params);
+    }
+
+    /** Return the Webhooks configured for the given list
+     *
+     * @section List Related
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @return array list of webhooks
+     * @returnf string url the URL for this Webhook
+     * @returnf array actions the possible actions and whether they are enabled
+     * @returnf array sources the possible sources and whether they are enabled
+     */
+    function listWebhooks($id) {
+        $params = array();
+        $params["id"] = $id;
+        return $this->callServer("listWebhooks", $params);
+    }
+
+    /** Add a new Webhook URL for the given list
+     *
+     * @section List Related
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $url a valid URL for the Webhook - it will be validated. note that a url may only exist on a list once.
+     * @param array $actions optional a hash of actions to fire this Webhook for
+            boolean subscribe optional as subscribes occur, defaults to true
+            boolean unsubscribe optional as subscribes occur, defaults to true
+            boolean profile optional as profile updates occur, defaults to true
+            boolean cleaned optional as emails are cleaned from the list, defaults to true
+            boolean upemail optional when  subscribers change their email address, defaults to true
+     * @param array $sources optional a hash of sources to fire this Webhook for
+            boolean user optional user/subscriber initiated actions, defaults to true
+            boolean admin optional admin actions in our web app, defaults to true
+            boolean api optional actions that happen via API calls, defaults to false
+     * @return bool true if the call succeeds, otherwise an exception will be thrown
+     */
+    function listWebhookAdd($id, $url, $actions=array (
+), $sources=array (
+)) {
+        $params = array();
+        $params["id"] = $id;
+        $params["url"] = $url;
+        $params["actions"] = $actions;
+        $params["sources"] = $sources;
+        return $this->callServer("listWebhookAdd", $params);
+    }
+
+    /** Delete an existing Webhook URL from a given list
+     *
+     * @section List Related
+     * 
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $url the URL of a Webhook on this list
+     * @return boolean true if the call succeeds, otherwise an exception will be thrown
+     */
+    function listWebhookDel($id, $url) {
+        $params = array();
+        $params["id"] = $id;
+        $params["url"] = $url;
+        return $this->callServer("listWebhookDel", $params);
+    }
+
+    /**
+     * Subscribe the provided email to a list. By default this sends a confirmation email - you will not see new members until the link contained in it is clicked!
+     *
+     * @section List Related
+     *
+     * @example mcapi_listSubscribe.php
+     * @example xml-rpc_listSubscribe.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $email_address the email address to subscribe
+     * @param array $merge_vars array of merges for the email (FNAME, LNAME, etc.) (see examples below for handling "blank" arrays). Note that a merge field can only hold up to 255 characters. Also, there are 2 "special" keys:
+                        string INTERESTS Set Interest Groups by passing a field named "INTERESTS" that contains a comma delimited list of Interest Groups to add. Commas in Interest Group names should be escaped with a backslash. ie, "," =&gt; "\,"
+                        string OPTINIP Set the Opt-in IP fields. <em>Abusing this may cause your account to be suspended.</em> We do validate this and it must not be a private IP address.
+                        
+                        <strong>Handling Field Data Types</strong> - most fields you can just pass a string and all is well. For some, though, that is not the case...
+                        Field values should be formatted as follows:
+                        string address For the string version of an Address, the fields should be delimited by <strong>2</strong> spaces. Address 2 can be skipped. The Country should be a 2 character ISO-3166-1 code and will default to your default country if not set
+                        array address For the array version of an Address, the requirements for Address 2 and Country are the same as with the string version. Then simply pass us an array with the keys <strong>addr1</strong>, <strong>addr2</strong>, <strong>city</strong>, <strong>state</strong>, <strong>zip</strong>, <strong>country</strong> and appropriate values for each
+    
+                        string date use YYYY-MM-DD to be safe. Generally, though, anything strtotime() understands we'll understand - <a href="http://us2.php.net/strtotime" target="_blank">http://us2.php.net/strtotime</a>
+                        string dropdown can be a normal string - we <em>will</em> validate that the value is a valid option
+                        string image must be a valid, existing url. we <em>will</em> check its existence
+                        string multi_choice can be a normal string - we <em>will</em> validate that the value is a valid option
+                        double number pass in a valid number - anything else will turn in to zero (0). Note, this will be rounded to 2 decimal places
+                        string phone If your account has the US Phone numbers option set, this <em>must</em> be in the form of NPA-NXX-LINE (404-555-1212). If not, we assume an International number and will simply set the field with what ever number is passed in.
+                        string website This is a standard string, but we <em>will</em> verify that it looks like a valid URL
+                        
+                        
+                        
+     * @param string $email_type optional - email type preference for the email (html, text, or mobile defaults to html)
+     * @param boolean $double_optin optional - flag to control whether a double opt-in confirmation message is sent, defaults to true. <em>Abusing this may cause your account to be suspended.</em>
+     * @param boolean $update_existing optional - flag to control whether a existing subscribers should be updated instead of throwing and error
+     * @param boolean $replace_interests - flag to determine whether we replace the interest groups with the groups provided, or we add the provided groups to the member's interest groups (optional, defaults to true)
+     * @param boolean $send_welcome - if your double_optin is false and this is true, we will send your lists Welcome Email if this subscribe succeeds - this will *not* fire if we end up updating an existing subscriber. defaults to false
+    
+     * @return boolean true on success, false on failure. When using MCAPI.class.php, the value can be tested and error messages pulled from the MCAPI object (see below)
+     */
+    function listSubscribe($id, $email_address, $merge_vars, $email_type='html', $double_optin=true, $update_existing=false, $replace_interests=true, $send_welcome=false) {
+        $params = array();
+        $params["id"] = $id;
+        $params["email_address"] = $email_address;
+        $params["merge_vars"] = $merge_vars;
+        $params["email_type"] = $email_type;
+        $params["double_optin"] = $double_optin;
+        $params["update_existing"] = $update_existing;
+        $params["replace_interests"] = $replace_interests;
+        $params["send_welcome"] = $send_welcome;
+        return $this->callServer("listSubscribe", $params);
+    }
+
+    /**
+     * Unsubscribe the given email address from the list
+     *
+     * @section List Related
+     * @example mcapi_listUnsubscribe.php
+     * @example xml-rpc_listUnsubscribe.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $email_address the email address to unsubscribe
+     * @param boolean $delete_member flag to completely delete the member from your list instead of just unsubscribing, default to false
+     * @param boolean $send_goodbye flag to send the goodbye email to the email address, defaults to true
+     * @param boolean $send_notify flag to send the unsubscribe notification email to the address defined in the list email notification settings, defaults to true
+     * @return boolean true on success, false on failure. When using MCAPI.class.php, the value can be tested and error messages pulled from the MCAPI object (see below)
+     */
+    function listUnsubscribe($id, $email_address, $delete_member=false, $send_goodbye=true, $send_notify=true) {
+        $params = array();
+        $params["id"] = $id;
+        $params["email_address"] = $email_address;
+        $params["delete_member"] = $delete_member;
+        $params["send_goodbye"] = $send_goodbye;
+        $params["send_notify"] = $send_notify;
+        return $this->callServer("listUnsubscribe", $params);
+    }
+
+    /**
+     * Edit the email address, merge fields, and interest groups for a list member
+     *
+     * @section List Related
+     * @example mcapi_listUpdateMember.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $email_address the current email address of the member to update
+     * @param array $merge_vars array of new field values to update the member with.  Use "EMAIL" to update the email address and "INTERESTS" to update the interest groups
+     * @param string $email_type change the email type preference for the member ("html", "text", or "mobile").  Leave blank to keep the existing preference (optional)
+     * @param boolean $replace_interests flag to determine whether we replace the interest groups with the updated groups provided, or we add the provided groups to the member's interest groups (optional, defaults to true)
+     * @return boolean true on success, false on failure. When using MCAPI.class.php, the value can be tested and error messages pulled from the MCAPI object
+     */
+    function listUpdateMember($id, $email_address, $merge_vars, $email_type='', $replace_interests=true) {
+        $params = array();
+        $params["id"] = $id;
+        $params["email_address"] = $email_address;
+        $params["merge_vars"] = $merge_vars;
+        $params["email_type"] = $email_type;
+        $params["replace_interests"] = $replace_interests;
+        return $this->callServer("listUpdateMember", $params);
+    }
+
+    /**
+     * Subscribe a batch of email addresses to a list at once
+     *
+     * @section List Related
+     *
+     * @example mcapi_listBatchSubscribe.php
+     * @example xml-rpc_listBatchSubscribe.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param array $batch an array of structs for each address to import with two special keys: "EMAIL" for the email address, and "EMAIL_TYPE" for the email type option (html, text, or mobile) 
+     * @param boolean $double_optin flag to control whether to send an opt-in confirmation email - defaults to true
+     * @param boolean $update_existing flag to control whether to update members that are already subscribed to the list or to return an error, defaults to false (return error)
+     * @param boolean $replace_interests flag to determine whether we replace the interest groups with the updated groups provided, or we add the provided groups to the member's interest groups (optional, defaults to true)
+     * @return struct Array of result counts and any errors that occurred
+     * @returnf integer success_count Number of email addresses that were succesfully added/updated
+     * @returnf integer error_count Number of email addresses that failed during addition/updating
+     * @returnf array errors Array of error structs. Each error struct will contain "code", "message", and the full struct that failed
+     */
+    function listBatchSubscribe($id, $batch, $double_optin=true, $update_existing=false, $replace_interests=true) {
+        $params = array();
+        $params["id"] = $id;
+        $params["batch"] = $batch;
+        $params["double_optin"] = $double_optin;
+        $params["update_existing"] = $update_existing;
+        $params["replace_interests"] = $replace_interests;
+        return $this->callServer("listBatchSubscribe", $params);
+    }
+
+    /**
+     * Unsubscribe a batch of email addresses to a list
+     *
+     * @section List Related
+     * @example mcapi_listBatchUnsubscribe.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param array $emails array of email addresses to unsubscribe
+     * @param boolean $delete_member flag to completely delete the member from your list instead of just unsubscribing, default to false
+     * @param boolean $send_goodbye flag to send the goodbye email to the email addresses, defaults to true
+     * @param boolean $send_notify flag to send the unsubscribe notification email to the address defined in the list email notification settings, defaults to false
+     * @return struct Array of result counts and any errors that occurred
+     * @returnf integer success_count Number of email addresses that were succesfully added/updated
+     * @returnf integer error_count Number of email addresses that failed during addition/updating
+     * @returnf array errors Array of error structs. Each error struct will contain "code", "message", and "email"
+     */
+    function listBatchUnsubscribe($id, $emails, $delete_member=false, $send_goodbye=true, $send_notify=false) {
+        $params = array();
+        $params["id"] = $id;
+        $params["emails"] = $emails;
+        $params["delete_member"] = $delete_member;
+        $params["send_goodbye"] = $send_goodbye;
+        $params["send_notify"] = $send_notify;
+        return $this->callServer("listBatchUnsubscribe", $params);
+    }
+
+    /**
+     * Get all of the list members for a list that are of a particular status
+     *
+     * @section List Related
+     * @example mcapi_listMembers.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $status the status to get members for - one of(subscribed, unsubscribed, cleaned, updated), defaults to subscribed
+     * @param string $since optional pull all members whose status (subscribed/unsubscribed/cleaned) has changed or whose profile (updated) has changed since this date/time (in GMT) - format is YYYY-MM-DD HH:mm:ss (24hr)
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 100, upper limit set at 15000
+     * @return array Array of list member structs (see Returned Fields for details)
+     * @returnf string email Member email address
+     * @returnf date timestamp timestamp of their associated status date (subscribed, unsubscribed, cleaned, or updated) in GMT
+     */
+    function listMembers($id, $status='subscribed', $since=NULL, $start=0, $limit=100) {
+        $params = array();
+        $params["id"] = $id;
+        $params["status"] = $status;
+        $params["since"] = $since;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        return $this->callServer("listMembers", $params);
+    }
+
+    /**
+     * Get all the information for a particular member of a list
+     *
+     * @section List Related
+     * @example mcapi_listMemberInfo.php
+     * @example xml-rpc_listMemberInfo.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @param string $email_address the member email address to get information for
+     * @return array array of list member info (see Returned Fields for details)
+     * @returnf string id The unique id for this email address on an account
+     * @returnf string email The email address associated with this record
+     * @returnf string email_type The type of emails this customer asked to get: html, text, or mobile
+     * @returnf array merges An associative array of all the merge tags and the data for those tags for this email address. <em>Note</em>: Interest Groups are returned as comma delimited strings - if a group name contains a comma, it will be escaped with a backslash. ie, "," =&gt; "\,"
+     * @returnf string status The subscription status for this email address, either subscribed, unsubscribed or cleaned
+     * @returnf string ip_opt IP Address this address opted in from. 
+     * @returnf string ip_signup IP Address this address signed up from.
+     * @returnf array lists An associative array of the other lists this member belongs to - the key is the list id and the value is their status in that list.
+     * @returnf date timestamp The time this email address was added to the list
+     */
+    function listMemberInfo($id, $email_address) {
+        $params = array();
+        $params["id"] = $id;
+        $params["email_address"] = $email_address;
+        return $this->callServer("listMemberInfo", $params);
+    }
+
+    /**
+     * Get all email addresses that complained about a given campaign
+     *
+     * @section List Related
+     *
+     * @example mcapi_listAbuseReports.php
+     *
+     * @param string $id the list id to pull abuse reports for (can be gathered using lists())
+     * @param integer $start optional for large data sets, the page number to start at - defaults to 1st page of data  (page 0)
+     * @param integer $limit optional for large data sets, the number of results to return - defaults to 500, upper limit set at 1000
+     * @param string $since optional pull only messages since this time - use YYYY-MM-DD HH:II:SS format in <strong>GMT</strong>
+     * @return array reports the abuse reports for this campaign
+     * @returnf string date date/time the abuse report was received and processed
+     * @returnf string email the email address that reported abuse
+     * @returnf string campaign_id the unique id for the campaign that reporte was made against
+     * @returnf string type an internal type generally specifying the orginating mail provider - may not be useful outside of filling report views
+     */
+    function listAbuseReports($id, $start=0, $limit=500, $since=NULL) {
+        $params = array();
+        $params["id"] = $id;
+        $params["start"] = $start;
+        $params["limit"] = $limit;
+        $params["since"] = $since;
+        return $this->callServer("listAbuseReports", $params);
+    }
+
+    /**
+     * Access the Growth History by Month for a given list.
+     *
+     * @section List Related
+     *
+     * @example mcapi_listGrowthHistory.php
+     *
+     * @param string $id the list id to connect to. Get by calling lists()
+     * @return array array of months and growth 
+     * @returnf string month The Year and Month in question using YYYY-MM format
+     * @returnf integer existing number of existing subscribers to start the month
+     * @returnf integer imports number of subscribers imported during the month
+     * @returnf integer optins number of subscribers who opted-in during the month
+     */
+    function listGrowthHistory($id) {
+        $params = array();
+        $params["id"] = $id;
+        return $this->callServer("listGrowthHistory", $params);
+    }
+
+    /**
+     * <strong>DEPRECATED:</strong> Retrieve your User Unique Id and your Affiliate link to display/use for 
+     * <a href="/monkeyrewards/" target="_blank">Monkey Rewards</a>. While
+     * we don't use the User Id for any API functions, it can be useful if building up URL strings for things such as the profile editor and sub/unsub links.
+     *
+     * @section Helper
+     *
+     * @deprecated See getAccountDetails() for replacement
+     *
+     * @example mcapi_getAffiliateInfo.php
+     * @example xml-rpc_getAffiliateInfo.php
+     *
+     * @return array containing your Affilliate Id and full link.
+     * @returnf string user_id Your User Unique Id. 
+     * @returnf string url Your Monkey Rewards link for our Affiliate program
+     */
+    function getAffiliateInfo() {
+        $params = array();
+        return $this->callServer("getAffiliateInfo", $params);
+    }
+
+    /**
+     * Retrieve lots of account information including payments made, plan info, some account stats, installed modules,
+     * contact info, and more. No private information like Credit Card numbers is available.
+     * 
+     * @section Helper
+     *
+     * @return array containing the details for the account tied to this API Key
+     * @returnf string username The Account username
+     * @returnf string user_id The Account user unique id (for building some links)
+     * @returnf bool is_trial Whether the Account is in Trial mode (can only send campaigns to less than 100 emails)
+     * @returnf string timezone The timezone for the Account - default is "US/Eastern"
+     * @returnf string plan_type Plan Type - "monthly", "payasyougo", or "free"
+     * @returnf int plan_low <em>only for Monthly plans</em> - the lower tier for list size
+     * @returnf int plan_high <em>only for Monthly plans</em> - the upper tier for list size
+     * @returnf datetime plan_start_date <em>only for Monthly plans</em> - the start date for a monthly plan
+     * @returnf int emails_left <em>only for Free and Pay-as-you-go plans</em> emails credits left for the account
+     * @returnf bool pending_monthly Whether the account is finishing Pay As You Go credits before switching to a Monthly plan
+     * @returnf datetime first_payment date of first payment
+     * @returnf datetime last_payment date of most recent payment
+     * @returnf int times_logged_in total number of times the account has been logged into via the web
+     * @returnf datetime last_login date/time of last login via the web
+     * @returnf string affiliate_link Monkey Rewards link for our Affiliate program
+     * @returnf array contact Contact details for the account, including: First & Last name, email, company name, address, phone, and url
+     * @returnf array addons Addons installed in the account and the date they were installed.
+     * @returnf array orders Order details for the account, include order_id, type, cost, date/time, and any credits applied to the order
+     */
+    function getAccountDetails() {
+        $params = array();
+        return $this->callServer("getAccountDetails", $params);
+    }
+
+    /**
+     * Have HTML content auto-converted to a text-only format. You can send: plain HTML, an array of Template content, an existing Campaign Id, or an existing Template Id. Note that this will <b>not</b> save anything to or update any of your lists, campaigns, or templates.
+     *
+     * @section Helper
+     * @example xml-rpc_generateText.php
+     *
+     * @param string $type The type of content to parse. Must be one of: "html", "template", "url", "cid" (Campaign Id), or "tid" (Template Id)
+     * @param mixed $content The content to use. For "html" expects  a single string value, "template" expects an array like you send to campaignCreate, "url" expects a valid & public URL to pull from, "cid" expects a valid Campaign Id, and "tid" expects a valid Template Id on your account.
+     * @return string the content pass in converted to text.
+     */
+    function generateText($type, $content) {
+        $params = array();
+        $params["type"] = $type;
+        $params["content"] = $content;
+        return $this->callServer("generateText", $params);
+    }
+
+    /**
+     * Send your HTML content to have the CSS inlined and optionally remove the original styles.
+     *
+     * @section Helper
+     * @example xml-rpc_inlineCss.php
+     *
+     * @param string $html Your HTML content
+     * @param bool $strip_css optional Whether you want the CSS &lt;style&gt; tags stripped from the returned document. Defaults to false.
+     * @return string Your HTML content with all CSS inlined, just like if we sent it.
+     */
+    function inlineCss($html, $strip_css=false) {
+        $params = array();
+        $params["html"] = $html;
+        $params["strip_css"] = $strip_css;
+        return $this->callServer("inlineCss", $params);
+    }
+
+    /**
+     * Create a new folder to file campaigns in
+     *
+     * @section Helper
+     * @example mcapi_createFolder.php
+     * @example xml-rpc_createFolder.php
+     *
+     * @param string $name a unique name for a folder
+     * @return integer the folder_id of the newly created folder.
+     */
+    function createFolder($name) {
+        $params = array();
+        $params["name"] = $name;
+        return $this->callServer("createFolder", $params);
+    }
+
+    /**
+     * Retrieve a list of all MailChimp API Keys for this User
+     *
+     * @section Security Related
+     * @example xml-rpc_apikeyAdd.php
+     * @example mcapi_apikeyAdd.php
+     * 
+     * @param string $username Your MailChimp user name
+     * @param string $password Your MailChimp password
+     * @param boolean $expired optional - whether or not to include expired keys, defaults to false
+     * @return array an array of API keys including:
+     * @returnf string apikey The api key that can be used
+     * @returnf string created_at The date the key was created
+     * @returnf string expired_at The date the key was expired
+     */
+    function apikeys($username, $password, $expired=false) {
+        $params = array();
+        $params["username"] = $username;
+        $params["password"] = $password;
+        $params["expired"] = $expired;
+        return $this->callServer("apikeys", $params);
+    }
+
+    /**
+     * Add an API Key to your account. We will generate a new key for you and return it.
+     *
+     * @section Security Related
+     * @example xml-rpc_apikeyAdd.php
+     *
+     * @param string $username Your MailChimp user name
+     * @param string $password Your MailChimp password
+     * @return string a new API Key that can be immediately used.
+     */
+    function apikeyAdd($username, $password) {
+        $params = array();
+        $params["username"] = $username;
+        $params["password"] = $password;
+        return $this->callServer("apikeyAdd", $params);
+    }
+
+    /**
+     * Expire a Specific API Key. Note that if you expire all of your keys, a new, valid one will be created and returned
+     * next time you call login(). If you are trying to shut off access to your account for an old developer, change your 
+     * MailChimp password, then expire all of the keys they had access to. Note that this takes effect immediately, so make 
+     * sure you replace the keys in any working application before expiring them! Consider yourself warned... 
+     *
+     * @section Security Related
+     * @example mcapi_apikeyExpire.php
+     * @example xml-rpc_apikeyExpire.php
+     *
+     * @param string $username Your MailChimp user name
+     * @param string $password Your MailChimp password
+     * @return boolean true if it worked, otherwise an error is thrown.
+     */
+    function apikeyExpire($username, $password) {
+        $params = array();
+        $params["username"] = $username;
+        $params["password"] = $password;
+        return $this->callServer("apikeyExpire", $params);
+    }
+
+    /**
+     * "Ping" the MailChimp API - a simple method you can call that will return a constant value as long as everything is good. Note
+     * than unlike most all of our methods, we don't throw an Exception if we are having issues. You will simply receive a different
+     * string back that will explain our view on what is going on.
+     *
+     * @section Helper
+     * @example xml-rpc_ping.php
+     *
+     * @return string returns "Everything's Chimpy!" if everything is chimpy, otherwise returns an error message
+     */
+    function ping() {
+        $params = array();
+        return $this->callServer("ping", $params);
+    }
+
+    /**
+     * Internal function - proxy method for certain XML-RPC calls | DO NOT CALL
+     * @param mixed Method to call, with any parameters to pass along
+     * @return mixed the result of the call
+     */
+    function callMethod() {
+        $params = array();
+        return $this->callServer("callMethod", $params);
+    }
+    
+    /**
+     * Actually connect to the server and call the requested methods, parsing the result
+     * You should never have to call this function manually
+     */
+    function callServer($method, $params) {
+    	//Always include the apikey if we are not logging in
+    	if($method != "login") {
+    	    $dc = "us1";
+    	    if (strstr($this->api_key,"-")){
+            	list($key, $dc) = explode("-",$this->api_key,2);
+                if (!$dc) $dc = "us1";
+            }
+            $host = $dc.".".$this->apiUrl["host"];
+    		$params["apikey"] = $this->api_key;
+    	} else {
+        	$host = $this->apiUrl["host"];
+    	}
+        $this->errorMessage = "";
+        $this->errorCode = "";
+        $post_vars = $this->httpBuildQuery($params);
+        
+        $payload = "POST " . $this->apiUrl["path"] . "?" . $this->apiUrl["query"] . "&method=" . $method . " HTTP/1.0\r\n";
+        $payload .= "Host: " . $host . "\r\n";
+        $payload .= "User-Agent: MCAPI/" . $this->version ."\r\n";
+        $payload .= "Content-type: application/x-www-form-urlencoded\r\n";
+        $payload .= "Content-length: " . strlen($post_vars) . "\r\n";
+        $payload .= "Connection: close \r\n\r\n";
+        $payload .= $post_vars;
+        
+        ob_start();
+        if ($this->secure){
+            $sock = fsockopen("ssl://".$host, 443, $errno, $errstr, $this->timeout);
+        } else {
+            $sock = fsockopen($host, 80, $errno, $errstr, $this->timeout);
+        }
+        if(!$sock) {
+            $this->errorMessage = "Could not connect (ERR $errno: $errstr)";
+            $this->errorCode = "-99";
+            ob_end_clean();
+            return false;
+        }
+        
+        $response = "";
+        fwrite($sock, $payload);
+        while(!feof($sock)) {
+            $response .= fread($sock, $this->chunkSize);
+        }
+        fclose($sock);
+        ob_end_clean();
+        
+        list($throw, $response) = explode("\r\n\r\n", $response, 2);
+        
+        if(ini_get("magic_quotes_runtime")) $response = stripslashes($response);
+        
+        $serial = unserialize($response);
+        if($response && $serial === false) {
+        	$response = array("error" => "Bad Response.  Got This: " . $response, "code" => "-99");
+        } else {
+        	$response = $serial;
+        }
+        if(is_array($response) && isset($response["error"])) {
+            $this->errorMessage = $response["error"];
+            $this->errorCode = $response["code"];
+            return false;
+        }
+        
+        return $response;
+    }
+    
+    /**
+     * Re-implement http_build_query for systems that do not already have it
+     */
+    function httpBuildQuery($params, $key=null) {
+        $ret = array();
+        
+        foreach((array) $params as $name => $val) {
+            $name = urlencode($name);
+            if($key !== null) {
+                $name = $key . "[" . $name . "]";
+            }
+            
+            if(is_array($val) || is_object($val)) {
+                $ret[] = $this->httpBuildQuery($val, $name);
+            } elseif($val !== null) {
+                $ret[] = $name . "=" . urlencode($val);
+            }
+        }
+        
+        return implode("&", $ret);
+    }
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360.php 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_mailchimp_360.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_mailchimp_360.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,75 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_mailchimp_360 {
+    var $code = 'ht_mailchimp_360';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_mailchimp_360() {
+      $this->title = MODULE_HEADER_TAGS_MAILCHIMP_360_TITLE;
+      $this->description = MODULE_HEADER_TAGS_MAILCHIMP_360_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_MAILCHIMP_360_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_MAILCHIMP_360_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_MAILCHIMP_360_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF;
+
+      include(DIR_WS_MODULES . 'header_tags/ht_mailchimp_360/MCAPI.class.php');
+      include(DIR_WS_MODULES . 'header_tags/ht_mailchimp_360/mc360.php');
+
+      $mc360 = new mc360();
+      $mc360->set_cookies();
+
+      if (basename($PHP_SELF) == FILENAME_CHECKOUT_SUCCESS) {
+        $mc360->process();
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_MAILCHIMP_360_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Category Title Module', 'MODULE_HEADER_TAGS_MAILCHIMP_360_STATUS', 'True', 'Do you want to allow category titles to be added to the page title?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Key', 'MODULE_HEADER_TAGS_MAILCHIMP_360_API_KEY', '', 'An API Key assigned to your MailChimp account', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail', 'MODULE_HEADER_TAGS_MAILCHIMP_360_DEBUG_EMAIL', '', 'If an e-mail address is entered, debug data will be sent to it', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_MAILCHIMP_360_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+
+// Internal parameters
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MailChimp Store ID', 'MODULE_HEADER_TAGS_MAILCHIMP_360_STORE_ID', '', 'Do not edit. Store ID value.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MailChimp Key Valid', 'MODULE_HEADER_TAGS_MAILCHIMP_360_KEY_VALID', '', 'Do not edit. Key Value value.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+
+// Internal parameters
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('MODULE_HEADER_TAGS_MAILCHIMP_360_STORE_ID', 'MODULE_HEADER_TAGS_MAILCHIMP_360_KEY_VALID')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_MAILCHIMP_360_STATUS', 'MODULE_HEADER_TAGS_MAILCHIMP_360_API_KEY', 'MODULE_HEADER_TAGS_MAILCHIMP_360_DEBUG_EMAIL', 'MODULE_HEADER_TAGS_MAILCHIMP_360_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_manufacturer_title.php 2.3.1.src/includes/modules/header_tags/ht_manufacturer_title.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_manufacturer_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_manufacturer_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,73 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_manufacturer_title {
+    var $code = 'ht_manufacturer_title';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_manufacturer_title() {
+      $this->title = MODULE_HEADER_TAGS_MANUFACTURER_TITLE_TITLE;
+      $this->description = MODULE_HEADER_TAGS_MANUFACTURER_TITLE_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_MANUFACTURER_TITLE_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_MANUFACTURER_TITLE_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_MANUFACTURER_TITLE_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $HTTP_GET_VARS, $oscTemplate, $manufacturers, $languages_id;
+
+      if (basename($PHP_SELF) == FILENAME_DEFAULT) {
+        if (isset($HTTP_GET_VARS['manufacturers_id']) && is_numeric($HTTP_GET_VARS['manufacturers_id'])) {
+// $manufacturers is set in application_top.php to add the manufacturer to the breadcrumb
+          if (isset($manufacturers) && (sizeof($manufacturers) == 1) && isset($manufacturers['manufacturers_name'])) {
+            $oscTemplate->setTitle($manufacturers['manufacturers_name'] . ', ' . $oscTemplate->getTitle());
+          } else {
+// $manufacturers is not set so a database query is needed
+            $manufacturers_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
+            if (tep_db_num_rows($manufacturers_query)) {
+              $manufacturers = tep_db_fetch_array($manufacturers_query);
+
+              $oscTemplate->setTitle($manufacturers['manufacturers_name'] . ', ' . $oscTemplate->getTitle());
+            }
+          }
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_MANUFACTURER_TITLE_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Manufacturer Title Module', 'MODULE_HEADER_TAGS_MANUFACTURER_TITLE_STATUS', 'True', 'Do you want to allow manufacturer titles to be added to the page title?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_MANUFACTURER_TITLE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_MANUFACTURER_TITLE_STATUS', 'MODULE_HEADER_TAGS_MANUFACTURER_TITLE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_opensearch.php 2.3.1.src/includes/modules/header_tags/ht_opensearch.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_opensearch.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_opensearch.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,66 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_opensearch {
+    var $code = 'ht_opensearch';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_opensearch() {
+      $this->title = MODULE_HEADER_TAGS_OPENSEARCH_TITLE;
+      $this->description = MODULE_HEADER_TAGS_OPENSEARCH_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_OPENSEARCH_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_OPENSEARCH_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_OPENSEARCH_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $oscTemplate;
+
+      $oscTemplate->addBlock('<link rel="search" type="application/opensearchdescription+xml" href="' . tep_href_link('opensearch.php', '', 'NONSSL', false) . '" title="' . tep_output_string(STORE_NAME) . '" />', $this->group);
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_OPENSEARCH_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable OpenSearch Module', 'MODULE_HEADER_TAGS_OPENSEARCH_STATUS', 'True', 'Add shop search functionality to the browser?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Short Name', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_SHORT_NAME', '" . tep_db_input(STORE_NAME) . "', 'Short name to describe the search engine.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Description', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_DESCRIPTION', 'Search " . tep_db_input(STORE_NAME) . "', 'Description of the search engine.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Contact', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_CONTACT', '" . tep_db_input(STORE_OWNER_EMAIL_ADDRESS) . "', 'E-Mail address of the search engine maintainer. (optional)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Tags', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_TAGS', '', 'Keywords to identify and categorize the search content, separated by an empty space. (optional)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Attribution', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ATTRIBUTION', 'Copyright (c) " . tep_db_input(STORE_NAME) . "', 'Attribution for the search content. (optional)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Adult Content', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ADULT_CONTENT', 'False', 'Search content contains material suitable only for adults.', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('16x16 Icon', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ICON', '" . HTTP_CATALOG_SERVER . DIR_WS_CATALOG . "favicon.ico', 'A 16x16 sized icon (must be in .ico format, eg http://server/favicon.ico). (optional)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('64x64 Image', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_IMAGE', '', 'A 64x64 sized image (must be in .png format, eg http://server/images/logo.png). (optional)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_OPENSEARCH_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_OPENSEARCH_STATUS', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_SHORT_NAME', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_DESCRIPTION', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_CONTACT', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_TAGS', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ATTRIBUTION', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ADULT_CONTENT', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_ICON', 'MODULE_HEADER_TAGS_OPENSEARCH_SITE_IMAGE', 'MODULE_HEADER_TAGS_OPENSEARCH_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/header_tags/ht_product_title.php 2.3.1.src/includes/modules/header_tags/ht_product_title.php
--- 2.2rc2a.cp.src/includes/modules/header_tags/ht_product_title.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/header_tags/ht_product_title.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ht_product_title {
+    var $code = 'ht_product_title';
+    var $group = 'header_tags';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $enabled = false;
+
+    function ht_product_title() {
+      $this->title = MODULE_HEADER_TAGS_PRODUCT_TITLE_TITLE;
+      $this->description = MODULE_HEADER_TAGS_PRODUCT_TITLE_DESCRIPTION;
+
+      if ( defined('MODULE_HEADER_TAGS_PRODUCT_TITLE_STATUS') ) {
+        $this->sort_order = MODULE_HEADER_TAGS_PRODUCT_TITLE_SORT_ORDER;
+        $this->enabled = (MODULE_HEADER_TAGS_PRODUCT_TITLE_STATUS == 'True');
+      }
+    }
+
+    function execute() {
+      global $PHP_SELF, $oscTemplate, $HTTP_GET_VARS, $languages_id, $product_check;
+
+      if (basename($PHP_SELF) == FILENAME_PRODUCT_INFO) {
+        if (isset($HTTP_GET_VARS['products_id'])) {
+          if ($product_check['total'] > 0) {
+            $product_info_query = tep_db_query("select pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
+            $product_info = tep_db_fetch_array($product_info_query);
+
+            $oscTemplate->setTitle($product_info['products_name'] . ', ' . $oscTemplate->getTitle());
+          }
+        }
+      }
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function check() {
+      return defined('MODULE_HEADER_TAGS_PRODUCT_TITLE_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Product Title Module', 'MODULE_HEADER_TAGS_PRODUCT_TITLE_STATUS', 'True', 'Do you want to allow product titles to be added to the page title?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_HEADER_TAGS_PRODUCT_TITLE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_HEADER_TAGS_PRODUCT_TITLE_STATUS', 'MODULE_HEADER_TAGS_PRODUCT_TITLE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/new_products.php 2.3.1.src/includes/modules/new_products.php
--- 2.2rc2a.cp.src/includes/modules/new_products.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/new_products.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,21 +1,14 @@
 <?php
 /*
-  $Id: new_products.php 1806 2008-01-11 22:48:15Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
-?>
-<!-- new_products //-->
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => sprintf(TABLE_HEADING_NEW_PRODUCTS, strftime('%B')));
-
-  new contentBoxHeading($info_box_contents);
 
   if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
     $new_products_query = tep_db_query("select p.products_id, p.products_image, p.products_tax_class_id, pd.products_name, if(s.status, s.specials_new_products_price, p.products_price) as products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by p.products_date_added desc limit " . MAX_DISPLAY_NEW_PRODUCTS);
@@ -23,21 +16,40 @@
     $new_products_query = tep_db_query("select distinct p.products_id, p.products_image, p.products_tax_class_id, pd.products_name, if(s.status, s.specials_new_products_price, p.products_price) as products_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c where p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and c.parent_id = '" . (int)$new_products_category_id . "' and p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by p.products_date_added desc limit " . MAX_DISPLAY_NEW_PRODUCTS);
   }
 
-  $row = 0;
-  $col = 0;
-  $info_box_contents = array();
-  while ($new_products = tep_db_fetch_array($new_products_query)) {
-    $info_box_contents[$row][$col] = array('align' => 'center',
-                                           'params' => 'class="smallText" width="33%" valign="top"',
-                                           'text' => '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $new_products['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $new_products['products_image'], $new_products['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $new_products['products_id']) . '">' . $new_products['products_name'] . '</a><br>' . $currencies->display_price($new_products['products_price'], tep_get_tax_rate($new_products['products_tax_class_id'])));
-
-    $col ++;
-    if ($col > 2) {
-      $col = 0;
-      $row ++;
+  $num_new_products = tep_db_num_rows($new_products_query);
+
+  if ($new_products_query > 0) {
+    $counter = 0;
+    $col = 0;
+
+    $new_prods_content = '<table border="0" width="100%" cellspacing="0" cellpadding="2">';
+    while ($new_products = tep_db_fetch_array($new_products_query)) {
+      $counter++;
+
+      if ($col === 0) {
+        $new_prods_content .= '<tr>';
+      }
+
+      $new_prods_content .= '<td width="33%" align="center" valign="top"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $new_products['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $new_products['products_image'], $new_products['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br /><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $new_products['products_id']) . '">' . $new_products['products_name'] . '</a><br />' . $currencies->display_price($new_products['products_price'], tep_get_tax_rate($new_products['products_tax_class_id'])) . '</td>';
+
+      $col ++;
+
+      if (($col > 2) || ($counter == $num_new_products)) {
+        $new_prods_content .= '</tr>';
+
+        $col = 0;
+      }
     }
-  }
 
-  new contentBox($info_box_contents);
+    $new_prods_content .= '</table>';
+?>
+
+  <h2><?php echo sprintf(TABLE_HEADING_NEW_PRODUCTS, strftime('%B')); ?></h2>
+
+  <div class="contentText">
+    <?php echo $new_prods_content; ?>
+  </div>
+
+<?php
+  }
 ?>
-<!-- new_products_eof //-->
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/order_total/ot_loworderfee.php 2.3.1.src/includes/modules/order_total/ot_loworderfee.php
--- 2.2rc2a.cp.src/includes/modules/order_total/ot_loworderfee.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/order_total/ot_loworderfee.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_loworderfee.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/order_total/ot_shipping.php 2.3.1.src/includes/modules/order_total/ot_shipping.php
--- 2.2rc2a.cp.src/includes/modules/order_total/ot_shipping.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/order_total/ot_shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/order_total/ot_subtotal.php 2.3.1.src/includes/modules/order_total/ot_subtotal.php
--- 2.2rc2a.cp.src/includes/modules/order_total/ot_subtotal.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/order_total/ot_subtotal.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_subtotal.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/order_total/ot_tax.php 2.3.1.src/includes/modules/order_total/ot_tax.php
--- 2.2rc2a.cp.src/includes/modules/order_total/ot_tax.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/order_total/ot_tax.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_tax.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/order_total/ot_total.php 2.3.1.src/includes/modules/order_total/ot_total.php
--- 2.2rc2a.cp.src/includes/modules/order_total/ot_total.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/order_total/ot_total.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: ot_total.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -27,7 +27,7 @@
       global $order, $currencies;
 
       $this->output[] = array('title' => $this->title . ':',
-                              'text' => '<b>' . $currencies->format($order->info['total'], true, $order->info['currency'], $order->info['currency_value']) . '</b>',
+                              'text' => '<strong>' . $currencies->format($order->info['total'], true, $order->info['currency'], $order->info['currency_value']) . '</strong>',
                               'value' => $order->info['total']);
     }
 
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/authorizenet_cc_aim.php 2.3.1.src/includes/modules/payment/authorizenet_cc_aim.php
--- 2.2rc2a.cp.src/includes/modules/payment/authorizenet_cc_aim.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/authorizenet_cc_aim.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: authorizenet_cc_aim.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -18,6 +18,7 @@
       global $order;
 
       $this->signature = 'authorizenet|authorizenet_cc_aim|1.0|2.2';
+      $this->api_version = '3.1';
 
       $this->code = 'authorizenet_cc_aim';
       $this->title = MODULE_PAYMENT_AUTHORIZENET_CC_AIM_TEXT_TITLE;
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/authorizenet_cc_sim.php 2.3.1.src/includes/modules/payment/authorizenet_cc_sim.php
--- 2.2rc2a.cp.src/includes/modules/payment/authorizenet_cc_sim.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/authorizenet_cc_sim.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: authorizenet_cc_sim.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -18,6 +18,7 @@
       global $order;
 
       $this->signature = 'authorizenet|authorizenet_cc_sim|1.0|2.2';
+      $this->api_version = '3.1';
 
       $this->code = 'authorizenet_cc_sim';
       $this->title = MODULE_PAYMENT_AUTHORIZENET_CC_SIM_TEXT_TITLE;
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/cc.php 2.3.1.src/includes/modules/payment/cc.php
--- 2.2rc2a.cp.src/includes/modules/payment/cc.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/cc.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,181 +0,0 @@
-<?php
-/*
-  $Id: cc.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2007 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class cc {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function cc() {
-      global $order;
-
-      $this->code = 'cc';
-      $this->title = MODULE_PAYMENT_CC_TEXT_TITLE;
-      $this->public_title = MODULE_PAYMENT_CC_TEXT_PUBLIC_TITLE;
-      $this->description = MODULE_PAYMENT_CC_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_CC_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_CC_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_CC_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_CC_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_CC_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_CC_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      return array('id' => $this->code,
-                   'module' => $this->public_title);
-    }
-
-    function pre_confirmation_check() {
-      return false;
-    }
-
-    function confirmation() {
-      global $order;
-
-      for ($i=1; $i<13; $i++) {
-        $expires_month[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
-      }
-
-      $today = getdate(); 
-      for ($i=$today['year']; $i < $today['year']+10; $i++) {
-        $expires_year[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
-      }
-
-      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_OWNER,
-                                                    'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
-                                              array('title' => MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_NUMBER,
-                                                    'field' => tep_draw_input_field('cc_number_nh-dns')),
-                                              array('title' => MODULE_PAYMENT_CC_TEXT_CREDIT_CARD_EXPIRES,
-                                                    'field' => tep_draw_pull_down_menu('cc_expires_month', $expires_month) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $expires_year))));
-
-      return $confirmation;
-    }
-
-    function process_button() {
-      return false;
-    }
-
-    function before_process() {
-      global $HTTP_POST_VARS, $order;
-
-      include(DIR_WS_CLASSES . 'cc_validation.php');
-
-      $cc_validation = new cc_validation();
-      $result = $cc_validation->validate($HTTP_POST_VARS['cc_number_nh-dns'], $HTTP_POST_VARS['cc_expires_month'], $HTTP_POST_VARS['cc_expires_year']);
-
-      $error = '';
-      switch ($result) {
-        case -1:
-          $error = sprintf(TEXT_CCVAL_ERROR_UNKNOWN_CARD, substr($cc_validation->cc_number, 0, 4));
-          break;
-        case -2:
-        case -3:
-        case -4:
-          $error = TEXT_CCVAL_ERROR_INVALID_DATE;
-          break;
-        case false:
-          $error = TEXT_CCVAL_ERROR_INVALID_NUMBER;
-          break;
-      }
-
-      if ( ($result == false) || ($result < 1) ) {
-        $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode($error) . '&cc_owner=' . urlencode($HTTP_POST_VARS['cc_owner']) . '&cc_expires_month=' . $HTTP_POST_VARS['cc_expires_month'] . '&cc_expires_year=' . $HTTP_POST_VARS['cc_expires_year'];
-
-        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
-      }
-
-      $order->info['cc_owner'] = $HTTP_POST_VARS['cc_owner'];
-      $order->info['cc_type'] = $cc_validation->cc_type;
-      $order->info['cc_number'] = $HTTP_POST_VARS['cc_number_nh-dns'];
-      $order->info['cc_expires'] = $HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'];
-
-      if ( (defined('MODULE_PAYMENT_CC_EMAIL')) && (tep_validate_email(MODULE_PAYMENT_CC_EMAIL)) ) {
-        $len = strlen($HTTP_POST_VARS['cc_number_nh-dns']);
-
-        $this->cc_middle = substr($HTTP_POST_VARS['cc_number_nh-dns'], 4, ($len-8));
-        $order->info['cc_number'] = substr($HTTP_POST_VARS['cc_number_nh-dns'], 0, 4) . str_repeat('X', (strlen($HTTP_POST_VARS['cc_number_nh-dns']) - 8)) . substr($HTTP_POST_VARS['cc_number_nh-dns'], -4);
-      }
-    }
-
-    function after_process() {
-      global $insert_id;
-
-      if ( (defined('MODULE_PAYMENT_CC_EMAIL')) && (tep_validate_email(MODULE_PAYMENT_CC_EMAIL)) ) {
-        $message = 'Order #' . $insert_id . "\n\n" . 'Middle: ' . $this->cc_middle . "\n\n";
-        
-        tep_mail('', MODULE_PAYMENT_CC_EMAIL, 'Extra Order Info: #' . $insert_id, $message, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
-      }
-    }
-
-    function get_error() {
-      global $HTTP_GET_VARS;
-
-      $error = array('title' => MODULE_PAYMENT_CC_TEXT_ERROR,
-                     'error' => stripslashes(urldecode($HTTP_GET_VARS['error'])));
-
-      return $error;
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_CC_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Credit Card Module', 'MODULE_PAYMENT_CC_STATUS', 'True', 'Do you want to accept credit card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Split Credit Card E-Mail Address', 'MODULE_PAYMENT_CC_EMAIL', '', 'If an e-mail address is entered, the middle digits of the credit card number will be sent to the e-mail address (the outside digits are stored in the database with the middle digits censored)', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_CC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0' , now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_CC_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_CC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-    }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_CC_STATUS', 'MODULE_PAYMENT_CC_EMAIL', 'MODULE_PAYMENT_CC_ZONE', 'MODULE_PAYMENT_CC_ORDER_STATUS_ID', 'MODULE_PAYMENT_CC_SORT_ORDER');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/chronopay.php 2.3.1.src/includes/modules/payment/chronopay.php
--- 2.2rc2a.cp.src/includes/modules/payment/chronopay.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/chronopay.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: chronopay.php 1782 2008-01-10 01:10:52Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/cod.php 2.3.1.src/includes/modules/payment/cod.php
--- 2.2rc2a.cp.src/includes/modules/payment/cod.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/cod.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: cod.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/inpay.php 2.3.1.src/includes/modules/payment/inpay.php
--- 2.2rc2a.cp.src/includes/modules/payment/inpay.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/inpay.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,701 @@
+<?php
+/*
+ $Id: inpay.php VER: 1.0.3443 $
+ osCommerce, Open Source E-Commerce Solutions
+ http://www.oscommerce.com
+ Copyright (c) 2008 osCommerce
+ Released under the GNU General Public License
+ */
+
+require_once(DIR_FS_CATALOG.'ext/modules/payment/inpay/inpay_functions.php');
+
+class inpay
+{
+    var $code, $title, $description, $enabled;
+
+    // class constructor
+    function inpay()
+    {
+        global $order;
+        $this->signature = 'inpay|inpay|1.0|2.2';
+        $this->code = 'inpay';
+        $this->title = MODULE_PAYMENT_INPAY_TEXT_TITLE;
+        $this->public_title = MODULE_PAYMENT_INPAY_TEXT_PUBLIC_TITLE;
+        $this->description = MODULE_PAYMENT_INPAY_TEXT_DESCRIPTION;
+        $this->sort_order = MODULE_PAYMENT_INPAY_SORT_ORDER;
+        $this->enabled = ((MODULE_PAYMENT_INPAY_STATUS == 'True')?true:false);
+
+        //        if ((int)MODULE_PAYMENT_INPAY_PREPARE_ORDER_STATUS_ID > 0)
+        //        {
+        //            $this->order_status = MODULE_PAYMENT_INPAY_PREPARE_ORDER_STATUS_ID;
+        //        }
+
+        if (is_object($order))$this->update_status();
+
+        if (MODULE_PAYMENT_INPAY_GATEWAY_SERVER == 'Production')
+        {
+            $this->form_action_url = 'https://secure.inpay.com';
+        } else
+        {
+            $this->form_action_url = 'https://test-secure.inpay.com';
+        }
+    }
+
+    // class methods
+    function update_status()
+    {
+        global $order;
+
+        if (($this->enabled == true) && ((int)MODULE_PAYMENT_INPAY_ZONE > 0))
+        {
+            $check_flag = false;
+            $check_query = tep_db_query("select zone_id from ".TABLE_ZONES_TO_GEO_ZONES." where geo_zone_id = '".MODULE_PAYMENT_INPAY_ZONE."' and zone_country_id = '".$order->billing['country']['id']."' order by zone_id");
+            while ($check = tep_db_fetch_array($check_query))
+            {
+                if ($check['zone_id'] < 1)
+                {
+                    $check_flag = true;
+                    break;
+                } elseif ($check['zone_id'] == $order->billing['zone_id'])
+                {
+                    $check_flag = true;
+                    break;
+                }
+            }
+
+            if ($check_flag == false)
+            {
+                $this->enabled = false;
+            }
+        }
+    }
+
+    function javascript_validation()
+    {
+        return false;
+    }
+
+    function selection()
+    {
+        global $cart_inpay_Standard_ID;
+
+        if (tep_session_is_registered('cart_inpay_Standard_ID'))
+        {
+            $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+
+            $check_query = tep_db_query('select orders_id from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'" limit 1');
+
+            if (tep_db_num_rows($check_query) < 1)
+            {
+                tep_db_query('delete from '.TABLE_ORDERS.' where orders_id = "'.(int)$order_id.'"');
+                tep_db_query('delete from '.TABLE_ORDERS_TOTAL.' where orders_id = "'.(int)$order_id.'"');
+                tep_db_query('delete from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'"');
+                tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS.' where orders_id = "'.(int)$order_id.'"');
+                tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_ATTRIBUTES.' where orders_id = "'.(int)$order_id.'"');
+                tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_DOWNLOAD.' where orders_id = "'.(int)$order_id.'"');
+
+                tep_session_unregister('cart_inpay_Standard_ID');
+            }
+        }
+
+        return array ('id'=>$this->code,
+        'module'=>$this->public_title, 'fields' => array(array('title' => '', 'field' => MODULE_PAYMENT_INPAY_TEXT_PUBLIC_HTML)));
+    }
+
+    function pre_confirmation_check()
+    {
+        global $cartID, $cart;
+
+        if ( empty($cart->cartID))
+        {
+            $cartID = $cart->cartID = $cart->generate_cart_id();
+        }
+
+        if (!tep_session_is_registered('cartID'))
+        {
+            tep_session_register('cartID');
+        }
+    }
+
+    function confirmation()
+    {
+        global $cartID, $cart_inpay_Standard_ID, $customer_id, $languages_id, $order, $order_total_modules;
+
+        if (tep_session_is_registered('cartID'))
+        {
+            $insert_order = false;
+
+            if (tep_session_is_registered('cart_inpay_Standard_ID'))
+            {
+                $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+
+                $curr_check = tep_db_query("select currency from ".TABLE_ORDERS." where orders_id = '".(int)$order_id."'");
+                $curr = tep_db_fetch_array($curr_check);
+
+                if (($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_inpay_Standard_ID, 0, strlen($cartID))))
+                {
+                    $check_query = tep_db_query('select orders_id from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'" limit 1');
+
+                    if (tep_db_num_rows($check_query) < 1)
+                    {
+                        tep_db_query('delete from '.TABLE_ORDERS.' where orders_id = "'.(int)$order_id.'"');
+                        tep_db_query('delete from '.TABLE_ORDERS_TOTAL.' where orders_id = "'.(int)$order_id.'"');
+                        tep_db_query('delete from '.TABLE_ORDERS_STATUS_HISTORY.' where orders_id = "'.(int)$order_id.'"');
+                        tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS.' where orders_id = "'.(int)$order_id.'"');
+                        tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_ATTRIBUTES.' where orders_id = "'.(int)$order_id.'"');
+                        tep_db_query('delete from '.TABLE_ORDERS_PRODUCTS_DOWNLOAD.' where orders_id = "'.(int)$order_id.'"');
+                    }
+
+                    $insert_order = true;
+                }
+            } else
+            {
+                $insert_order = true;
+            }
+
+            if ($insert_order == true)
+            {
+                $order_totals = array ();
+                if (is_array($order_total_modules->modules))
+                {
+                    reset($order_total_modules->modules);
+                    while ( list (, $value) = each($order_total_modules->modules))
+                    {
+                        $class = substr($value, 0, strrpos($value, '.'));
+                        if ($GLOBALS[$class]->enabled)
+                        {
+                            for ($i = 0, $n = sizeof($GLOBALS[$class]->output); $i < $n; $i++)
+                            {
+                                if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text']))
+                                {
+                                    $order_totals[] = array ('code'=>$GLOBALS[$class]->code,
+                                    'title'=>$GLOBALS[$class]->output[$i]['title'],
+                                    'text'=>$GLOBALS[$class]->output[$i]['text'],
+                                    'value'=>$GLOBALS[$class]->output[$i]['value'],
+                                    'sort_order'=>$GLOBALS[$class]->sort_order);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                $sql_data_array = array ('customers_id'=>$customer_id,
+                'customers_name'=>$order->customer['firstname'].' '.$order->customer['lastname'],
+                'customers_company'=>$order->customer['company'],
+                'customers_street_address'=>$order->customer['street_address'],
+                'customers_suburb'=>$order->customer['suburb'],
+                'customers_city'=>$order->customer['city'],
+                'customers_postcode'=>$order->customer['postcode'],
+                'customers_state'=>$order->customer['state'],
+                'customers_country'=>$order->customer['country']['title'],
+                'customers_telephone'=>$order->customer['telephone'],
+                'customers_email_address'=>$order->customer['email_address'],
+                'customers_address_format_id'=>$order->customer['format_id'],
+                'delivery_name'=>$order->delivery['firstname'].' '.$order->delivery['lastname'],
+                'delivery_company'=>$order->delivery['company'],
+                'delivery_street_address'=>$order->delivery['street_address'],
+                'delivery_suburb'=>$order->delivery['suburb'],
+                'delivery_city'=>$order->delivery['city'],
+                'delivery_postcode'=>$order->delivery['postcode'],
+                'delivery_state'=>$order->delivery['state'],
+                'delivery_country'=>$order->delivery['country']['title'],
+                'delivery_address_format_id'=>$order->delivery['format_id'],
+                'billing_name'=>$order->billing['firstname'].' '.$order->billing['lastname'],
+                'billing_company'=>$order->billing['company'],
+                'billing_street_address'=>$order->billing['street_address'],
+                'billing_suburb'=>$order->billing['suburb'],
+                'billing_city'=>$order->billing['city'],
+                'billing_postcode'=>$order->billing['postcode'],
+                'billing_state'=>$order->billing['state'],
+                'billing_country'=>$order->billing['country']['title'],
+                'billing_address_format_id'=>$order->billing['format_id'],
+                'payment_method'=>$order->info['payment_method'],
+                'cc_type'=>$order->info['cc_type'],
+                'cc_owner'=>$order->info['cc_owner'],
+                'cc_number'=>$order->info['cc_number'],
+                'cc_expires'=>$order->info['cc_expires'],
+                'date_purchased'=>'now()',
+                'orders_status'=>$order->info['order_status'],
+                'currency'=>$order->info['currency'],
+                'currency_value'=>$order->info['currency_value']);
+
+                tep_db_perform(TABLE_ORDERS, $sql_data_array);
+
+                $insert_id = tep_db_insert_id();
+
+                for ($i = 0, $n = sizeof($order_totals); $i < $n; $i++)
+                {
+                    $sql_data_array = array ('orders_id'=>$insert_id,
+                    'title'=>$order_totals[$i]['title'],
+                    'text'=>$order_totals[$i]['text'],
+                    'value'=>$order_totals[$i]['value'],
+                    'class'=>$order_totals[$i]['code'],
+                    'sort_order'=>$order_totals[$i]['sort_order']);
+
+                    tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
+                }
+
+                for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+                {
+                    $sql_data_array = array ('orders_id'=>$insert_id,
+                    'products_id'=>tep_get_prid($order->products[$i]['id']),
+                    'products_model'=>$order->products[$i]['model'],
+                    'products_name'=>$order->products[$i]['name'],
+                    'products_price'=>$order->products[$i]['price'],
+                    'final_price'=>$order->products[$i]['final_price'],
+                    'products_tax'=>$order->products[$i]['tax'],
+                    'products_quantity'=>$order->products[$i]['qty']);
+
+                    tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
+
+                    $order_products_id = tep_db_insert_id();
+
+                    $attributes_exist = '0';
+                    if ( isset ($order->products[$i]['attributes']))
+                    {
+                        $attributes_exist = '1';
+                        for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+                        {
+                            if (DOWNLOAD_ENABLED == 'true')
+                            {
+                                $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                       from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa
+                                       left join ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+                                       on pa.products_attributes_id=pad.products_attributes_id
+                                       where pa.products_id = '".$order->products[$i]['id']."'
+                                       and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."'
+                                       and pa.options_id = popt.products_options_id
+                                       and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."'
+                                       and pa.options_values_id = poval.products_options_values_id
+                                       and popt.language_id = '".$languages_id."'
+                                       and poval.language_id = '".$languages_id."'";
+                                $attributes = tep_db_query($attributes_query);
+                            } else
+                            {
+                                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa where pa.products_id = '".$order->products[$i]['id']."' and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."' and pa.options_id = popt.products_options_id and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '".$languages_id."' and poval.language_id = '".$languages_id."'");
+                            }
+                            $attributes_values = tep_db_fetch_array($attributes);
+
+                            $sql_data_array = array ('orders_id'=>$insert_id,
+                            'orders_products_id'=>$order_products_id,
+                            'products_options'=>$attributes_values['products_options_name'],
+                            'products_options_values'=>$attributes_values['products_options_values_name'],
+                            'options_values_price'=>$attributes_values['options_values_price'],
+                            'price_prefix'=>$attributes_values['price_prefix']);
+
+                            tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
+
+                            if ((DOWNLOAD_ENABLED == 'true') && isset ($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename']))
+                            {
+                                $sql_data_array = array ('orders_id'=>$insert_id,
+                                'orders_products_id'=>$order_products_id,
+                                'orders_products_filename'=>$attributes_values['products_attributes_filename'],
+                                'download_maxdays'=>$attributes_values['products_attributes_maxdays'],
+                                'download_count'=>$attributes_values['products_attributes_maxcount']);
+
+                                tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
+                            }
+                        }
+                    }
+                }
+
+                $cart_inpay_Standard_ID = $cartID.'-'.$insert_id;
+                tep_session_register('cart_inpay_Standard_ID');
+            }
+        }
+
+        return false;
+    }
+
+    function process_button()
+    {
+        global $customer_id, $order, $sendto, $currency, $cart_inpay_Standard_ID, $shipping;
+
+        $process_button_string = '';
+        $parameters = array ('cmd'=>'_xclick',
+        'item_name'=>STORE_NAME,
+        'shipping'=>$this->format_raw($order->info['shipping_cost']),
+        'tax'=>$this->format_raw($order->info['tax']),
+        //'business'=>MODULE_PAYMENT_INPAY_ID,
+        'amount'=>$this->format_raw($order->info['total']), //TODO: we do not calculate tax+shipping only gross total -$order->info['shipping_cost']-$order->info['tax']),
+        'currency'=>$currency,
+        'order_id'=>substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1),
+        'custom'=>$customer_id,
+        'no_note'=>'1',
+        'notify_url'=>tep_href_link('ext/modules/payment/inpay/pb_handler.php', '', 'SSL', false, false),
+        'return_url'=>tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'),
+        'cancel_url'=>tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'),
+        'bn'=>'osCommerce22_Default_ST',
+        'buyer_email'=>$order->customer['email_address'],
+        'merchant_id'=>MODULE_PAYMENT_INPAY_MERCHANT_ID,
+        'flow_layout'=>MODULE_PAYMENT_INPAY_FLOW_LAYOUT,
+        'paymentaction'=>'Sale');
+
+        if (is_numeric($sendto) && ($sendto > 0))
+        {
+            $address = '';
+            $address = $order->delivery['street_address'].' '.$order->delivery['city'].' '.
+            tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']).
+            ' '.$order->delivery['postcode'].' '.$order->delivery['country']['iso_code_2'];
+
+            $parameters['address_override'] = '1';
+            $parameters['buyer_name'] = utf8_encode($order->delivery['firstname']." ".$order->delivery['lastname']);
+            $parameters['buyer_address'] = utf8_encode($address);
+            $parameters['country'] = $order->delivery['country']['iso_code_2'];
+        } else
+        {
+            $address = '';
+            $address = $order->billing['street_address'].' '.$order->billing['city'].' '.
+            tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']).
+            ' '.$order->billing['postcode'].' '.$order->billing['country']['iso_code_2'];
+            $parameters['buyer_name'] = utf8_encode($order->billing['firstname']." ".$order->billing['lastname']);
+            $parameters['buyer_address'] = utf8_encode($address);
+            $parameters['country'] = $order->billing['country']['iso_code_2'];
+        }
+        //
+        // pruduct(s) info
+        //
+        $products_info = '';
+        for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+        {
+            $products_info = $products_info.$order->products[$i]['qty']."x".
+            $order->products[$i]['model'].' '.$order->products[$i]['name'].";";
+        }
+        $parameters['order_text'] = utf8_encode($products_info);
+        //
+        // calc Md5 sum
+        //
+        $parameters['checksum'] = $this->calcInpayMd5Key($parameters);
+        reset($parameters);
+        while ( list ($key, $value) = each($parameters))
+        {
+            $process_button_string .= tep_draw_hidden_field($key, $value);
+        }
+        return $process_button_string;
+    }
+
+    function before_process()
+    {
+        global $customer_id, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart, $cart_inpay_Standard_ID;
+        global $$payment;
+        $order_id = substr($cart_inpay_Standard_ID, strpos($cart_inpay_Standard_ID, '-')+1);
+        $my_status_query = tep_db_query("select orders_status from ".TABLE_ORDERS." where orders_id = '".$order_id."'"); // TODO: fix PB to add all params"' and customers_id = '" . (int)$HTTP_POST_VARS['custom'] . "'");
+        $current_status_id = 0;
+        $delivered_status = 3;
+        $update_status = true;
+        if (tep_db_num_rows($my_status_query) > 0)
+        {
+            $o_stat = tep_db_fetch_array($my_status_query);
+            $current_status_id = (int)$o_stat['orders_status'];
+        }
+        if (($current_status_id == MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID) || ($current_status_id == $delivered_status))
+        {
+            $update_status = false;
+        }
+        if ($update_status)
+        {
+            $order_status_id = (int)DEFAULT_ORDERS_STATUS_ID;
+            tep_db_query("update ".TABLE_ORDERS." set orders_status = '".$order_status_id."', last_modified = now() where orders_id = '".(int)$order_id."'");
+
+            $sql_data_array = array ('orders_id'=>$order_id,
+            'orders_status_id'=>$order_status_id,
+            'date_added'=>'now()',
+            'customer_notified'=>(SEND_EMAILS == 'true')?'1':'0',
+            'comments'=>$order->info['comments']);
+
+            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+        }
+        // initialized for the email confirmation
+        $products_ordered = '';
+        $subtotal = 0;
+        $total_tax = 0;
+
+        for ($i = 0, $n = sizeof($order->products); $i < $n; $i++)
+        {
+            // Stock Update - Joao Correia
+            if ((MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION == 'True') && (STOCK_LIMITED == 'true'))
+            {
+                if (DOWNLOAD_ENABLED == 'true')
+                {
+                    $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
+                                FROM ".TABLE_PRODUCTS." p
+                                LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES." pa
+                                ON p.products_id=pa.products_id
+                                LEFT JOIN ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+                                ON pa.products_attributes_id=pad.products_attributes_id
+                                WHERE p.products_id = '".tep_get_prid($order->products[$i]['id'])."'";
+                    // Will work with only one option for downloadable products
+                    // otherwise, we have to build the query dynamically with a loop
+                    $products_attributes = $order->products[$i]['attributes'];
+                    if (is_array($products_attributes))
+                    {
+                        $stock_query_raw .= " AND pa.options_id = '".$products_attributes[0]['option_id']."' AND pa.options_values_id = '".$products_attributes[0]['value_id']."'";
+                    }
+                    $stock_query = tep_db_query($stock_query_raw);
+                } else
+                {
+                    $stock_query = tep_db_query("select products_quantity from ".TABLE_PRODUCTS." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                }
+                if (tep_db_num_rows($stock_query) > 0)
+                {
+                    $stock_values = tep_db_fetch_array($stock_query);
+                    // do not decrement quantities if products_attributes_filename exists
+                    if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename']))
+                    {
+                        $stock_left = $stock_values['products_quantity']-$order->products[$i]['qty'];
+                    } else
+                    {
+                        $stock_left = $stock_values['products_quantity'];
+                    }
+                    tep_db_query("update ".TABLE_PRODUCTS." set products_quantity = '".$stock_left."' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                    if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false'))
+                    {
+                        tep_db_query("update ".TABLE_PRODUCTS." set products_status = '0' where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+                    }
+                }
+            } // Decrease stock ended
+
+            // Update products_ordered (for bestsellers list)
+            tep_db_query("update ".TABLE_PRODUCTS." set products_ordered = products_ordered + ".sprintf('%d', $order->products[$i]['qty'])." where products_id = '".tep_get_prid($order->products[$i]['id'])."'");
+
+            //------insert customer choosen option to order--------
+            $attributes_exist = '0';
+            $products_ordered_attributes = '';
+            if ( isset ($order->products[$i]['attributes']))
+            {
+                $attributes_exist = '1';
+                for ($j = 0, $n2 = sizeof($order->products[$i]['attributes']); $j < $n2; $j++)
+                {
+                    if (DOWNLOAD_ENABLED == 'true')
+                    {
+                        $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                   from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa
+                                   left join ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad
+                                   on pa.products_attributes_id=pad.products_attributes_id
+                                   where pa.products_id = '".$order->products[$i]['id']."'
+                                   and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."'
+                                   and pa.options_id = popt.products_options_id
+                                   and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."'
+                                   and pa.options_values_id = poval.products_options_values_id
+                                   and popt.language_id = '".$languages_id."'
+                                   and poval.language_id = '".$languages_id."'";
+                        $attributes = tep_db_query($attributes_query);
+                    } else
+                    {
+                        $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa where pa.products_id = '".$order->products[$i]['id']."' and pa.options_id = '".$order->products[$i]['attributes'][$j]['option_id']."' and pa.options_id = popt.products_options_id and pa.options_values_id = '".$order->products[$i]['attributes'][$j]['value_id']."' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '".$languages_id."' and poval.language_id = '".$languages_id."'");
+                    }
+                    $attributes_values = tep_db_fetch_array($attributes);
+
+                    $products_ordered_attributes .= "\n\t".$attributes_values['products_options_name'].' '.$attributes_values['products_options_values_name'];
+                }
+            }
+            //------insert customer choosen option eof ----
+            $total_weight += ($order->products[$i]['qty']*$order->products[$i]['weight']);
+            $total_tax += tep_calculate_tax($total_products_price, $products_tax)*$order->products[$i]['qty'];
+            $total_cost += $total_products_price;
+
+            $products_ordered .= $order->products[$i]['qty'].' x '.$order->products[$i]['name'].' ('.$order->products[$i]['model'].') = '.$currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']).$products_ordered_attributes."\n";
+        }
+
+        // lets start with the email confirmation
+        $email_order = STORE_NAME."\n".
+        EMAIL_SEPARATOR."\n".
+        EMAIL_TEXT_ORDER_NUMBER.' '.$order_id."\n".
+        EMAIL_TEXT_INVOICE_URL.' '.tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id='.$order_id, 'SSL', false)."\n".
+        EMAIL_TEXT_DATE_ORDERED.' '.strftime(DATE_FORMAT_LONG)."\n\n";
+        if ($order->info['comments'])
+        {
+            $email_order .= tep_db_output($order->info['comments'])."\n\n";
+        }
+        $email_order .= EMAIL_TEXT_PRODUCTS."\n".
+        EMAIL_SEPARATOR."\n".
+        $products_ordered.
+        EMAIL_SEPARATOR."\n";
+
+        for ($i = 0, $n = sizeof($order_totals); $i < $n; $i++)
+        {
+            $email_order .= strip_tags($order_totals[$i]['title']).' '.strip_tags($order_totals[$i]['text'])."\n";
+        }
+
+        if ($order->content_type != 'virtual')
+        {
+            $email_order .= "\n".EMAIL_TEXT_DELIVERY_ADDRESS."\n".
+            EMAIL_SEPARATOR."\n".
+            tep_address_label($customer_id, $sendto, 0, '', "\n")."\n";
+        }
+
+        $email_order .= "\n".EMAIL_TEXT_BILLING_ADDRESS."\n".
+        EMAIL_SEPARATOR."\n".
+        tep_address_label($customer_id, $billto, 0, '', "\n")."\n\n";
+
+        if (is_object($$payment))
+        {
+            $email_order .= EMAIL_TEXT_PAYMENT_METHOD."\n".
+            EMAIL_SEPARATOR."\n";
+            $payment_class = $$payment;
+            $email_order .= $payment_class->title."\n\n";
+            if ($payment_class->email_footer)
+            {
+                $email_order .= $payment_class->email_footer."\n\n";
+            }
+        }
+        //
+        // sent email only if post back not did not respond - we send it from post back handler
+        //
+        if ($update_status)
+        {
+            tep_mail($order->customer['firstname'].' '.$order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+			// send emails to other people
+            if (SEND_EXTRA_ORDER_EMAILS_TO != '')
+            {
+                tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+            }
+        }
+        // load the after_process function from the payment modules
+        $this->after_process();
+
+        $cart->reset(true);
+
+        // unregister session variables used during checkout
+        tep_session_unregister('sendto');
+        tep_session_unregister('billto');
+        tep_session_unregister('shipping');
+        tep_session_unregister('payment');
+        tep_session_unregister('comments');
+
+        tep_session_unregister('cart_inpay_Standard_ID');
+
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
+    }
+
+    function after_process()
+    {
+        return false;
+    }
+
+    function output_error()
+    {
+        return false;
+    }
+
+    function check()
+    {
+        if (! isset ($this->_check))
+        {
+            $check_query = tep_db_query("select configuration_value from ".TABLE_CONFIGURATION." where configuration_key = 'MODULE_PAYMENT_INPAY_STATUS'");
+            $this->_check = tep_db_num_rows($check_query);
+        }
+        return $this->_check;
+    }
+    function set_order_status($order_status, $set_to_public)
+    {
+        $status_id = 0;
+        $check_query = tep_db_query("select orders_status_id from ".TABLE_ORDERS_STATUS." where orders_status_name = '".$order_status."' limit 1");
+        if (tep_db_num_rows($check_query) < 1)
+        {
+            $status_query = tep_db_query("select max(orders_status_id) as status_id from ".TABLE_ORDERS_STATUS);
+            $status = tep_db_fetch_array($status_query);
+            $status_id = $status['status_id']+1;
+            $languages = tep_get_languages();
+			$flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+            if (tep_db_num_rows($flags_query) == 1) {
+              foreach ($languages as $lang)
+              {
+                tep_db_query("insert into ".TABLE_ORDERS_STATUS." (orders_status_id, language_id, orders_status_name, public_flag) values ('".$status_id."', '".$lang['id']."', "."'".$order_status."', 1)");
+              }
+            }else{
+              foreach ($languages as $lang)
+              {
+                tep_db_query("insert into ".TABLE_ORDERS_STATUS." (orders_status_id, language_id, orders_status_name) values ('".$status_id."', '".$lang['id']."', "."'".$order_status."')");
+              }	
+            }
+			
+            
+        } else
+        {
+            $check = tep_db_fetch_array($check_query);
+            $status_id = $check['orders_status_id'];
+        }
+        return $status_id;
+    }
+    function install()
+    {
+        $created_status_id = $this->set_order_status('Processing [inpay]', true);
+        $sum_too_low_status_id = $this->set_order_status('Sum too low [inpay]', true);
+        $completed_status_id = $this->set_order_status('Completed [inpay]', true);
+
+		$sort_order = 0;
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable inpay on your webshop?', 'MODULE_PAYMENT_INPAY_STATUS', 'False', '', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Gateway Server', 'MODULE_PAYMENT_INPAY_GATEWAY_SERVER', 'Production', 'Use the testing or production gateway server for transactions', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'Production\', \'Test\'), ', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your merchant id', 'MODULE_PAYMENT_INPAY_MERCHANT_ID', '', 'Your merchant unique identifier (supplied by inpay)', '6', '".$sort_order++."', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your secret key', 'MODULE_PAYMENT_INPAY_SECRET_KEY', '', 'Your secret key (supplied by inpay)', '6', '".$sort_order++."', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Flow Layout', 'MODULE_PAYMENT_INPAY_FLOW_LAYOUT', 'multi_page', 'Layout for the buyer flow', '6', '".$sort_order++."', now())");
+        
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Decrease stock on payment creation', 'MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION', 'False', 'Do you want to decrease stock upon payment creation?', '6', '".$sort_order++."', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail Address', 'MODULE_PAYMENT_INPAY_DEBUG_EMAIL', '', 'All parameters of an Invalid IPN notification will be sent to this email address if one is entered.', '6', '".$sort_order++."', now())");
+        
+        
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_INPAY_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '".$sort_order++."', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+        
+        //tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('E-Mail Address', 'MODULE_PAYMENT_INPAY_ID', '', 'The inpay seller e-mail address to accept payments for', '6', '4', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_INPAY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '".$sort_order++."', now())");
+
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay Acknowledged Order Status', 'MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID', '".$created_status_id."', 'Set the status of orders made with this payment module to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay sum too low Order Status', 'MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID', '".$sum_too_low_status_id."', 'Set the status of orders which are paid with insufficient fund (sum too low) to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set inpay Completed Order Status', 'MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID', '".$completed_status_id."', 'Set the status of orders which are confirmed as paid (approved) to this value', '6', '".$sort_order++."', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+
+        //        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_INPAY_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+        //        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Encrypted Web Payments', 'MODULE_PAYMENT_INPAY_EWP_STATUS', 'False', 'Do you want to enable Encrypted Web Payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+        //        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Working Directory', 'MODULE_PAYMENT_INPAY_EWP_WORKING_DIRECTORY', '', 'The working directory to use for temporary files. (trailing slash needed)', '6', '4', now())");
+        //        tep_db_query("insert into ".TABLE_CONFIGURATION." (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('OpenSSL Location', 'MODULE_PAYMENT_INPAY_EWP_OPENSSL', '/usr/bin/openssl', 'The location of the openssl binary file.', '6', '4', now())");
+    }
+
+    function remove()
+    {
+        tep_db_query("delete from ".TABLE_CONFIGURATION." where configuration_key in ('".implode("', '", $this->keys())."')");
+        tep_db_query("delete from ".TABLE_ORDERS_STATUS." where orders_status_name like '%[inpay]%'");
+    }
+
+    function keys()
+    {
+    	//'MODULE_PAYMENT_INPAY_ID', 
+        return array('MODULE_PAYMENT_INPAY_STATUS', 'MODULE_PAYMENT_INPAY_GATEWAY_SERVER', 'MODULE_PAYMENT_INPAY_MERCHANT_ID', 'MODULE_PAYMENT_INPAY_SECRET_KEY', 'MODULE_PAYMENT_INPAY_FLOW_LAYOUT', 'MODULE_PAYMENT_INPAY_DECREASE_STOCK_ON_CREATION', 'MODULE_PAYMENT_INPAY_DEBUG_EMAIL', 'MODULE_PAYMENT_INPAY_ZONE', 'MODULE_PAYMENT_INPAY_SORT_ORDER', 'MODULE_PAYMENT_INPAY_CREATE_ORDER_STATUS_ID', 'MODULE_PAYMENT_INPAY_SUM_TOO_LOW_ORDER_STATUS_ID', 'MODULE_PAYMENT_INPAY_COMP_ORDER_STATUS_ID');
+    }
+
+    // format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '')
+    {
+        global $currencies, $currency;
+
+        if ( empty($currency_code) || !$this->is_set($currency_code))
+        {
+            $currency_code = $currency;
+        }
+
+        if ( empty($currency_value) || !is_numeric($currency_value))
+        {
+            $currency_value = $currencies->currencies[$currency_code]['value'];
+        }
+
+        return number_format(tep_round($number*$currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+    //
+    // calculate inpay MD5 for invoice creation
+    //
+    function calcInpayMd5Key($order)
+    {
+    	
+        $sk = MODULE_PAYMENT_INPAY_SECRET_KEY;
+        $q = http_build_query( array ("merchant_id"=>$order['merchant_id'],
+        "order_id"=>$order['order_id'],
+        "amount"=>$order['amount'],
+        "currency"=>$order['currency'],
+        "order_text"=>$order['order_text'],
+        "flow_layout"=>$order['flow_layout'],
+        "secret_key"=>$sk), "", "&");
+        $md5v = md5($q);
+        return $md5v;
+    }
+}
+
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/ipayment_cc.php 2.3.1.src/includes/modules/payment/ipayment_cc.php
--- 2.2rc2a.cp.src/includes/modules/payment/ipayment_cc.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/ipayment_cc.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: ipayment_cc.php 1815 2008-01-14 10:55:23Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -17,7 +17,8 @@
     function ipayment_cc() {
       global $order;
 
-      $this->signature = 'ipayment|ipayment_cc|1.0|2.2';
+      $this->signature = 'ipayment|ipayment_cc|1.1|2.2';
+      $this->api_version = '2.0';
 
       $this->code = 'ipayment_cc';
       $this->title = MODULE_PAYMENT_IPAYMENT_CC_TEXT_TITLE;
@@ -30,9 +31,11 @@
         $this->order_status = MODULE_PAYMENT_IPAYMENT_CC_ORDER_STATUS_ID;
       }
 
+      $this->gateway_addresses = array('212.227.34.218', '212.227.34.219', '212.227.34.220');
+
       if (is_object($order)) $this->update_status();
 
-      $this->form_action_url = 'https://ipayment.de/merchant/' . MODULE_PAYMENT_IPAYMENT_CC_ID . '/processor.php';
+      $this->form_action_url = 'https://ipayment.de/merchant/' . MODULE_PAYMENT_IPAYMENT_CC_ID . '/processor/2.0/';
     }
 
 // class methods
@@ -113,8 +116,6 @@
                                tep_draw_hidden_field('trx_paymenttyp', 'cc') .
                                tep_draw_hidden_field('trxuser_id', MODULE_PAYMENT_IPAYMENT_CC_USER_ID) .
                                tep_draw_hidden_field('trxpassword', MODULE_PAYMENT_IPAYMENT_CC_PASSWORD) .
-//                               tep_draw_hidden_field('order_id', '') .
-//                               tep_draw_hidden_field('strict_id_check', 1) .
                                tep_draw_hidden_field('from_ip', tep_get_ip_address()) .
                                tep_draw_hidden_field('trx_currency', $currency) .
                                tep_draw_hidden_field('trx_amount', $this->format_raw($order->info['total'])*100) .
@@ -128,8 +129,9 @@
                                tep_draw_hidden_field('addr_telefon', $order->customer['telephone']) .
                                tep_draw_hidden_field('redirect_url', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', true)) .
                                tep_draw_hidden_field('silent_error_url', tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', true)) .
+                               tep_draw_hidden_field('hidden_trigger_url', tep_href_link('ext/modules/payment/ipayment/callback_cc.php', '', 'SSL', false)) .
                                tep_draw_hidden_field('client_name', 'oscommerce') .
-                               tep_draw_hidden_field('client_version', PROJECT_VERSION);
+                               tep_draw_hidden_field('client_version', $this->signature);
 
       if (tep_not_null(MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
         $process_button_string .= tep_draw_hidden_field('trx_securityhash', md5(MODULE_PAYMENT_IPAYMENT_CC_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . MODULE_PAYMENT_IPAYMENT_CC_PASSWORD . MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD));
@@ -139,14 +141,30 @@
     }
 
     function before_process() {
-      global $HTTP_GET_VARS, $order, $currency;
+      global $HTTP_GET_VARS, $HTTP_SERVER_VARS, $order, $currency;
 
       if ($HTTP_GET_VARS['ret_errorcode'] != '0') {
         tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=' . tep_output_string_protected($HTTP_GET_VARS['ret_errormsg'])));
       }
 
-      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD) && ($HTTP_GET_VARS['ret_param_checksum'] != md5(MODULE_PAYMENT_IPAYMENT_CC_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . $HTTP_GET_VARS['ret_authcode'] . $HTTP_GET_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD))) {
-        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code));
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
+        $pass = true;
+
+// verify ret_param_checksum
+        if ($HTTP_GET_VARS['ret_param_checksum'] != md5(MODULE_PAYMENT_IPAYMENT_CC_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . $HTTP_GET_VARS['ret_authcode'] . $HTTP_GET_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+// verify ret_url_checksum
+        $url= 'http' . (ENABLE_SSL == true ? 's' : '') . '://' . $HTTP_SERVER_VARS['SERVER_NAME'] . $HTTP_SERVER_VARS['REQUEST_URI'];
+        $url_without_checksum = substr($url, 0, strpos($url, '&ret_url_checksum')+1);
+        if ($HTTP_GET_VARS['ret_url_checksum'] != md5($url_without_checksum . MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+        if ($pass != true) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code));
+        }
       }
 
       return false;
@@ -176,10 +194,11 @@
     function install() {
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable iPayment', 'MODULE_PAYMENT_IPAYMENT_CC_STATUS', 'False', 'Do you want to accept iPayment payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Account Number', 'MODULE_PAYMENT_IPAYMENT_CC_ID', '99999', 'The account number used for the iPayment service', '6', '2', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User ID', 'MODULE_PAYMENT_IPAYMENT_CC_USER_ID', '99999', 'The user ID for the iPayment service', '6', '3', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User ID', 'MODULE_PAYMENT_IPAYMENT_CC_USER_ID', '99998', 'The user ID for the iPayment service', '6', '3', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User Password', 'MODULE_PAYMENT_IPAYMENT_CC_PASSWORD', '0', 'The user password for the iPayment service', '6', '4', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_IPAYMENT_CC_TRANSACTION_METHOD', 'Authorization', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Capture\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Hash Password', 'MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD', '', 'The secret hash password to validate transactions with', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Hash Password', 'MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD', 'testtest', 'The secret hash password to validate transactions with', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Transaction Notification (E-Mail)', 'MODULE_PAYMENT_IPAYMENT_CC_DEBUG_EMAIL', '', 'An e-mail address to send transaction notifications to.', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_IPAYMENT_CC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_IPAYMENT_CC_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_IPAYMENT_CC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
@@ -190,7 +209,7 @@
     }
 
     function keys() {
-      return array('MODULE_PAYMENT_IPAYMENT_CC_STATUS', 'MODULE_PAYMENT_IPAYMENT_CC_ID', 'MODULE_PAYMENT_IPAYMENT_CC_USER_ID', 'MODULE_PAYMENT_IPAYMENT_CC_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_CC_TRANSACTION_METHOD', 'MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_CC_ZONE', 'MODULE_PAYMENT_IPAYMENT_CC_ORDER_STATUS_ID', 'MODULE_PAYMENT_IPAYMENT_CC_SORT_ORDER');
+      return array('MODULE_PAYMENT_IPAYMENT_CC_STATUS', 'MODULE_PAYMENT_IPAYMENT_CC_ID', 'MODULE_PAYMENT_IPAYMENT_CC_USER_ID', 'MODULE_PAYMENT_IPAYMENT_CC_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_CC_TRANSACTION_METHOD', 'MODULE_PAYMENT_IPAYMENT_CC_SECRET_HASH_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_CC_DEBUG_EMAIL', 'MODULE_PAYMENT_IPAYMENT_CC_ZONE', 'MODULE_PAYMENT_IPAYMENT_CC_ORDER_STATUS_ID', 'MODULE_PAYMENT_IPAYMENT_CC_SORT_ORDER');
     }
 
 // format prices without currency formatting
@@ -207,5 +226,53 @@
 
       return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
     }
+
+    function sendDebugEmail($checksum_match = 0) {
+      global $HTTP_POST_VARS, $HTTP_GET_VARS;
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_CC_DEBUG_EMAIL)) {
+        $email_body = 'iPayment (Credit Card) Transaction' . "\n\n" .
+                      'Date: ' . strftime(DATE_TIME_FORMAT) . "\n" .
+                      'Checksum Match: ';
+
+        switch ($checksum_match) {
+          case 1:
+            $email_body .= 'Valid';
+            break;
+
+          case -1:
+            $email_body .= '##### Invalid #####';
+            break;
+
+          case 0:
+          default:
+            $email_body .= 'Unknown';
+            break;
+        }
+
+        $email_body .= "\n\n" .
+                       'POST REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_POST_VARS)) {
+          foreach ($HTTP_POST_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        $email_body .= "\n" . 'GET REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_GET_VARS)) {
+          foreach ($HTTP_GET_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        tep_mail('', MODULE_PAYMENT_IPAYMENT_CC_DEBUG_EMAIL, 'iPayment (Credit Card) Transaction', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+      }
+    }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/ipayment_elv.php 2.3.1.src/includes/modules/payment/ipayment_elv.php
--- 2.2rc2a.cp.src/includes/modules/payment/ipayment_elv.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/ipayment_elv.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,269 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ipayment_elv {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function ipayment_elv() {
+      global $order;
+
+      $this->signature = 'ipayment|ipayment_elv|1.0|2.2';
+      $this->api_version = '2.0';
+
+      $this->code = 'ipayment_elv';
+      $this->title = MODULE_PAYMENT_IPAYMENT_ELV_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_IPAYMENT_ELV_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_IPAYMENT_ELV_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_IPAYMENT_ELV_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_IPAYMENT_ELV_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_IPAYMENT_ELV_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_IPAYMENT_ELV_ORDER_STATUS_ID;
+      }
+
+      $this->gateway_addresses = array('212.227.34.218', '212.227.34.219', '212.227.34.220');
+
+      if (is_object($order)) $this->update_status();
+
+      $this->form_action_url = 'https://ipayment.de/merchant/' . MODULE_PAYMENT_IPAYMENT_ELV_ID . '/processor/2.0/';
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_IPAYMENT_ELV_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_IPAYMENT_ELV_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      global $order;
+
+      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_ACCOUNT_OWNER,
+                                                    'field' => tep_draw_input_field('addr_name', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
+                                              array('title' => MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_ACCOUNT_NUMBER,
+                                                    'field' => tep_draw_input_field('bank_accountnumber')),
+                                              array('title' => MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_CODE,
+                                                    'field' => tep_draw_input_field('bank_code')),
+                                              array('title' => MODULE_PAYMENT_IPAYMENT_ELV_TEXT_BANK_NAME,
+                                                    'field' => tep_draw_input_field('bank_name'))));
+
+      return $confirmation;
+    }
+
+    function process_button() {
+      global $order, $currency;
+
+      $zone_code = '';
+
+      if (is_numeric($order->billing['zone_id']) && ($order->billing['zone_id'] > 0)) {
+        $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_id = '" . (int)$order->billing['zone_id'] . "'");
+        if (tep_db_num_rows($zone_query)) {
+          $zone = tep_db_fetch_array($zone_query);
+
+          $zone_code = $zone['zone_code'];
+        }
+      }
+
+      $process_button_string = tep_draw_hidden_field('silent', '1') .
+                               tep_draw_hidden_field('trx_paymenttyp', 'elv') .
+                               tep_draw_hidden_field('trxuser_id', MODULE_PAYMENT_IPAYMENT_ELV_USER_ID) .
+                               tep_draw_hidden_field('trxpassword', MODULE_PAYMENT_IPAYMENT_ELV_PASSWORD) .
+                               tep_draw_hidden_field('from_ip', tep_get_ip_address()) .
+                               tep_draw_hidden_field('trx_currency', $currency) .
+                               tep_draw_hidden_field('trx_amount', $this->format_raw($order->info['total'])*100) .
+                               tep_draw_hidden_field('trx_typ', ((MODULE_PAYMENT_IPAYMENT_ELV_TRANSACTION_METHOD == 'Capture') ? 'auth' : 'preauth')) .
+                               tep_draw_hidden_field('addr_email', $order->customer['email_address']) .
+                               tep_draw_hidden_field('addr_street', $order->billing['street_address']) .
+                               tep_draw_hidden_field('addr_city', $order->billing['city']) .
+                               tep_draw_hidden_field('addr_zip', $order->billing['postcode']) .
+                               tep_draw_hidden_field('addr_country', $order->billing['country']['iso_code_2']) .
+                               tep_draw_hidden_field('addr_state', $zone_code) .
+                               tep_draw_hidden_field('addr_telefon', $order->customer['telephone']) .
+                               tep_draw_hidden_field('redirect_url', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', true)) .
+                               tep_draw_hidden_field('silent_error_url', tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', true)) .
+                               tep_draw_hidden_field('hidden_trigger_url', tep_href_link('ext/modules/payment/ipayment/callback_elv.php', '', 'SSL', false)) .
+                               tep_draw_hidden_field('client_name', 'oscommerce') .
+                               tep_draw_hidden_field('client_version', $this->signature);
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+        $process_button_string .= tep_draw_hidden_field('trx_securityhash', md5(MODULE_PAYMENT_IPAYMENT_ELV_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . MODULE_PAYMENT_IPAYMENT_ELV_PASSWORD . MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD));
+      }
+
+      return $process_button_string;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_SERVER_VARS, $order, $currency;
+
+      if ($HTTP_GET_VARS['ret_errorcode'] != '0') {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=' . tep_output_string_protected($HTTP_GET_VARS['ret_errormsg'])));
+      }
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+        $pass = true;
+
+// verify ret_param_checksum
+        if ($HTTP_GET_VARS['ret_param_checksum'] != md5(MODULE_PAYMENT_IPAYMENT_ELV_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . $HTTP_GET_VARS['ret_authcode'] . $HTTP_GET_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+// verify ret_url_checksum
+        $url= 'http' . (ENABLE_SSL == true ? 's' : '') . '://' . $HTTP_SERVER_VARS['SERVER_NAME'] . $HTTP_SERVER_VARS['REQUEST_URI'];
+        $url_without_checksum = substr($url, 0, strpos($url, '&ret_url_checksum')+1);
+        if ($HTTP_GET_VARS['ret_url_checksum'] != md5($url_without_checksum . MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+        if ($pass != true) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code));
+        }
+      }
+
+      return false;
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      $error = array('title' => MODULE_PAYMENT_IPAYMENT_ELV_ERROR_HEADING,
+                     'error' => ((isset($HTTP_GET_VARS['error'])) ? stripslashes(urldecode($HTTP_GET_VARS['error'])) : MODULE_PAYMENT_IPAYMENT_ELV_ERROR_MESSAGE));
+
+      return $error;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_IPAYMENT_ELV_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable iPayment (ELV)', 'MODULE_PAYMENT_IPAYMENT_ELV_STATUS', 'False', 'Do you want to accept iPayment (ELV) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Account Number', 'MODULE_PAYMENT_IPAYMENT_ELV_ID', '99999', 'The account number used for the iPayment service', '6', '2', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User ID', 'MODULE_PAYMENT_IPAYMENT_ELV_USER_ID', '99998', 'The user ID for the iPayment service', '6', '3', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User Password', 'MODULE_PAYMENT_IPAYMENT_ELV_PASSWORD', '0', 'The user password for the iPayment service', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_IPAYMENT_ELV_TRANSACTION_METHOD', 'Authorization', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Capture\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Hash Password', 'MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD', 'testtest', 'The secret hash password to validate transactions with', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Transaction Notification (E-Mail)', 'MODULE_PAYMENT_IPAYMENT_ELV_DEBUG_EMAIL', '', 'An e-mail address to send transaction notifications to.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_IPAYMENT_ELV_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_IPAYMENT_ELV_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_IPAYMENT_ELV_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_IPAYMENT_ELV_STATUS', 'MODULE_PAYMENT_IPAYMENT_ELV_ID', 'MODULE_PAYMENT_IPAYMENT_ELV_USER_ID', 'MODULE_PAYMENT_IPAYMENT_ELV_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_ELV_TRANSACTION_METHOD', 'MODULE_PAYMENT_IPAYMENT_ELV_SECRET_HASH_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_ELV_DEBUG_EMAIL', 'MODULE_PAYMENT_IPAYMENT_ELV_ZONE', 'MODULE_PAYMENT_IPAYMENT_ELV_ORDER_STATUS_ID', 'MODULE_PAYMENT_IPAYMENT_ELV_SORT_ORDER');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function sendDebugEmail($checksum_match = 0) {
+      global $HTTP_POST_VARS, $HTTP_GET_VARS;
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_ELV_DEBUG_EMAIL)) {
+        $email_body = 'iPayment (ELV) Transaction' . "\n\n" .
+                      'Date: ' . strftime(DATE_TIME_FORMAT) . "\n" .
+                      'Checksum Match: ';
+
+        switch ($checksum_match) {
+          case 1:
+            $email_body .= 'Valid';
+            break;
+
+          case -1:
+            $email_body .= '##### Invalid #####';
+            break;
+
+          case 0:
+          default:
+            $email_body .= 'Unknown';
+            break;
+        }
+
+        $email_body .= "\n\n" .
+                       'POST REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_POST_VARS)) {
+          foreach ($HTTP_POST_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        $email_body .= "\n" . 'GET REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_GET_VARS)) {
+          foreach ($HTTP_GET_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        tep_mail('', MODULE_PAYMENT_IPAYMENT_ELV_DEBUG_EMAIL, 'iPayment (ELV) Transaction', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/ipayment_pp.php 2.3.1.src/includes/modules/payment/ipayment_pp.php
--- 2.2rc2a.cp.src/includes/modules/payment/ipayment_pp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/ipayment_pp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,258 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class ipayment_pp {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function ipayment_pp() {
+      global $order;
+
+      $this->signature = 'ipayment|ipayment_pp|1.0|2.2';
+      $this->api_version = '2.0';
+
+      $this->code = 'ipayment_pp';
+      $this->title = MODULE_PAYMENT_IPAYMENT_PP_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_IPAYMENT_PP_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_IPAYMENT_PP_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_IPAYMENT_PP_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_IPAYMENT_PP_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_IPAYMENT_PP_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_IPAYMENT_PP_ORDER_STATUS_ID;
+      }
+
+      $this->gateway_addresses = array('212.227.34.218', '212.227.34.219', '212.227.34.220');
+
+      if (is_object($order)) $this->update_status();
+
+      $this->form_action_url = 'https://ipayment.de/merchant/' . MODULE_PAYMENT_IPAYMENT_PP_ID . '/processor/2.0/';
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_IPAYMENT_PP_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_IPAYMENT_PP_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      return false;
+    }
+
+    function process_button() {
+      global $order, $currency;
+
+      $zone_code = '';
+
+      if (is_numeric($order->billing['zone_id']) && ($order->billing['zone_id'] > 0)) {
+        $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_id = '" . (int)$order->billing['zone_id'] . "'");
+        if (tep_db_num_rows($zone_query)) {
+          $zone = tep_db_fetch_array($zone_query);
+
+          $zone_code = $zone['zone_code'];
+        }
+      }
+
+      $process_button_string = tep_draw_hidden_field('silent', '1') .
+                               tep_draw_hidden_field('trx_paymenttyp', 'pp') .
+                               tep_draw_hidden_field('trxuser_id', MODULE_PAYMENT_IPAYMENT_PP_USER_ID) .
+                               tep_draw_hidden_field('trxpassword', MODULE_PAYMENT_IPAYMENT_PP_PASSWORD) .
+                               tep_draw_hidden_field('from_ip', tep_get_ip_address()) .
+                               tep_draw_hidden_field('trx_currency', $currency) .
+                               tep_draw_hidden_field('trx_amount', $this->format_raw($order->info['total'])*100) .
+                               tep_draw_hidden_field('trx_typ', ((MODULE_PAYMENT_IPAYMENT_PP_TRANSACTION_METHOD == 'Capture') ? 'auth' : 'preauth')) .
+                               tep_draw_hidden_field('addr_email', $order->customer['email_address']) .
+                               tep_draw_hidden_field('addr_street', $order->billing['street_address']) .
+                               tep_draw_hidden_field('addr_city', $order->billing['city']) .
+                               tep_draw_hidden_field('addr_zip', $order->billing['postcode']) .
+                               tep_draw_hidden_field('addr_country', $order->billing['country']['iso_code_2']) .
+                               tep_draw_hidden_field('addr_state', $zone_code) .
+                               tep_draw_hidden_field('addr_telefon', $order->customer['telephone']) .
+                               tep_draw_hidden_field('redirect_url', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', true)) .
+                               tep_draw_hidden_field('silent_error_url', tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', true)) .
+                               tep_draw_hidden_field('hidden_trigger_url', tep_href_link('ext/modules/payment/ipayment/callback_pp.php', '', 'SSL', false)) .
+                               tep_draw_hidden_field('client_name', 'oscommerce') .
+                               tep_draw_hidden_field('client_version', $this->signature);
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+        $process_button_string .= tep_draw_hidden_field('trx_securityhash', md5(MODULE_PAYMENT_IPAYMENT_PP_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . MODULE_PAYMENT_IPAYMENT_PP_PASSWORD . MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD));
+      }
+
+      return $process_button_string;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_SERVER_VARS, $order, $currency;
+
+      if ($HTTP_GET_VARS['ret_errorcode'] != '0') {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=' . tep_output_string_protected($HTTP_GET_VARS['ret_errormsg'])));
+      }
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+        $pass = true;
+
+// verify ret_param_checksum
+        if ($HTTP_GET_VARS['ret_param_checksum'] != md5(MODULE_PAYMENT_IPAYMENT_PP_USER_ID . ($this->format_raw($order->info['total']) * 100) . $currency . $HTTP_GET_VARS['ret_authcode'] . $HTTP_GET_VARS['ret_booknr'] . MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+// verify ret_url_checksum
+        $url= 'http' . (ENABLE_SSL == true ? 's' : '') . '://' . $HTTP_SERVER_VARS['SERVER_NAME'] . $HTTP_SERVER_VARS['REQUEST_URI'];
+        $url_without_checksum = substr($url, 0, strpos($url, '&ret_url_checksum')+1);
+        if ($HTTP_GET_VARS['ret_url_checksum'] != md5($url_without_checksum . MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD)) {
+          $pass = false;
+        }
+
+        if ($pass != true) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code));
+        }
+      }
+
+      return false;
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      $error = array('title' => MODULE_PAYMENT_IPAYMENT_PP_ERROR_HEADING,
+                     'error' => ((isset($HTTP_GET_VARS['error'])) ? stripslashes(urldecode($HTTP_GET_VARS['error'])) : MODULE_PAYMENT_IPAYMENT_PP_ERROR_MESSAGE));
+
+      return $error;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_IPAYMENT_PP_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable iPayment (Prepaid)', 'MODULE_PAYMENT_IPAYMENT_PP_STATUS', 'False', 'Do you want to accept iPayment (Prepaid) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Account Number', 'MODULE_PAYMENT_IPAYMENT_PP_ID', '999997', 'The account number used for the iPayment service', '6', '2', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User ID', 'MODULE_PAYMENT_IPAYMENT_PP_USER_ID', '999997', 'The user ID for the iPayment service', '6', '3', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User Password', 'MODULE_PAYMENT_IPAYMENT_PP_PASSWORD', '999997', 'The user password for the iPayment service', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_IPAYMENT_PP_TRANSACTION_METHOD', 'Authorization', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Capture\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Hash Password', 'MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD', '', 'The secret hash password to validate transactions with', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Transaction Notification (E-Mail)', 'MODULE_PAYMENT_IPAYMENT_PP_DEBUG_EMAIL', '', 'An e-mail address to send transaction notifications to.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_IPAYMENT_PP_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_IPAYMENT_PP_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_IPAYMENT_PP_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_IPAYMENT_PP_STATUS', 'MODULE_PAYMENT_IPAYMENT_PP_ID', 'MODULE_PAYMENT_IPAYMENT_PP_USER_ID', 'MODULE_PAYMENT_IPAYMENT_PP_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_PP_TRANSACTION_METHOD', 'MODULE_PAYMENT_IPAYMENT_PP_SECRET_HASH_PASSWORD', 'MODULE_PAYMENT_IPAYMENT_PP_DEBUG_EMAIL', 'MODULE_PAYMENT_IPAYMENT_PP_ZONE', 'MODULE_PAYMENT_IPAYMENT_PP_ORDER_STATUS_ID', 'MODULE_PAYMENT_IPAYMENT_PP_SORT_ORDER');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function sendDebugEmail($checksum_match = 0) {
+      global $HTTP_POST_VARS, $HTTP_GET_VARS;
+
+      if (tep_not_null(MODULE_PAYMENT_IPAYMENT_PP_DEBUG_EMAIL)) {
+        $email_body = 'iPayment (Prepaid) Transaction' . "\n\n" .
+                      'Date: ' . strftime(DATE_TIME_FORMAT) . "\n" .
+                      'Checksum Match: ';
+
+        switch ($checksum_match) {
+          case 1:
+            $email_body .= 'Valid';
+            break;
+
+          case -1:
+            $email_body .= '##### Invalid #####';
+            break;
+
+          case 0:
+          default:
+            $email_body .= 'Unknown';
+            break;
+        }
+
+        $email_body .= "\n\n" .
+                       'POST REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_POST_VARS)) {
+          foreach ($HTTP_POST_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        $email_body .= "\n" . 'GET REQUEST:' . "\n\n";
+
+        if (!empty($HTTP_GET_VARS)) {
+          foreach ($HTTP_GET_VARS as $key => $value) {
+            $email_body .= $key . '=' . $value . "\n";
+          }
+        } else {
+          $email_body .= '(empty)' . "\n";
+        }
+
+        tep_mail('', MODULE_PAYMENT_IPAYMENT_PP_DEBUG_EMAIL, 'iPayment (Prepaid) Transaction', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+      }
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_acc.php 2.3.1.src/includes/modules/payment/moneybookers_acc.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_acc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_acc.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,109 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_acc extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersACC_ID';
+    var $_payment_method = 'ACC';
+    var $_payment_method_image = 'All_CCs_225x45.gif';
+
+// class constructor
+    function moneybookers_acc() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_acc|1.0|2.3';
+
+      $this->code = 'moneybookers_acc';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_ACC_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_ACC_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_ACC_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_ACC_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_ACC_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_ACC_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_ACC_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_ACC_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Credit Cards', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_STATUS', 'False', 'Do you want to accept Moneybookers Credit Cards payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_ACC_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ACC_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_bwi.php 2.3.1.src/includes/modules/payment/moneybookers_bwi.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_bwi.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_bwi.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,105 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_bwi extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersBWI_ID';
+    var $_payment_method = 'BWI';
+    var $_payment_method_image = '';
+
+// class constructor
+    function moneybookers_bwi() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_bwi|1.0|2.3';
+
+      $this->code = 'moneybookers_bwi';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_BWI_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_BWI_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_BWI_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_BWI_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_BWI_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_BWI_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_BWI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_BWI_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Bank Transfer', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_STATUS', 'False', 'Do you want to accept Moneybookers Bank Transfer payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_BWI_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_BWI_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_csi.php 2.3.1.src/includes/modules/payment/moneybookers_csi.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_csi.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_csi.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_csi extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersCSI_ID';
+    var $_payment_method = 'CSI';
+    var $_payment_method_image = 'cartasi.gif';
+
+// class constructor
+    function moneybookers_csi() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_csi|1.0|2.3';
+
+      $this->code = 'moneybookers_csi';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_CSI_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_CSI_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_CSI_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_CSI_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_CSI_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_CSI_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_CSI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_CSI_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers CartaSi'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers CartaSi', 'The zone for the Moneybookers CartaSi payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'IT'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers CartaSi', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_STATUS', 'False', 'Do you want to accept Moneybookers CartaSi payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_CSI_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_CSI_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_did.php 2.3.1.src/includes/modules/payment/moneybookers_did.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_did.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_did.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_did extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersDID_ID';
+    var $_payment_method = 'DID';
+    var $_payment_method_image = 'ec.gif';
+
+// class constructor
+    function moneybookers_did() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_did|1.0|2.3';
+
+      $this->code = 'moneybookers_did';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_DID_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_DID_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_DID_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_DID_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_DID_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_DID_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_DID_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_DID_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Lastschrift'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Lastschrift', 'The zone for the Moneybookers Lastschrift payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'DE'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Lastschrift', 'MODULE_PAYMENT_MONEYBOOKERS_DID_STATUS', 'False', 'Do you want to accept Moneybookers Lastschrift payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_DID_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_DID_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DID_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DID_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DID_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_DID_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_DID_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_DID_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DID_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DID_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DID_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_dnk.php 2.3.1.src/includes/modules/payment/moneybookers_dnk.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_dnk.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_dnk.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_dnk extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersDNK_ID';
+    var $_payment_method = 'DNK';
+    var $_payment_method_image = 'dankort.gif';
+
+// class constructor
+    function moneybookers_dnk() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_dnk|1.0|2.3';
+
+      $this->code = 'moneybookers_dnk';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_DNK_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_DNK_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_DNK_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_DNK_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_DNK_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_DNK_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_DNK_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_DNK_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Dankort'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Dankort', 'The zone for the Moneybookers Dankort payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'DK'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Dankort', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_STATUS', 'False', 'Do you want to accept Moneybookers Dankort payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_DNK_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_DNK_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ebt.php 2.3.1.src/includes/modules/payment/moneybookers_ebt.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ebt.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_ebt.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_ebt extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersEBT_ID';
+    var $_payment_method = 'EBT';
+    var $_payment_method_image = 'nordea.gif';
+
+// class constructor
+    function moneybookers_ebt() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_ebt|1.0|2.3';
+
+      $this->code = 'moneybookers_ebt';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_EBT_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_EBT_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_EBT_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_EBT_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_EBT_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_EBT_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_EBT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_EBT_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Nordea Solo (SE)'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Nordea Solo (SE)', 'The zone for the Moneybookers Nordea Solo (SE) payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'SE'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Nordea Solo', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_STATUS', 'False', 'Do you want to accept Moneybookers Nordea Solo payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_EBT_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_EBT_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ent.php 2.3.1.src/includes/modules/payment/moneybookers_ent.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ent.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_ent.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_ent extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersENT_ID';
+    var $_payment_method = 'ENT';
+    var $_payment_method_image = 'enets.gif';
+
+// class constructor
+    function moneybookers_ent() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_ent|1.0|2.3';
+
+      $this->code = 'moneybookers_ent';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_ENT_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_ENT_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_ENT_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_ENT_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_ENT_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_ENT_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_ENT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_ENT_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers eNETS'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers eNETS', 'The zone for the Moneybookers eNETS payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'SG'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers eNETS', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_STATUS', 'False', 'Do you want to accept Moneybookers eNETS payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_ENT_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ENT_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_gcb.php 2.3.1.src/includes/modules/payment/moneybookers_gcb.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_gcb.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_gcb.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_gcb extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersGCB_ID';
+    var $_payment_method = 'GCB';
+    var $_payment_method_image = 'cartebleue.gif';
+
+// class constructor
+    function moneybookers_gcb() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_gcb|1.0|2.3';
+
+      $this->code = 'moneybookers_gcb';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_GCB_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_GCB_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_GCB_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_GCB_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_GCB_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_GCB_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_GCB_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_GCB_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Carte Bleue'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Carte Bleue', 'The zone for the Moneybookers Carte Bleue payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'FR'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Carte Bleue', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_STATUS', 'False', 'Do you want to accept Moneybookers Carte Bleue payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_GCB_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GCB_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_gir.php 2.3.1.src/includes/modules/payment/moneybookers_gir.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_gir.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_gir.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_gir extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersGIR_ID';
+    var $_payment_method = 'GIR';
+    var $_payment_method_image = 'giropay.gif';
+
+// class constructor
+    function moneybookers_gir() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_gir|1.0|2.3';
+
+      $this->code = 'moneybookers_gir';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_GIR_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_GIR_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_GIR_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_GIR_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_GIR_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_GIR_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_GIR_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_GIR_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Giropay'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Giropay', 'The zone for the Moneybookers Giropay payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'DE'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Giropay', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_STATUS', 'False', 'Do you want to accept Moneybookers Giropay payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_GIR_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_GIR_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_idl.php 2.3.1.src/includes/modules/payment/moneybookers_idl.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_idl.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_idl.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_idl extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersIDL_ID';
+    var $_payment_method = 'IDL';
+    var $_payment_method_image = 'ideal.gif';
+
+// class constructor
+    function moneybookers_idl() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_idl|1.0|2.3';
+
+      $this->code = 'moneybookers_idl';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_IDL_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_IDL_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_IDL_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_IDL_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_IDL_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_IDL_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_IDL_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_IDL_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers iDeal'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers iDeal', 'The zone for the Moneybookers iDeal payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'NL'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers iDeal', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_STATUS', 'False', 'Do you want to accept Moneybookers iDeal payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_IDL_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_IDL_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_lsr.php 2.3.1.src/includes/modules/payment/moneybookers_lsr.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_lsr.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_lsr.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_lsr extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersLSR_ID';
+    var $_payment_method = 'LSR';
+    var $_payment_method_image = 'laser.gif';
+
+// class constructor
+    function moneybookers_lsr() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_lsr|1.0|2.3';
+
+      $this->code = 'moneybookers_lsr';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_LSR_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_LSR_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_LSR_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_LSR_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_LSR_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_LSR_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_LSR_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_LSR_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Laser'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Laser', 'The zone for the Moneybookers Laser payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'IE'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Laser', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_STATUS', 'False', 'Do you want to accept Moneybookers Laser payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_LSR_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_LSR_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_mae.php 2.3.1.src/includes/modules/payment/moneybookers_mae.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_mae.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_mae.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,126 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_mae extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersMAE_ID';
+    var $_payment_method = 'MAE';
+    var $_payment_method_image = 'maestro.gif';
+
+// class constructor
+    function moneybookers_mae() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_mae|1.0|2.3';
+
+      $this->code = 'moneybookers_mae';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_MAE_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_MAE_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_MAE_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_MAE_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_MAE_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_MAE_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_MAE_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_MAE_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Maestro'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Maestro', 'The zone for the Moneybookers Maestro payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'AT' or countries_iso_code_2 = 'ES' or countries_iso_code_2 = 'GB'");
+        while ($country = tep_db_fetch_array($country_query)) {
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Maestro', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_STATUS', 'False', 'Do you want to accept Moneybookers Maestro payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_MAE_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MAE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_msc.php 2.3.1.src/includes/modules/payment/moneybookers_msc.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_msc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_msc.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_msc extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersMSC_ID';
+    var $_payment_method = 'MSC';
+    var $_payment_method_image = '4b.gif';
+
+// class constructor
+    function moneybookers_msc() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_msc|1.0|2.3';
+
+      $this->code = 'moneybookers_msc';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_MSC_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_MSC_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_MSC_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_MSC_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_MSC_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_MSC_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_MSC_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_MSC_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers MC (Euro 6000/4B)'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers MC (Euro 6000/4B)', 'The zone for the Moneybookers MC (Euro 6000/4B) payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'ES'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Mastercard (Euro 6000/4B)', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_STATUS', 'False', 'Do you want to accept Moneybookers Mastercard (Euro 6000/4B) payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_MSC_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_MSC_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ngp.php 2.3.1.src/includes/modules/payment/moneybookers_ngp.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_ngp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_ngp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,126 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_ngp extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersNGP_ID';
+    var $_payment_method = 'NGP';
+    var $_payment_method_image = '';
+
+// class constructor
+    function moneybookers_ngp() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_ngp|1.0|2.3';
+
+      $this->code = 'moneybookers_ngp';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_NGP_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_NGP_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_NGP_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_NGP_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_NGP_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_NGP_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_NGP_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_NGP_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers OnlineBank Transfer'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers OnlineBank Transfer', 'The zone for the Moneybookers OnlineBank Transfer payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'DE' or countries_iso_code_2 = 'GB'");
+        while ($country = tep_db_fetch_array($country_query)) {
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers OnlineBank Transfer', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_STATUS', 'False', 'Do you want to accept Moneybookers OnlineBank Transfer payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_NGP_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NGP_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_npy.php 2.3.1.src/includes/modules/payment/moneybookers_npy.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_npy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_npy.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_npy extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersNPY_ID';
+    var $_payment_method = 'NPY';
+    var $_payment_method_image = 'eps.gif';
+
+// class constructor
+    function moneybookers_npy() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_npy|1.0|2.3';
+
+      $this->code = 'moneybookers_npy';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_NPY_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_NPY_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_NPY_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_NPY_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_NPY_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_NPY_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_NPY_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_NPY_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers EPS'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers EPS', 'The zone for the Moneybookers EPS payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'AT'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers EPS', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_STATUS', 'False', 'Do you want to accept Moneybookers EPS payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_NPY_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_NPY_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers.php 2.3.1.src/includes/modules/payment/moneybookers.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,687 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_Moneybookers_ID';
+    var $_payment_method = '';
+    var $_payment_method_image = 'by_ewallet_90x45.gif';
+
+// class constructor
+    function moneybookers() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers|1.0|2.3';
+
+      $this->code = 'moneybookers';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function _deletePreparing() {
+      if (tep_session_is_registered($this->_mbcartID)) {
+        $order_id = substr($GLOBALS[$this->_mbcartID], strpos($GLOBALS[$this->_mbcartID], '-')+1);
+
+        $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
+
+        if (tep_db_num_rows($check_query) < 1) {
+          tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
+
+          tep_session_unregister($this->_mbcartID);
+        }
+      }
+    }
+
+    function selection() {
+      $this->_deletePreparing();
+
+      return array('id' => $this->code,
+                   'module' => $this->public_title . (!empty($this->_payment_method_image) ? '<br />' . tep_image('ext/modules/payment/moneybookers/logos/' . $this->_payment_method_image, $this->public_title) : ''));
+    }
+
+    function pre_confirmation_check() {
+      global $cartID, $cart;
+
+      if (empty($cart->cartID)) {
+        $cartID = $cart->cartID = $cart->generate_cart_id();
+      }
+
+      if (!tep_session_is_registered('cartID')) {
+        tep_session_register('cartID');
+      }
+    }
+
+    function _prepareOrder() {
+      global $cartID, $customer_id, $languages_id, $order, $order_total_modules, $currency;
+
+      $insert_order = false;
+
+      if (tep_session_is_registered($this->_mbcartID)) {
+        $order_id = substr($GLOBALS[$this->_mbcartID], strpos($GLOBALS[$this->_mbcartID], '-')+1);
+
+        $curr_check = tep_db_query("select currency from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
+        $curr = tep_db_fetch_array($curr_check);
+
+        if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($GLOBALS[$this->_mbcartID], 0, strlen($cartID))) ) {
+          $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
+
+          if (tep_db_num_rows($check_query) < 1) {
+            tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
+          }
+
+          $insert_order = true;
+        }
+      } else {
+        $insert_order = true;
+      }
+
+      if ($insert_order == true) {
+        $order_totals = array();
+        if (is_array($order_total_modules->modules)) {
+          reset($order_total_modules->modules);
+          while (list(, $value) = each($order_total_modules->modules)) {
+            $class = substr($value, 0, strrpos($value, '.'));
+            if ($GLOBALS[$class]->enabled) {
+              for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {
+                if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {
+                  $order_totals[] = array('code' => $GLOBALS[$class]->code,
+                                          'title' => $GLOBALS[$class]->output[$i]['title'],
+                                          'text' => $GLOBALS[$class]->output[$i]['text'],
+                                          'value' => $GLOBALS[$class]->output[$i]['value'],
+                                          'sort_order' => $GLOBALS[$class]->sort_order);
+                }
+              }
+            }
+          }
+        }
+
+        $sql_data_array = array('customers_id' => $customer_id,
+                                'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
+                                'customers_company' => $order->customer['company'],
+                                'customers_street_address' => $order->customer['street_address'],
+                                'customers_suburb' => $order->customer['suburb'],
+                                'customers_city' => $order->customer['city'],
+                                'customers_postcode' => $order->customer['postcode'],
+                                'customers_state' => $order->customer['state'],
+                                'customers_country' => $order->customer['country']['title'],
+                                'customers_telephone' => $order->customer['telephone'],
+                                'customers_email_address' => $order->customer['email_address'],
+                                'customers_address_format_id' => $order->customer['format_id'],
+                                'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
+                                'delivery_company' => $order->delivery['company'],
+                                'delivery_street_address' => $order->delivery['street_address'],
+                                'delivery_suburb' => $order->delivery['suburb'],
+                                'delivery_city' => $order->delivery['city'],
+                                'delivery_postcode' => $order->delivery['postcode'],
+                                'delivery_state' => $order->delivery['state'],
+                                'delivery_country' => $order->delivery['country']['title'],
+                                'delivery_address_format_id' => $order->delivery['format_id'],
+                                'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
+                                'billing_company' => $order->billing['company'],
+                                'billing_street_address' => $order->billing['street_address'],
+                                'billing_suburb' => $order->billing['suburb'],
+                                'billing_city' => $order->billing['city'],
+                                'billing_postcode' => $order->billing['postcode'],
+                                'billing_state' => $order->billing['state'],
+                                'billing_country' => $order->billing['country']['title'],
+                                'billing_address_format_id' => $order->billing['format_id'],
+                                'payment_method' => $order->info['payment_method'],
+                                'cc_type' => $order->info['cc_type'],
+                                'cc_owner' => $order->info['cc_owner'],
+                                'cc_number' => $order->info['cc_number'],
+                                'cc_expires' => $order->info['cc_expires'],
+                                'date_purchased' => 'now()',
+                                'orders_status' => $order->info['order_status'],
+                                'currency' => $order->info['currency'],
+                                'currency_value' => $order->info['currency_value']);
+
+        tep_db_perform(TABLE_ORDERS, $sql_data_array);
+
+        $insert_id = tep_db_insert_id();
+
+        for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
+          $sql_data_array = array('orders_id' => $insert_id,
+                                  'title' => $order_totals[$i]['title'],
+                                  'text' => $order_totals[$i]['text'],
+                                  'value' => $order_totals[$i]['value'],
+                                  'class' => $order_totals[$i]['code'],
+                                  'sort_order' => $order_totals[$i]['sort_order']);
+
+          tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
+        }
+
+        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+          $sql_data_array = array('orders_id' => $insert_id,
+                                  'products_id' => tep_get_prid($order->products[$i]['id']),
+                                  'products_model' => $order->products[$i]['model'],
+                                  'products_name' => $order->products[$i]['name'],
+                                  'products_price' => $order->products[$i]['price'],
+                                  'final_price' => $order->products[$i]['final_price'],
+                                  'products_tax' => $order->products[$i]['tax'],
+                                  'products_quantity' => $order->products[$i]['qty']);
+
+          tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
+
+          $order_products_id = tep_db_insert_id();
+
+          $attributes_exist = '0';
+          if (isset($order->products[$i]['attributes'])) {
+            $attributes_exist = '1';
+            for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
+              if (DOWNLOAD_ENABLED == 'true') {
+                $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                     from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                     left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                     on pa.products_attributes_id=pad.products_attributes_id
+                                     where pa.products_id = '" . $order->products[$i]['id'] . "'
+                                     and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
+                                     and pa.options_id = popt.products_options_id
+                                     and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
+                                     and pa.options_values_id = poval.products_options_values_id
+                                     and popt.language_id = '" . $languages_id . "'
+                                     and poval.language_id = '" . $languages_id . "'";
+                $attributes = tep_db_query($attributes_query);
+              } else {
+                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
+              }
+              $attributes_values = tep_db_fetch_array($attributes);
+
+              $sql_data_array = array('orders_id' => $insert_id,
+                                      'orders_products_id' => $order_products_id,
+                                      'products_options' => $attributes_values['products_options_name'],
+                                      'products_options_values' => $attributes_values['products_options_values_name'],
+                                      'options_values_price' => $attributes_values['options_values_price'],
+                                      'price_prefix' => $attributes_values['price_prefix']);
+
+              tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
+
+              if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
+                $sql_data_array = array('orders_id' => $insert_id,
+                                        'orders_products_id' => $order_products_id,
+                                        'orders_products_filename' => $attributes_values['products_attributes_filename'],
+                                        'download_maxdays' => $attributes_values['products_attributes_maxdays'],
+                                        'download_count' => $attributes_values['products_attributes_maxcount']);
+
+                tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
+              }
+            }
+          }
+        }
+
+        $GLOBALS[$this->_mbcartID] = $cartID . '-' . $insert_id;
+        tep_session_register($this->_mbcartID);
+      }
+    }
+
+    function confirmation() {
+      global $customer_id, $order, $currency;
+
+      if (tep_session_is_registered('cartID')) {
+        $this->_prepareOrder();
+
+        $parameters = array('pay_to_email' => MODULE_PAYMENT_MONEYBOOKERS_PAY_TO,
+                            'recipient_description' => STORE_NAME,
+                            'transaction_id' => substr($GLOBALS[$this->_mbcartID], strpos($GLOBALS[$this->_mbcartID], '-')+1),
+                            'return_url' => tep_href_link(FILENAME_CHECKOUT_PROCESS, 'osig=' . md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD . $GLOBALS[$this->_mbcartID]), 'SSL'),
+                            'return_url_text' => MODULE_PAYMENT_MONEYBOOKERS_RETURN_TEXT,
+                            'return_url_target' => 1,
+                            'cancel_url' => tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'),
+                            'cancel_url_target' => 1,
+                            'status_url' => tep_href_link('ext/modules/payment/moneybookers/callback.php', '', 'SSL', false, false),
+                            'language' => MODULE_PAYMENT_MONEYBOOKERS_LANGUAGE_CODE,
+                            'prepare_only' => '1',
+                            'pay_from_email' => $order->customer['email_address'],
+                            'first_name' => $order->billing['firstname'],
+                            'last_name' => $order->billing['lastname'],
+                            'address' => $order->billing['street_address'],
+                            'phone_number' => $order->customer['telephone'],
+                            'postal_code' => $order->billing['postcode'],
+                            'city' => $order->billing['city'],
+                            'state' => $order->billing['state'],
+                            'country' => $order->billing['country']['iso_code_3'],
+                            'amount' => $this->format_raw($order->info['total']),
+                            'currency' => $currency,
+                            'hide_login' => '1',
+                            'merchant_fields' => 'osc_custid,referring_platform',
+                            'osc_custid' => $customer_id,
+                            'referring_platform' => 'osCommerce|' . $this->signature);
+
+        if (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'False') {
+          $parameters['logo_url'] = MODULE_PAYMENT_MONEYBOOKERS_STORE_IMAGE;
+        }
+
+        if (tep_not_null(MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL)) {
+          $parameters['status_url2'] = MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL;
+        }
+
+        if (tep_not_null($this->_payment_method)) {
+          $parameters['payment_methods'] = $this->_payment_method;
+        }
+
+        $params_string = '';
+
+        reset($parameters);
+        while (list($key, $value) = each($parameters)) {
+          $params_string .= $key . '=' . urlencode($value) . '&';
+        }
+
+        $params_string = substr($params_string, 0, -1);
+
+        $response = $this->sendTransactionToGateway('https://www.moneybookers.com/app/payment.pl', $params_string, true);
+
+        $m = array();
+
+        preg_match('/^Set-Cookie: SESSION_ID=(.*?);/m', $response, $m);
+
+        if ( !empty($m) ) {
+          $this->_sid = $m[1];
+        }
+      }
+    }
+
+    function process_button() {
+      if ( isset($this->_sid) ) {
+        return tep_draw_hidden_field('sid', $this->_sid);
+      }
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $customer_id, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart;
+      global $$payment;
+
+      $pass = false;
+
+      if (isset($HTTP_GET_VARS['transaction_id']) && isset($HTTP_GET_VARS['msid'])) {
+        if ($HTTP_GET_VARS['transaction_id'] == substr($GLOBALS[$this->_mbcartID], strpos($GLOBALS[$this->_mbcartID], '-')+1)) {
+          if ($HTTP_GET_VARS['msid'] == strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_MERCHANT_ID . $HTTP_GET_VARS['transaction_id'] . strtoupper(md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD))))) {
+            $pass = true;
+          }
+        }
+      } elseif (isset($HTTP_GET_VARS['osig']) && ($HTTP_GET_VARS['osig'] == md5(MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD . $GLOBALS[$this->_mbcartID]))) {
+        $pass = true;
+      }
+
+      if ($pass == true) {
+        $order_id = substr($GLOBALS[$this->_mbcartID], strpos($GLOBALS[$this->_mbcartID], '-')+1);
+
+        $check_query = tep_db_query("select orders_status from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
+        if (tep_db_num_rows($check_query)) {
+          $check = tep_db_fetch_array($check_query);
+
+          if ($check['orders_status'] == MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID) {
+            $sql_data_array = array('orders_id' => $order_id,
+                                    'orders_status_id' => MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID,
+                                    'date_added' => 'now()',
+                                    'customer_notified' => '0',
+                                    'comments' => '');
+
+            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+          }
+        }
+
+        tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . (MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID) . "', last_modified = now() where orders_id = '" . (int)$order_id . "'");
+
+        $sql_data_array = array('orders_id' => $order_id,
+                                'orders_status_id' => (MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID),
+                                'date_added' => 'now()',
+                                'customer_notified' => (SEND_EMAILS == 'true') ? '1' : '0',
+                                'comments' => $order->info['comments']);
+
+        tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+
+// initialized for the email confirmation
+        $products_ordered = '';
+        $subtotal = 0;
+        $total_tax = 0;
+
+        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+// Stock Update - Joao Correia
+          if (STOCK_LIMITED == 'true') {
+            if (DOWNLOAD_ENABLED == 'true') {
+              $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
+                                  FROM " . TABLE_PRODUCTS . " p
+                                  LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                  ON p.products_id=pa.products_id
+                                  LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                  ON pa.products_attributes_id=pad.products_attributes_id
+                                  WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
+// Will work with only one option for downloadable products
+// otherwise, we have to build the query dynamically with a loop
+              $products_attributes = $order->products[$i]['attributes'];
+              if (is_array($products_attributes)) {
+                $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
+              }
+              $stock_query = tep_db_query($stock_query_raw);
+            } else {
+              $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+            }
+            if (tep_db_num_rows($stock_query) > 0) {
+              $stock_values = tep_db_fetch_array($stock_query);
+// do not decrement quantities if products_attributes_filename exists
+              if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
+                $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
+              } else {
+                $stock_left = $stock_values['products_quantity'];
+              }
+              tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+              if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
+                tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+              }
+            }
+          }
+
+// Update products_ordered (for bestsellers list)
+          tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+
+//------insert customer choosen option to order--------
+          $attributes_exist = '0';
+          $products_ordered_attributes = '';
+          if (isset($order->products[$i]['attributes'])) {
+            $attributes_exist = '1';
+            for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
+              if (DOWNLOAD_ENABLED == 'true') {
+                $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                     from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                     left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                     on pa.products_attributes_id=pad.products_attributes_id
+                                     where pa.products_id = '" . $order->products[$i]['id'] . "'
+                                     and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
+                                     and pa.options_id = popt.products_options_id
+                                     and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
+                                     and pa.options_values_id = poval.products_options_values_id
+                                     and popt.language_id = '" . $languages_id . "'
+                                     and poval.language_id = '" . $languages_id . "'";
+                $attributes = tep_db_query($attributes_query);
+              } else {
+                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
+              }
+              $attributes_values = tep_db_fetch_array($attributes);
+
+              $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
+            }
+          }
+//------insert customer choosen option eof ----
+          $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
+          $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
+          $total_cost += $total_products_price;
+
+          $products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";
+        }
+
+// lets start with the email confirmation
+        $email_order = STORE_NAME . "\n" .
+                       EMAIL_SEPARATOR . "\n" .
+                       EMAIL_TEXT_ORDER_NUMBER . ' ' . $order_id . "\n" .
+                       EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $order_id, 'SSL', false) . "\n" .
+                       EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
+        if ($order->info['comments']) {
+          $email_order .= tep_db_output($order->info['comments']) . "\n\n";
+        }
+        $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
+                        EMAIL_SEPARATOR . "\n" .
+                        $products_ordered .
+                        EMAIL_SEPARATOR . "\n";
+
+        for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
+          $email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
+        }
+
+        if ($order->content_type != 'virtual') {
+          $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
+                          EMAIL_SEPARATOR . "\n" .
+                          tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
+        }
+
+        $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
+                        EMAIL_SEPARATOR . "\n" .
+                        tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
+
+        if (is_object($$payment)) {
+          $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
+                          EMAIL_SEPARATOR . "\n";
+          $payment_class = $$payment;
+          $email_order .= $payment_class->title . "\n\n";
+          if ($payment_class->email_footer) {
+            $email_order .= $payment_class->email_footer . "\n\n";
+          }
+        }
+
+        tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+
+// send emails to other people
+        if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
+          tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+        }
+
+// load the after_process function from the payment modules
+        $this->after_process();
+
+        $cart->reset(true);
+
+// unregister session variables used during checkout
+        tep_session_unregister('sendto');
+        tep_session_unregister('billto');
+        tep_session_unregister('shipping');
+        tep_session_unregister('payment');
+        tep_session_unregister('comments');
+
+        tep_session_unregister($this->_mbcartID);
+
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
+      } else {
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART));
+      }
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function output_error() {
+      return false;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      global $HTTP_GET_VARS;
+
+      if ( !isset($HTTP_GET_VARS['active']) || ($HTTP_GET_VARS['active'] != 'true') ) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'selected_box=modules&set=payment'));
+      }
+
+// Preparing order status
+      $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Preparing [Moneybookers]' limit 1");
+
+      if (tep_db_num_rows($check_query) < 1) {
+        $status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
+        $status = tep_db_fetch_array($status_query);
+
+        $preparing_status_id = $status['status_id']+1;
+
+        $languages = tep_get_languages();
+
+        foreach ($languages as $lang) {
+          tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $preparing_status_id . "', '" . $lang['id'] . "', 'Preparing [Moneybookers]')");
+        }
+
+        $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+        if (tep_db_num_rows($flags_query) == 1) {
+          tep_db_query("update " . TABLE_ORDERS_STATUS . " set public_flag = 0 and downloads_flag = 0 where orders_status_id = '" . $preparing_status_id . "'");
+        }
+      } else {
+        $check = tep_db_fetch_array($check_query);
+
+        $preparing_status_id = $check['orders_status_id'];
+      }
+
+// Transactions order status
+      $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Transaction [Moneybookers]' limit 1");
+
+      if (tep_db_num_rows($check_query) < 1) {
+        $status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
+        $status = tep_db_fetch_array($status_query);
+
+        $transactions_status_id = $status['status_id']+1;
+
+        $languages = tep_get_languages();
+
+        foreach ($languages as $lang) {
+          tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $transactions_status_id . "', '" . $lang['id'] . "', 'Transaction [Moneybookers]')");
+        }
+
+        $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+        if (tep_db_num_rows($flags_query) == 1) {
+          tep_db_query("update " . TABLE_ORDERS_STATUS . " set public_flag = 0 and downloads_flag = 0 where orders_status_id = '" . $transactions_status_id . "'");
+        }
+      } else {
+        $check = tep_db_fetch_array($check_query);
+
+        $transactions_status_id = $check['orders_status_id'];
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers eWallet', 'MODULE_PAYMENT_MONEYBOOKERS_STATUS', 'False', 'Do you want to accept Moneybookers eWallet payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('E-Mail Address', 'MODULE_PAYMENT_MONEYBOOKERS_PAY_TO', '" . (isset($HTTP_GET_VARS['email']) ? $HTTP_GET_VARS['email'] : '') . "', 'The Moneybookers seller e-mail address to accept payments for', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Merchant ID', 'MODULE_PAYMENT_MONEYBOOKERS_MERCHANT_ID', '" . (isset($HTTP_GET_VARS['custid']) ? $HTTP_GET_VARS['custid'] : '') . "', 'The Moneybookers merchant ID assigned to the seller e-mail address', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Word', 'MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD', '', 'The secret word to verify transactions with', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Store Logo Image', 'MODULE_PAYMENT_MONEYBOOKERS_STORE_IMAGE', '" . tep_catalog_href_link('images/store_logo.png', '', 'SSL') . "', 'The URL of the store logo image to display on the gateway transaction page. This must be served through HTTPS otherwise it will not be shown.', '6', '4', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('iFrame Presentation', 'MODULE_PAYMENT_MONEYBOOKERS_IFRAME', 'True', 'Show the Moneybookers payment pages through an iFrame?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail Address', 'MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL', '', 'All parameters of an invalid transaction will be sent to this email address.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID', '" . $preparing_status_id . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID', '" . $transactions_status_id . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_MONEYBOOKERS_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_PAY_TO', 'MODULE_PAYMENT_MONEYBOOKERS_MERCHANT_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SECRET_WORD', 'MODULE_PAYMENT_MONEYBOOKERS_STORE_IMAGE', 'MODULE_PAYMENT_MONEYBOOKERS_IFRAME', 'MODULE_PAYMENT_MONEYBOOKERS_DEBUG_EMAIL', 'MODULE_PAYMENT_MONEYBOOKERS_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SORT_ORDER', 'MODULE_PAYMENT_MONEYBOOKERS_CURL');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function sendTransactionToGateway($url, $parameters, $with_headers = false) {
+      $server = parse_url($url);
+
+      if (!isset($server['port'])) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (!isset($server['path'])) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, ($with_headers == true) ? 1 : 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_MONEYBOOKERS_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k', $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_pli.php 2.3.1.src/includes/modules/payment/moneybookers_pli.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_pli.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_pli.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_pli extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersPLI_ID';
+    var $_payment_method = 'PLI';
+    var $_payment_method_image = 'poli.gif';
+
+// class constructor
+    function moneybookers_pli() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_pli|1.0|2.3';
+
+      $this->code = 'moneybookers_pli';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_PLI_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_PLI_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_PLI_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_PLI_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_PLI_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_PLI_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_PLI_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_PLI_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers POLi'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers POLi', 'The zone for the Moneybookers POLi payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'AU'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers POLi', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_STATUS', 'False', 'Do you want to accept Moneybookers POLi payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_PLI_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PLI_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_psp.php 2.3.1.src/includes/modules/payment/moneybookers_psp.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_psp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_psp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_psp extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersPSP_ID';
+    var $_payment_method = 'PSP';
+    var $_payment_method_image = 'postepay.gif';
+
+// class constructor
+    function moneybookers_psp() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_psp|1.0|2.3';
+
+      $this->code = 'moneybookers_psp';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_PSP_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_PSP_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_PSP_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_PSP_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_PSP_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_PSP_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_PSP_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_PSP_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Postepay'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Postepay', 'The zone for the Moneybookers Postepay payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'IT'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Postepay', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_STATUS', 'False', 'Do you want to accept Moneybookers Postepay payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_PSP_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PSP_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_pwy.php 2.3.1.src/includes/modules/payment/moneybookers_pwy.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_pwy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_pwy.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_pwy extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersPWY_ID';
+    var $_payment_method = 'PWY';
+    var $_payment_method_image = 'p24.gif';
+
+// class constructor
+    function moneybookers_pwy() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_pwy|1.0|2.3';
+
+      $this->code = 'moneybookers_pwy';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_PWY_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_PWY_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_PWY_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_PWY_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_PWY_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_PWY_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_PWY_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_PWY_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Przelewy'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Przelewy', 'The zone for the Moneybookers Przelewy payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'PL'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Przelewy', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_STATUS', 'False', 'Do you want to accept Moneybookers Przelewy payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_PWY_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_PWY_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_sft.php 2.3.1.src/includes/modules/payment/moneybookers_sft.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_sft.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_sft.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_sft extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersSFT_ID';
+    var $_payment_method = 'SFT';
+    var $_payment_method_image = 'sofort.gif';
+
+// class constructor
+    function moneybookers_sft() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_sft|1.0|2.3';
+
+      $this->code = 'moneybookers_sft';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_SFT_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_SFT_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_SFT_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_SFT_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_SFT_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_SFT_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_SFT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_SFT_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Sofortüberweisung'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Sofortüberweisung', 'The zone for the Moneybookers Sofortüberweisung payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'DE'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Sofortüberweisung', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_STATUS', 'False', 'Do you want to accept Moneybookers Sofortüberweisung payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_SFT_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SFT_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_slo.php 2.3.1.src/includes/modules/payment/moneybookers_slo.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_slo.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_slo.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_slo extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersSLO_ID';
+    var $_payment_method = 'SLO';
+    var $_payment_method_image = 'solo.gif';
+
+// class constructor
+    function moneybookers_slo() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_slo|1.0|2.3';
+
+      $this->code = 'moneybookers_slo';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_SLO_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_SLO_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_SLO_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_SLO_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_SLO_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_SLO_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_SLO_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_SLO_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Solo'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Solo', 'The zone for the Moneybookers Solo payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'GB'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Solo', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_STATUS', 'False', 'Do you want to accept Moneybookers Solo payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_SLO_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SLO_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_so2.php 2.3.1.src/includes/modules/payment/moneybookers_so2.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_so2.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_so2.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_so2 extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersSO2_ID';
+    var $_payment_method = 'SO2';
+    var $_payment_method_image = 'nordea.gif';
+
+// class constructor
+    function moneybookers_so2() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_so2|1.0|2.3';
+
+      $this->code = 'moneybookers_so2';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_SO2_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_SO2_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_SO2_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_SO2_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_SO2_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_SO2_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_SO2_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_SO2_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Nordea Solo (FI)'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Nordea Solo (FI)', 'The zone for the Moneybookers Nordea Solo (FI) payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'FI'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Nordea Solo (FI)', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_STATUS', 'False', 'Do you want to accept Moneybookers Nordea Solo (FI) payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_SO2_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_SO2_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneybookers_vsa.php 2.3.1.src/includes/modules/payment/moneybookers_vsa.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneybookers_vsa.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneybookers_vsa.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,128 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  if (!class_exists('moneybookers')) {
+    include(DIR_FS_CATALOG . 'includes/modules/payment/moneybookers.php');
+  }
+
+  class moneybookers_vsa extends moneybookers {
+    var $code, $title, $description, $enabled;
+
+    var $_sid; // Moneybookers transaction session ID
+    var $_mbcartID = 'cart_MoneybookersVSA_ID';
+    var $_payment_method = 'VSA';
+    var $_payment_method_image = 'euro6000.gif';
+
+// class constructor
+    function moneybookers_vsa() {
+      global $order;
+
+      $this->signature = 'moneybookers|moneybookers_vsa|1.0|2.3';
+
+      $this->code = 'moneybookers_vsa';
+      $this->title = MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_MONEYBOOKERS_VSA_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_MONEYBOOKERS_VSA_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_MONEYBOOKERS_VSA_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_MONEYBOOKERS_VSA_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_MONEYBOOKERS_VSA_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_MONEYBOOKERS_IFRAME') && (MODULE_PAYMENT_MONEYBOOKERS_IFRAME == 'True')) {
+        $this->form_action_url = tep_href_link('ext/modules/payment/moneybookers/checkout.php', '', 'SSL');
+      } else {
+        $this->form_action_url = 'https://www.moneybookers.com/app/payment.pl';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        $this->enabled = false;
+      } elseif ( ($this->enabled == true) && ((int)MODULE_PAYMENT_MONEYBOOKERS_VSA_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_MONEYBOOKERS_VSA_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function confirmation() {
+      global $language;
+
+      include(DIR_FS_CATALOG . 'includes/languages/' . $language . '/modules/payment/moneybookers.php');
+
+      parent::confirmation();
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_MONEYBOOKERS_VSA_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      if (!defined('MODULE_PAYMENT_MONEYBOOKERS_STATUS')) {
+        tep_redirect(tep_href_link('ext/modules/payment/moneybookers/activation.php', 'action=coreRequired'));
+      }
+
+      $zone_id = 0;
+
+      $zone_query = tep_db_query("select geo_zone_id from " . TABLE_GEO_ZONES . " where geo_zone_name = 'Moneybookers Visa (Euro 6000)'");
+      if (tep_db_num_rows($zone_query)) {
+        $zone = tep_db_fetch_array($zone_query);
+
+        $zone_id = $zone['geo_zone_id'];
+      } else {
+        tep_db_query("insert into " . TABLE_GEO_ZONES . " values (null, 'Moneybookers Visa (Euro 6000)', 'The zone for the Moneybookers Visa (Euro 6000) payment module', null, now())");
+        $zone_id = tep_db_insert_id();
+
+        $country_query = tep_db_query("select countries_id from " . TABLE_COUNTRIES . " where countries_iso_code_2 = 'ES'");
+        if (tep_db_num_rows($country_query)) {
+          $country = tep_db_fetch_array($country_query);
+
+          tep_db_query("insert into " . TABLE_ZONES_TO_GEO_ZONES . " values (null, '" . (int)$country['countries_id'] . "', 0, '" . (int)$zone_id . "', null, now())");
+        }
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Moneybookers Visa (Euro 6000)', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_STATUS', 'False', 'Do you want to accept Moneybookers Visa (Euro 6000) payments?', '6', '3', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_ZONE', '" . (int)$zone_id . "', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_PREPARE_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_PREPARE_ORDER_STATUS_ID . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Transactions Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_TRANSACTIONS_ORDER_STATUS_ID', '" . MODULE_PAYMENT_MONEYBOOKERS_TRANSACTIONS_ORDER_STATUS_ID . "', 'Set the status of callback transactions to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_MONEYBOOKERS_VSA_STATUS', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_ZONE', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_ORDER_STATUS_ID', 'MODULE_PAYMENT_MONEYBOOKERS_VSA_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/moneyorder.php 2.3.1.src/includes/modules/payment/moneyorder.php
--- 2.2rc2a.cp.src/includes/modules/payment/moneyorder.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/moneyorder.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: moneyorder.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/nochex.php 2.3.1.src/includes/modules/payment/nochex.php
--- 2.2rc2a.cp.src/includes/modules/payment/nochex.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/nochex.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: nochex.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_direct.php 2.3.1.src/includes/modules/payment/paypal_direct.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_direct.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,284 +0,0 @@
-<?php
-/*
-  $Id: paypal_direct.php 1803 2008-01-11 18:16:37Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class paypal_direct {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function paypal_direct() {
-      global $order;
-
-      $this->signature = 'paypal|paypal_direct|1.0|2.2';
-
-      $this->code = 'paypal_direct';
-      $this->title = MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_TITLE;
-      $this->public_title = MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_PUBLIC_TITLE;
-      $this->description = MODULE_PAYMENT_PAYPAL_DIRECT_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_PAYPAL_DIRECT_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_PAYPAL_DIRECT_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_PAYPAL_DIRECT_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_PAYPAL_DIRECT_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-
-      $this->cc_types = array('VISA' => 'Visa',
-                              'MASTERCARD' => 'MasterCard',
-                              'DISCOVER' => 'Discover Card',
-                              'AMEX' => 'American Express',
-                              'SWITCH' => 'Maestro',
-                              'SOLO' => 'Solo');
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_DIRECT_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_DIRECT_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      return array('id' => $this->code,
-                   'module' => $this->public_title);
-    }
-
-    function pre_confirmation_check() {
-      return false;
-    }
-
-    function confirmation() {
-      global $order;
-
-      $types_array = array();
-      while (list($key, $value) = each($this->cc_types)) {
-        $types_array[] = array('id' => $key,
-                               'text' => $value);
-      }
-
-      $today = getdate();
-
-      $months_array = array();
-      for ($i=1; $i<13; $i++) {
-        $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
-      }
-
-      $year_valid_from_array = array();
-      for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
-        $year_valid_from_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
-      }
-
-      $year_expires_array = array();
-      for ($i=$today['year']; $i < $today['year']+10; $i++) {
-        $year_expires_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
-      }
-
-      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_OWNER,
-                                                    'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_TYPE,
-                                                    'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_NUMBER,
-                                                    'field' => tep_draw_input_field('cc_number_nh-dns')),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM,
-                                                    'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_DIRECT_CARD_VALID_FROM_INFO),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_EXPIRES,
-                                                    'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_CVC,
-                                                    'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER,
-                                                    'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_DIRECT_CARD_ISSUE_NUMBER_INFO)));
-
-      return $confirmation;
-    }
-
-    function process_button() {
-      return false;
-    }
-
-    function before_process() {
-      global $HTTP_POST_VARS, $order, $sendto;
-
-      if (isset($HTTP_POST_VARS['cc_owner']) && !empty($HTTP_POST_VARS['cc_owner']) && isset($HTTP_POST_VARS['cc_type']) && isset($this->cc_types[$HTTP_POST_VARS['cc_type']]) && isset($HTTP_POST_VARS['cc_number_nh-dns']) && !empty($HTTP_POST_VARS['cc_number_nh-dns'])) {
-        if (MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_SERVER == 'Live') {
-          $api_url = 'https://api-3t.paypal.com/nvp';
-        } else {
-          $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
-        }
-
-        $params = array('USER' => MODULE_PAYMENT_PAYPAL_DIRECT_API_USERNAME,
-                        'PWD' => MODULE_PAYMENT_PAYPAL_DIRECT_API_PASSWORD,
-                        'VERSION' => '3.2',
-                        'SIGNATURE' => MODULE_PAYMENT_PAYPAL_DIRECT_API_SIGNATURE,
-                        'METHOD' => 'DoDirectPayment',
-                        'PAYMENTACTION' => ((MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_METHOD == 'Sale') ? 'Sale' : 'Authorization'),
-                        'IPADDRESS' => tep_get_ip_address(),
-                        'AMT' => $this->format_raw($order->info['total']),
-                        'CREDITCARDTYPE' => $HTTP_POST_VARS['cc_type'],
-                        'ACCT' => $HTTP_POST_VARS['cc_number_nh-dns'],
-                        'STARTDATE' => $HTTP_POST_VARS['cc_starts_month'] . $HTTP_POST_VARS['cc_starts_year'],
-                        'EXPDATE' => $HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'],
-                        'CVV2' => $HTTP_POST_VARS['cc_cvc_nh-dns'],
-                        'FIRSTNAME' => substr($HTTP_POST_VARS['cc_owner'], 0, strpos($HTTP_POST_VARS['cc_owner'], ' ')),
-                        'LASTNAME' => substr($HTTP_POST_VARS['cc_owner'], strpos($HTTP_POST_VARS['cc_owner'], ' ')+1),
-                        'STREET' => $order->billing['street_address'],
-                        'CITY' => $order->billing['city'],
-                        'STATE' => tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']),
-                        'COUNTRYCODE' => $order->billing['country']['iso_code_2'],
-                        'ZIP' => $order->billing['postcode'],
-                        'EMAIL' => $order->customer['email_address'],
-                        'PHONENUM' => $order->customer['telephone'],
-                        'CURRENCYCODE' => $order->info['currency'],
-                        'BUTTONSOURCE' => 'osCommerce22_Default_DP');
-
-        if ( ($HTTP_POST_VARS['cc_type'] == 'SWITCH') || ($HTTP_POST_VARS['cc_type'] == 'SOLO') ) {
-          $params['ISSUENUMBER'] = $HTTP_POST_VARS['cc_issue_nh-dns'];
-        }
-
-        if (is_numeric($sendto) && ($sendto > 0)) {
-          $params['SHIPTONAME'] = $order->delivery['firstname'] . ' ' . $order->delivery['lastname'];
-          $params['SHIPTOSTREET'] = $order->delivery['street_address'];
-          $params['SHIPTOCITY'] = $order->delivery['city'];
-          $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
-          $params['SHIPTOCOUNTRYCODE'] = $order->delivery['country']['iso_code_2'];
-          $params['SHIPTOZIP'] = $order->delivery['postcode'];
-        }
-
-        $post_string = '';
-
-        foreach ($params as $key => $value) {
-          $post_string .= $key . '=' . urlencode(trim($value)) . '&';
-        }
-
-        $post_string = substr($post_string, 0, -1);
-
-        $response = $this->sendTransactionToGateway($api_url, $post_string);
-        $response_array = array();
-        parse_str($response, $response_array);
-
-        if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
-          tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . stripslashes($response_array['L_LONGMESSAGE0']), 'SSL'));
-        }
-      } else {
-        tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . MODULE_PAYMENT_PAYPAL_DIRECT_ERROR_ALL_FIELDS_REQUIRED, 'SSL'));
-      }
-    }
-
-    function after_process() {
-      return false;
-    }
-
-    function get_error() {
-      return false;
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_DIRECT_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Direct', 'MODULE_PAYMENT_PAYPAL_DIRECT_STATUS', 'False', 'Do you want to accept PayPal Direct payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Username', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_USERNAME', '', 'The username to use for the PayPal API service.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Password', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_PASSWORD', '', 'The password to use for the PayPal API service.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Signature', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_SIGNATURE', '', 'The signature to use for the PayPal API service.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_DIRECT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_DIRECT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_DIRECT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_DIRECT_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
-   }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_PAYPAL_DIRECT_STATUS', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_USERNAME', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_PASSWORD', 'MODULE_PAYMENT_PAYPAL_DIRECT_API_SIGNATURE', 'MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_DIRECT_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_DIRECT_ZONE', 'MODULE_PAYMENT_PAYPAL_DIRECT_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_DIRECT_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_DIRECT_CURL');
-    }
-
-    function sendTransactionToGateway($url, $parameters) {
-      $server = parse_url($url);
-
-      if (!isset($server['port'])) {
-        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
-      }
-
-      if (!isset($server['path'])) {
-        $server['path'] = '/';
-      }
-
-      if (isset($server['user']) && isset($server['pass'])) {
-        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
-      }
-
-      if (function_exists('curl_init')) {
-        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
-        curl_setopt($curl, CURLOPT_PORT, $server['port']);
-        curl_setopt($curl, CURLOPT_HEADER, 0);
-        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
-        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
-        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
-        curl_setopt($curl, CURLOPT_POST, 1);
-        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
-
-        $result = curl_exec($curl);
-
-        curl_close($curl);
-      } else {
-        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_DIRECT_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k', $result);
-        $result = implode("\n", $result);
-      }
-
-      return $result;
-    }
-
-// format prices without currency formatting
-    function format_raw($number, $currency_code = '', $currency_value = '') {
-      global $currencies, $currency;
-
-      if (empty($currency_code) || !$this->is_set($currency_code)) {
-        $currency_code = $currency;
-      }
-
-      if (empty($currency_value) || !is_numeric($currency_value)) {
-        $currency_value = $currencies->currencies[$currency_code]['value'];
-      }
-
-      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_express.php 2.3.1.src/includes/modules/payment/paypal_express.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_express.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_express.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: paypal_express.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2008 osCommerce
+  Copyright (c) 2009 osCommerce
 
   Released under the GNU General Public License
 */
@@ -17,7 +17,8 @@
     function paypal_express() {
       global $order;
 
-      $this->signature = 'paypal|paypal_express|1.0|2.2';
+      $this->signature = 'paypal|paypal_express|1.2|2.2';
+      $this->api_version = '60.0';
 
       $this->code = 'paypal_express';
       $this->title = MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_TITLE;
@@ -57,15 +58,34 @@
     }
 
     function checkout_initialization_method() {
-      global $language;
+      global $cart;
 
-      if (file_exists(DIR_FS_CATALOG . 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif')) {
-        $image = 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif';
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_CHECKOUT_IMAGE == 'Dynamic') {
+        if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+          $image_button = 'https://fpdbs.paypal.com/dynamicimageweb?cmd=_dynamic-image';
+        } else {
+          $image_button = 'https://fpdbs.sandbox.paypal.com/dynamicimageweb?cmd=_dynamic-image';
+        }
+
+        $params = array('locale=' . MODULE_PAYMENT_PAYPAL_EXPRESS_LANGUAGE_LOCALE);
+
+        if (tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) {
+          $response_array = $this->getPalDetails();
+
+          if (isset($response_array['PAL'])) {
+            $params[] = 'pal=' . $response_array['PAL'];
+            $params[] = 'ordertotal=' . $this->format_raw($cart->show_total());
+          }
+        }
+
+        if (!empty($params)) {
+          $image_button .= '&' . implode('&', $params);
+        }
       } else {
-        $image = 'ext/modules/payment/paypal/images/btn_express.gif';
+        $image_button = MODULE_PAYMENT_PAYPAL_EXPRESS_BUTTON;
       }
 
-      $string = '<a href="' . tep_href_link('ext/modules/payment/paypal/express.php', '', 'SSL') . '"><img src="' . $image . '" border="0" alt="" title="' . tep_output_string_protected(MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_BUTTON) . '" /></a>';
+      $string = '<a href="' . tep_href_link('ext/modules/payment/paypal/express.php', '', 'SSL') . '"><img src="' . $image_button . '" border="0" alt="" title="' . tep_output_string_protected(MODULE_PAYMENT_PAYPAL_EXPRESS_TEXT_BUTTON) . '" /></a>';
 
       return $string;
     }
@@ -80,9 +100,31 @@
     }
 
     function pre_confirmation_check() {
+      global $HTTP_GET_VARS, $order, $ppe_token;
+
       if (!tep_session_is_registered('ppe_token')) {
         tep_redirect(tep_href_link('ext/modules/payment/paypal/express.php', '', 'SSL'));
       }
+
+      if (!isset($HTTP_GET_VARS['do'])) {
+        $response_array = $this->getExpressCheckoutDetails($ppe_token);
+
+        if (($response_array['ACK'] == 'Success') || ($response_array['ACK'] == 'SuccessWithWarning')) {
+// load the selected shipping module
+          include(DIR_WS_CLASSES . 'shipping.php');
+          $shipping_modules = new shipping($shipping);
+
+          include(DIR_WS_CLASSES . 'order_total.php');
+          $order_total_modules = new order_total;
+          $order_total_modules->process();
+
+          if ($response_array['AMT'] == $this->format_raw($order->info['total'])) {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'));
+          } else {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'do=confirm', 'SSL'));
+          }
+        }
+      }
     }
 
     function confirmation() {
@@ -107,7 +149,7 @@
     }
 
     function before_process() {
-      global $order, $sendto, $ppe_token, $ppe_payerid, $HTTP_POST_VARS, $comments;
+      global $customer_id, $order, $sendto, $ppe_token, $ppe_payerid, $HTTP_POST_VARS, $comments, $response_array;
 
       if (empty($comments)) {
         if (isset($HTTP_POST_VARS['ppecomments']) && tep_not_null($HTTP_POST_VARS['ppecomments'])) {
@@ -117,23 +159,10 @@
         }
       }
 
-      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
-        $api_url = 'https://api-3t.paypal.com/nvp';
-      } else {
-        $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
-      }
-
-      $params = array('USER' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME,
-                      'PWD' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD,
-                      'VERSION' => '3.2',
-                      'SIGNATURE' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE,
-                      'METHOD' => 'DoExpressCheckoutPayment',
-                      'TOKEN' => $ppe_token,
-                      'PAYMENTACTION' => ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD == 'Sale') ? 'Sale' : 'Authorization'),
+      $params = array('TOKEN' => $ppe_token,
                       'PAYERID' => $ppe_payerid,
                       'AMT' => $this->format_raw($order->info['total']),
-                      'CURRENCYCODE' => $order->info['currency'],
-                      'BUTTONSOURCE' => 'osCommerce22_Default_EC');
+                      'CURRENCYCODE' => $order->info['currency']);
 
       if (is_numeric($sendto) && ($sendto > 0)) {
         $params['SHIPTONAME'] = $order->delivery['firstname'] . ' ' . $order->delivery['lastname'];
@@ -144,17 +173,7 @@
         $params['SHIPTOZIP'] = $order->delivery['postcode'];
       }
 
-      $post_string = '';
-
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '=' . urlencode(trim($value)) . '&';
-      }
-
-      $post_string = substr($post_string, 0, -1);
-
-      $response = $this->sendTransactionToGateway($api_url, $post_string);
-      $response_array = array();
-      parse_str($response, $response_array);
+      $response_array = $this->doExpressCheckoutPayment($params);
 
       if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
         tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . stripslashes($response_array['L_LONGMESSAGE0']), 'SSL'));
@@ -162,8 +181,27 @@
     }
 
     function after_process() {
+      global $response_array, $insert_id, $order, $ppe_payerstatus, $ppe_addressstatus;
+
+      $pp_result = 'Payer Status: ' . tep_output_string_protected($ppe_payerstatus) . "\n" .
+                   'Address Status: ' . tep_output_string_protected($ppe_addressstatus) . "\n\n" .
+                   'Payment Status: ' . tep_output_string_protected($response_array['PAYMENTSTATUS']) . "\n" .
+                   'Payment Type: ' . tep_output_string_protected($response_array['PAYMENTTYPE']) . "\n" .
+                   'Pending Reason: ' . tep_output_string_protected($response_array['PENDINGREASON']) . "\n" .
+                   'Reversal Code: ' . tep_output_string_protected($response_array['REASONCODE']);
+
+      $sql_data_array = array('orders_id' => $insert_id, 
+                              'orders_status_id' => MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTIONS_ORDER_STATUS_ID, 
+                              'date_added' => 'now()', 
+                              'customer_notified' => '0',
+                              'comments' => $pp_result);
+
+      tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+
       tep_session_unregister('ppe_token');
       tep_session_unregister('ppe_payerid');
+      tep_session_unregister('ppe_payerstatus');
+      tep_session_unregister('ppe_addressstatus');
     }
 
     function get_error() {
@@ -179,15 +217,45 @@
     }
 
     function install() {
+      $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'PayPal [Transactions]' limit 1");
+
+      if (tep_db_num_rows($check_query) < 1) {
+        $status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
+        $status = tep_db_fetch_array($status_query);
+
+        $status_id = $status['status_id']+1;
+
+        $languages = tep_get_languages();
+
+        foreach ($languages as $lang) {
+          tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $status_id . "', '" . $lang['id'] . "', 'PayPal [Transactions]')");
+        }
+
+        $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+        if (tep_db_num_rows($flags_query) == 1) {
+          tep_db_query("update " . TABLE_ORDERS_STATUS . " set public_flag = 0 and downloads_flag = 0 where orders_status_id = '" . $status_id . "'");
+        }
+      } else {
+        $check = tep_db_fetch_array($check_query);
+
+        $status_id = $check['orders_status_id'];
+      }
+
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Express Checkout', 'MODULE_PAYMENT_PAYPAL_EXPRESS_STATUS', 'False', 'Do you want to accept PayPal Express Checkout payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Seller Account', 'MODULE_PAYMENT_PAYPAL_EXPRESS_SELLER_ACCOUNT', '', 'The email address of the seller account if no API credentials has been setup.', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Username', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME', '', 'The username to use for the PayPal API service', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Password', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD', '', 'The password to use for the PayPal API service', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Signature', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE', '', 'The signature to use for the PayPal API service', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('PayPal Account Optional', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ACCOUNT_OPTIONAL', 'False', 'This must also be enabled in your PayPal account, in Profile > Website Payment Preferences.', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('PayPal Instant Update', 'MODULE_PAYMENT_PAYPAL_EXPRESS_INSTANT_UPDATE', 'True', 'Support PayPal shipping and tax calculations on the PayPal.com site during Express Checkout.', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('PayPal Checkout Image', 'MODULE_PAYMENT_PAYPAL_EXPRESS_CHECKOUT_IMAGE', 'Static', 'Use static or dynamic Express Checkout image buttons. Dynamic images are used with PayPal campaigns.', '6', '0', 'tep_cfg_select_option(array(\'Static\', \'Dynamic\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail Address', 'MODULE_PAYMENT_PAYPAL_EXPRESS_DEBUG_EMAIL', '', 'All parameters of an invalid transaction will be sent to this email address.', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_EXPRESS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('PayPal Transactions Order Status Level', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTIONS_ORDER_STATUS_ID', '" . $status_id . "', 'Include PayPal transaction information in this order status level', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
       tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_EXPRESS_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
    }
 
@@ -196,7 +264,7 @@
     }
 
     function keys() {
-      return array('MODULE_PAYMENT_PAYPAL_EXPRESS_STATUS', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ZONE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_EXPRESS_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_EXPRESS_CURL');
+      return array('MODULE_PAYMENT_PAYPAL_EXPRESS_STATUS', 'MODULE_PAYMENT_PAYPAL_EXPRESS_SELLER_ACCOUNT', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD', 'MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ACCOUNT_OPTIONAL', 'MODULE_PAYMENT_PAYPAL_EXPRESS_INSTANT_UPDATE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_CHECKOUT_IMAGE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_DEBUG_EMAIL', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ZONE', 'MODULE_PAYMENT_PAYPAL_EXPRESS_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTIONS_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_EXPRESS_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_EXPRESS_CURL');
     }
 
     function sendTransactionToGateway($url, $parameters) {
@@ -240,7 +308,7 @@
     function format_raw($number, $currency_code = '', $currency_value = '') {
       global $currencies, $currency;
 
-      if (empty($currency_code) || !$this->is_set($currency_code)) {
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
         $currency_code = $currency;
       }
 
@@ -250,5 +318,186 @@
 
       return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
     }
+
+    function getPalDetails() {
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+        $api_url = 'https://api-3t.paypal.com/nvp';
+      } else {
+        $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
+      }
+
+      $params = array('VERSION' => $this->api_version,
+                      'METHOD' => 'GetPalDetails',
+                      'USER' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME,
+                      'PWD' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD,
+                      'SIGNATURE' => MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE);
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $this->sendTransactionToGateway($api_url, $post_string);
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if (!isset($response_array['PAL'])) {
+        $this->sendDebugEmail();
+      }
+
+      return $response_array;
+    }
+
+    function setExpressCheckout($parameters) {
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+        $api_url = 'https://api-3t.paypal.com/nvp';
+      } else {
+        $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
+      }
+
+      $params = array('VERSION' => $this->api_version,
+                      'METHOD' => 'SetExpressCheckout',
+                      'PAYMENTACTION' => ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD == 'Sale') || (!tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) ? 'Sale' : 'Authorization'),
+                      'RETURNURL' => tep_href_link('ext/modules/payment/paypal/express.php', 'osC_Action=retrieve', 'SSL', true, false),
+                      'CANCELURL' => tep_href_link('ext/modules/payment/paypal/express.php', 'osC_Action=cancel', 'SSL', true, false));
+
+      if (tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) {
+        $params['USER'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME;
+        $params['PWD'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD;
+        $params['SIGNATURE'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE;
+      } else {
+        $params['SUBJECT'] = MODULE_PAYMENT_PAYPAL_EXPRESS_SELLER_ACCOUNT;
+      }
+
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_ACCOUNT_OPTIONAL == 'True') {
+        $params['SOLUTIONTYPE'] = 'Sole';
+      }
+
+      if (is_array($parameters) && !empty($parameters)) {
+        $params = array_merge($params, $parameters);
+      }
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $this->sendTransactionToGateway($api_url, $post_string);
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
+        $this->sendDebugEmail();
+      }
+
+      return $response_array;
+    }
+
+    function getExpressCheckoutDetails($token) {
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+        $api_url = 'https://api-3t.paypal.com/nvp';
+      } else {
+        $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
+      }
+
+      $params = array('VERSION' => $this->api_version,
+                      'METHOD' => 'GetExpressCheckoutDetails',
+                      'TOKEN' => $token);
+
+      if (tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) {
+        $params['USER'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME;
+        $params['PWD'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD;
+        $params['SIGNATURE'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE;
+      } else {
+        $params['SUBJECT'] = MODULE_PAYMENT_PAYPAL_EXPRESS_SELLER_ACCOUNT;
+      }
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $this->sendTransactionToGateway($api_url, $post_string);
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
+        $this->sendDebugEmail();
+      }
+
+      return $response_array;
+    }
+
+    function doExpressCheckoutPayment($parameters) {
+      if (MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_SERVER == 'Live') {
+        $api_url = 'https://api-3t.paypal.com/nvp';
+      } else {
+        $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
+      }
+
+      $params = array('VERSION' => $this->api_version,
+                      'METHOD' => 'DoExpressCheckoutPayment',
+                      'PAYMENTACTION' => ((MODULE_PAYMENT_PAYPAL_EXPRESS_TRANSACTION_METHOD == 'Sale') || (!tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) ? 'Sale' : 'Authorization'),
+                      'BUTTONSOURCE' => 'osCommerce22_Default_EC');
+
+      if (tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME)) {
+        $params['USER'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_USERNAME;
+        $params['PWD'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_PASSWORD;
+        $params['SIGNATURE'] = MODULE_PAYMENT_PAYPAL_EXPRESS_API_SIGNATURE;
+      } else {
+        $params['SUBJECT'] = MODULE_PAYMENT_PAYPAL_EXPRESS_SELLER_ACCOUNT;
+      }
+
+      if (is_array($parameters) && !empty($parameters)) {
+        $params = array_merge($params, $parameters);
+      }
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $this->sendTransactionToGateway($api_url, $post_string);
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
+        $this->sendDebugEmail();
+      }
+
+      return $response_array;
+    }
+
+    function sendDebugEmail() {
+      global $HTTP_POST_VARS, $HTTP_GET_VARS;
+
+      if (tep_not_null(MODULE_PAYMENT_PAYPAL_EXPRESS_DEBUG_EMAIL)) {
+        $email_body = '$HTTP_POST_VARS:' . "\n\n";
+
+        foreach ($HTTP_POST_VARS as $key => $value) {
+          $email_body .= $key . '=' . $value . "\n";
+        }
+
+        $email_body .= "\n" . '$HTTP_GET_VARS:' . "\n\n";
+
+        foreach ($HTTP_GET_VARS as $key => $value) {
+          $email_body .= $key . '=' . $value . "\n";
+        }
+
+        tep_mail('', MODULE_PAYMENT_PAYPAL_EXPRESS_DEBUG_EMAIL, 'PayPal Express Debug E-Mail', $email_body, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+      }
+    }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_dp.php 2.3.1.src/includes/modules/payment/paypal_pro_dp.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_dp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_pro_dp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,421 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class paypal_pro_dp {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function paypal_pro_dp() {
+      global $order;
+
+      $this->signature = 'paypal|paypal_pro_dp|1.2|2.2';
+
+      $this->code = 'paypal_pro_dp';
+      $this->title = MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_PAYPAL_PRO_DP_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_PAYPAL_PRO_DP_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_PAYPAL_PRO_DP_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_PAYPAL_PRO_DP_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_PAYPAL_PRO_DP_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      $this->cc_types = array('VISA' => 'Visa',
+                              'VISA_DEBIT' => 'Visa Debit',
+                              'VISA_ELECTRON' => 'Visa Electron',
+                              'MASTERCARD' => 'MasterCard',
+                              'DISCOVER' => 'Discover Card',
+                              'AMEX' => 'American Express',
+                              'SWITCH' => 'Maestro',
+                              'SOLO' => 'Solo');
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_PRO_DP_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_PRO_DP_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      $selection = array('id' => $this->code,
+                         'module' => $this->public_title);
+
+      if (MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $order;
+
+        $types_array = array();
+        while (list($key, $value) = each($this->cc_types)) {
+          if ($this->isCardAccepted($key)) {
+            $types_array[] = array('id' => $key,
+                                   'text' => $value);
+          }
+        }
+
+        $today = getdate();
+
+        $months_array = array();
+        for ($i=1; $i<13; $i++) {
+          $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
+        }
+
+        $year_valid_from_array = array();
+        for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
+          $year_valid_from_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $year_expires_array = array();
+        for ($i=$today['year']; $i < $today['year']+10; $i++) {
+          $year_expires_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $selection['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_OWNER,
+                                           'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_TYPE,
+                                           'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_NUMBER,
+                                           'field' => tep_draw_input_field('cc_number_nh-dns')),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM,
+                                           'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM_INFO),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_EXPIRES,
+                                           'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_CVC,
+                                           'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')));
+
+        if ( $this->isCardAccepted('SWITCH') || $this->isCardAccepted('SOLO') ) {
+          $selection['fields'][] = array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER,
+                                         'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER_INFO);
+        }
+      }
+
+      return $selection;
+    }
+
+    function pre_confirmation_check() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        if (!isset($HTTP_POST_VARS['cc_owner']) || empty($HTTP_POST_VARS['cc_owner']) || (strlen($HTTP_POST_VARS['cc_owner']) < CC_OWNER_MIN_LENGTH) || !isset($HTTP_POST_VARS['cc_type']) || !$this->isCardAccepted($HTTP_POST_VARS['cc_type']) || !isset($HTTP_POST_VARS['cc_number_nh-dns']) || empty($HTTP_POST_VARS['cc_number_nh-dns']) || (strlen($HTTP_POST_VARS['cc_number_nh-dns']) < CC_NUMBER_MIN_LENGTH)) {
+          $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode(MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_ALL_FIELDS_REQUIRED) . '&cc_owner=' . urlencode($HTTP_POST_VARS['cc_owner']) . '&cc_starts_month=' . $HTTP_POST_VARS['cc_starts_month'] . '&cc_starts_year=' . $HTTP_POST_VARS['cc_starts_year'] . '&cc_expires_month=' . $HTTP_POST_VARS['cc_expires_month'] . '&cc_expires_year=' . $HTTP_POST_VARS['cc_expires_year'];
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+        }
+      }
+
+      return false;
+    }
+
+    function confirmation() {
+      $confirmation = array();
+
+      if (MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        $confirmation['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_OWNER,
+                                              'field' => $HTTP_POST_VARS['cc_owner']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_TYPE,
+                                              'field' => $this->cc_types[$HTTP_POST_VARS['cc_type']]),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_NUMBER,
+                                              'field' => str_repeat('X', strlen($HTTP_POST_VARS['cc_number_nh-dns']) - 4) . substr($HTTP_POST_VARS['cc_number_nh-dns'], -4)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM,
+                                              'field' => $HTTP_POST_VARS['cc_starts_month'] . '/' . $HTTP_POST_VARS['cc_starts_year']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_EXPIRES,
+                                              'field' => $HTTP_POST_VARS['cc_expires_month'] . '/' . $HTTP_POST_VARS['cc_expires_year']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_CVC,
+                                              'field' => $HTTP_POST_VARS['cc_cvc_nh-dns']));
+
+        if ( (($HTTP_POST_VARS['cc_type'] == 'SWITCH') && $this->isCardAccepted('SWITCH')) || (($HTTP_POST_VARS['cc_type'] == 'SOLO') && $this->isCardAccepted('SOLO')) ) {
+          if (isset($HTTP_POST_VARS['cc_issue_nh-dns']) && !empty($HTTP_POST_VARS['cc_issue_nh-dns'])) {
+            $confirmation['fields'][] = array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER,
+                                              'field' => $HTTP_POST_VARS['cc_issue_nh-dns']);
+          }
+        }
+      } else {
+        global $order;
+
+        $types_array = array();
+        while (list($key, $value) = each($this->cc_types)) {
+          if ($this->isCardAccepted($key)) {
+            $types_array[] = array('id' => $key,
+                                   'text' => $value);
+          }
+        }
+
+        $today = getdate();
+
+        $months_array = array();
+        for ($i=1; $i<13; $i++) {
+          $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
+        }
+
+        $year_valid_from_array = array();
+        for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
+          $year_valid_from_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $year_expires_array = array();
+        for ($i=$today['year']; $i < $today['year']+10; $i++) {
+          $year_expires_array[] = array('id' => strftime('%Y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $confirmation['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_OWNER,
+                                              'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_TYPE,
+                                              'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_NUMBER,
+                                              'field' => tep_draw_input_field('cc_number_nh-dns')),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM,
+                                              'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_VALID_FROM_INFO),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_EXPIRES,
+                                              'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_CVC,
+                                              'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')));
+
+        if ( $this->isCardAccepted('SWITCH') || $this->isCardAccepted('SOLO') ) {
+          $confirmation['fields'][] = array('title' => MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER,
+                                            'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_ISSUE_NUMBER_INFO);
+        }
+      }
+
+      return $confirmation;
+    }
+
+    function process_button() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        $process_button_string = tep_draw_hidden_field('cc_owner', $HTTP_POST_VARS['cc_owner']) .
+                                 tep_draw_hidden_field('cc_type', $HTTP_POST_VARS['cc_type']) .
+                                 tep_draw_hidden_field('cc_number_nh-dns', $HTTP_POST_VARS['cc_number_nh-dns']) .
+                                 tep_draw_hidden_field('cc_starts_month', $HTTP_POST_VARS['cc_starts_month']) .
+                                 tep_draw_hidden_field('cc_starts_year', $HTTP_POST_VARS['cc_starts_year']) .
+                                 tep_draw_hidden_field('cc_expires_month', $HTTP_POST_VARS['cc_expires_month']) .
+                                 tep_draw_hidden_field('cc_expires_year', $HTTP_POST_VARS['cc_expires_year']) .
+                                 tep_draw_hidden_field('cc_cvc_nh-dns', $HTTP_POST_VARS['cc_cvc_nh-dns']);
+
+        if ( (($HTTP_POST_VARS['cc_type'] == 'SWITCH') && $this->isCardAccepted('SWITCH')) || (($HTTP_POST_VARS['cc_type'] == 'SOLO') && $this->isCardAccepted('SOLO')) ) {
+          $process_button_string .= tep_draw_hidden_field('cc_issue_nh-dns', $HTTP_POST_VARS['cc_issue_nh-dns']);
+        }
+
+        return $process_button_string;
+      }
+
+      return false;
+    }
+
+    function before_process() {
+      global $HTTP_POST_VARS, $order, $sendto;
+
+      if (isset($HTTP_POST_VARS['cc_owner']) && !empty($HTTP_POST_VARS['cc_owner']) && isset($HTTP_POST_VARS['cc_type']) && $this->isCardAccepted($HTTP_POST_VARS['cc_type']) && isset($HTTP_POST_VARS['cc_number_nh-dns']) && !empty($HTTP_POST_VARS['cc_number_nh-dns'])) {
+        if (MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_SERVER == 'Live') {
+          $api_url = 'https://api-3t.paypal.com/nvp';
+        } else {
+          $api_url = 'https://api-3t.sandbox.paypal.com/nvp';
+        }
+
+        $card_type = $HTTP_POST_VARS['cc_type'];
+        if ( ($card_type == 'VISA_DEBIT') || ($card_type == 'VISA_ELECTRON') ) {
+          $card_type = 'VISA';
+        }
+
+        $params = array('USER' => MODULE_PAYMENT_PAYPAL_PRO_DP_API_USERNAME,
+                        'PWD' => MODULE_PAYMENT_PAYPAL_PRO_DP_API_PASSWORD,
+                        'VERSION' => '3.2',
+                        'SIGNATURE' => MODULE_PAYMENT_PAYPAL_PRO_DP_API_SIGNATURE,
+                        'METHOD' => 'DoDirectPayment',
+                        'PAYMENTACTION' => ((MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_METHOD == 'Sale') ? 'Sale' : 'Authorization'),
+                        'IPADDRESS' => tep_get_ip_address(),
+                        'AMT' => $this->format_raw($order->info['total']),
+                        'CREDITCARDTYPE' => $card_type,
+                        'ACCT' => $HTTP_POST_VARS['cc_number_nh-dns'],
+                        'STARTDATE' => $HTTP_POST_VARS['cc_starts_month'] . $HTTP_POST_VARS['cc_starts_year'],
+                        'EXPDATE' => $HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'],
+                        'CVV2' => $HTTP_POST_VARS['cc_cvc_nh-dns'],
+                        'FIRSTNAME' => substr($HTTP_POST_VARS['cc_owner'], 0, strpos($HTTP_POST_VARS['cc_owner'], ' ')),
+                        'LASTNAME' => substr($HTTP_POST_VARS['cc_owner'], strpos($HTTP_POST_VARS['cc_owner'], ' ')+1),
+                        'STREET' => $order->billing['street_address'],
+                        'CITY' => $order->billing['city'],
+                        'STATE' => tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']),
+                        'COUNTRYCODE' => $order->billing['country']['iso_code_2'],
+                        'ZIP' => $order->billing['postcode'],
+                        'EMAIL' => $order->customer['email_address'],
+                        'PHONENUM' => $order->customer['telephone'],
+                        'CURRENCYCODE' => $order->info['currency'],
+                        'BUTTONSOURCE' => 'osCommerce22_Default_DP');
+
+        if ( (($HTTP_POST_VARS['cc_type'] == 'SWITCH') && $this->isCardAccepted('SWITCH')) || (($HTTP_POST_VARS['cc_type'] == 'SOLO') && $this->isCardAccepted('SOLO')) ) {
+          $params['ISSUENUMBER'] = $HTTP_POST_VARS['cc_issue_nh-dns'];
+        }
+
+        if (is_numeric($sendto) && ($sendto > 0)) {
+          $params['SHIPTONAME'] = $order->delivery['firstname'] . ' ' . $order->delivery['lastname'];
+          $params['SHIPTOSTREET'] = $order->delivery['street_address'];
+          $params['SHIPTOCITY'] = $order->delivery['city'];
+          $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
+          $params['SHIPTOCOUNTRYCODE'] = $order->delivery['country']['iso_code_2'];
+          $params['SHIPTOZIP'] = $order->delivery['postcode'];
+        }
+
+        $post_string = '';
+
+        foreach ($params as $key => $value) {
+          $post_string .= $key . '=' . urlencode(utf8_encode(trim($value))) . '&';
+        }
+
+        $post_string = substr($post_string, 0, -1);
+
+        $response = $this->sendTransactionToGateway($api_url, $post_string);
+        $response_array = array();
+        parse_str($response, $response_array);
+
+        if (($response_array['ACK'] != 'Success') && ($response_array['ACK'] != 'SuccessWithWarning')) {
+          tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . stripslashes($response_array['L_LONGMESSAGE0']), 'SSL'));
+        }
+      } else {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . MODULE_PAYMENT_PAYPAL_PRO_DP_ERROR_ALL_FIELDS_REQUIRED, 'SSL'));
+      }
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_GET_VARS;
+
+        $error = array('error' => stripslashes(urldecode($HTTP_GET_VARS['error'])));
+
+        return $error;
+      }
+
+      return false;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_PRO_DP_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Direct', 'MODULE_PAYMENT_PAYPAL_PRO_DP_STATUS', 'False', 'Do you want to accept PayPal Direct payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Username', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_USERNAME', '', 'The username to use for the PayPal API service.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Password', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_PASSWORD', '', 'The password to use for the PayPal API service.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('API Signature', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_SIGNATURE', '', 'The signature to use for the PayPal API service.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Card Acceptance Page', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE', 'Confirmation', 'The location to accept card information. Either on the Checkout Confirmation page or the Checkout Payment page.', '6', '0', 'tep_cfg_select_option(array(\'Confirmation\', \'Payment\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_PRO_DP_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_PRO_DP_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_PRO_DP_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA', 'True', 'Accept Visa card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa Debit', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA_DEBIT', 'True', 'Accept Visa Debit card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa Electron', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA_ELECTRON', 'True', 'Accept Visa Electron card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept MasterCard', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_MASTERCARD', 'True', 'Accept MasterCard card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Discover', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_DISCOVER', 'True', 'Accept Discover card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept American Express', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_AMEX', 'True', 'Accept American Express card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Maestro', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_SWITCH', 'True', 'Accept Maestro card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Solo', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_SOLO', 'True', 'Accept Solo card payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+   }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_PAYPAL_PRO_DP_STATUS', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_USERNAME', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_PASSWORD', 'MODULE_PAYMENT_PAYPAL_PRO_DP_API_SIGNATURE', 'MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_PRO_DP_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARD_INPUT_PAGE', 'MODULE_PAYMENT_PAYPAL_PRO_DP_ZONE', 'MODULE_PAYMENT_PAYPAL_PRO_DP_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_PRO_DP_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CURL', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA_DEBIT', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_VISA_ELECTRON', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_MASTERCARD', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_DISCOVER', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_AMEX', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_SWITCH', 'MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_SOLO');
+    }
+
+    function sendTransactionToGateway($url, $parameters) {
+      $server = parse_url($url);
+
+      if (!isset($server['port'])) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (!isset($server['path'])) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_PRO_DP_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k', $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function isCardAccepted($card) {
+      return (isset($this->cc_types[$card]) && defined('MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_' . $card) && (constant('MODULE_PAYMENT_PAYPAL_PRO_DP_CARDTYPE_' . $card) == 'True'));
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_payflow_dp.php 2.3.1.src/includes/modules/payment/paypal_pro_payflow_dp.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_payflow_dp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_pro_payflow_dp.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,430 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class paypal_pro_payflow_dp {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function paypal_pro_payflow_dp() {
+      global $order;
+
+      $this->signature = 'paypal|paypal_pro_payflow_dp|1.2|2.2';
+
+      $this->code = 'paypal_pro_payflow_dp';
+      $this->title = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      $this->cc_types = array('0' => 'Visa',
+                              '1' => 'MasterCard',
+                              '9' => 'Maestro',
+                              'S' => 'Solo');
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      $selection = array('id' => $this->code,
+                         'module' => $this->public_title);
+
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $order;
+
+        $types_array = array();
+        while (list($key, $value) = each($this->cc_types)) {
+          $types_array[] = array('id' => $key,
+                                 'text' => $value);
+        }
+
+        $today = getdate();
+
+        $months_array = array();
+        for ($i=1; $i<13; $i++) {
+          $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
+        }
+
+        $year_valid_from_array = array();
+        for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
+          $year_valid_from_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $year_expires_array = array();
+        for ($i=$today['year']; $i < $today['year']+10; $i++) {
+          $year_expires_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $selection['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_FIRSTNAME,
+                                           'field' => tep_draw_input_field('cc_owner_firstname', $order->billing['firstname'])),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_LASTNAME,
+                                           'field' => tep_draw_input_field('cc_owner_lastname', $order->billing['lastname'])),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_TYPE,
+                                           'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_NUMBER,
+                                           'field' => tep_draw_input_field('cc_number_nh-dns')),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM,
+                                           'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM_INFO),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_EXPIRES,
+                                           'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_CVC,
+                                           'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')),
+                                     array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER,
+                                           'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER_INFO));
+      }
+
+      return $selection;
+    }
+
+    function pre_confirmation_check() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        if (!isset($HTTP_POST_VARS['cc_owner_firstname']) || empty($HTTP_POST_VARS['cc_owner_firstname']) || !isset($HTTP_POST_VARS['cc_owner_lastname']) || empty($HTTP_POST_VARS['cc_owner_lastname']) || (strlen($HTTP_POST_VARS['cc_owner_firstname'] . ' ' . $HTTP_POST_VARS['cc_owner_lastname']) < CC_OWNER_MIN_LENGTH) || !isset($HTTP_POST_VARS['cc_type']) || !isset($this->cc_types[$HTTP_POST_VARS['cc_type']]) || !isset($HTTP_POST_VARS['cc_number_nh-dns']) || empty($HTTP_POST_VARS['cc_number_nh-dns']) || (strlen($HTTP_POST_VARS['cc_number_nh-dns']) < CC_NUMBER_MIN_LENGTH)) {
+          $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ALL_FIELDS_REQUIRED) . '&cc_owner_firstname=' . urlencode($HTTP_POST_VARS['cc_owner_firstname']) . '&cc_owner_lastname=' . urlencode($HTTP_POST_VARS['cc_owner_lastname']) . '&cc_starts_month=' . $HTTP_POST_VARS['cc_starts_month'] . '&cc_starts_year=' . $HTTP_POST_VARS['cc_starts_year'] . '&cc_expires_month=' . $HTTP_POST_VARS['cc_expires_month'] . '&cc_expires_year=' . $HTTP_POST_VARS['cc_expires_year'];
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
+        }
+      }
+
+      return false;
+    }
+
+    function confirmation() {
+      $confirmation = array();
+
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        $confirmation['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER,
+                                              'field' => $HTTP_POST_VARS['cc_owner_firstname'] . ' ' . $HTTP_POST_VARS['cc_owner_lastname']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_TYPE,
+                                              'field' => $this->cc_types[$HTTP_POST_VARS['cc_type']]),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_NUMBER,
+                                              'field' => str_repeat('X', strlen($HTTP_POST_VARS['cc_number_nh-dns']) - 4) . substr($HTTP_POST_VARS['cc_number_nh-dns'], -4)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM,
+                                              'field' => $HTTP_POST_VARS['cc_starts_month'] . '/' . $HTTP_POST_VARS['cc_starts_year']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_EXPIRES,
+                                              'field' => $HTTP_POST_VARS['cc_expires_month'] . '/' . $HTTP_POST_VARS['cc_expires_year']),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_CVC,
+                                              'field' => $HTTP_POST_VARS['cc_cvc_nh-dns']));
+
+        if (isset($HTTP_POST_VARS['cc_issue_nh-dns']) && !empty($HTTP_POST_VARS['cc_issue_nh-dns'])) {
+          $confirmation['fields'][] = array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER,
+                                            'field' => $HTTP_POST_VARS['cc_issue_nh-dns']);
+        }
+      } else {
+        global $order;
+
+        $types_array = array();
+        while (list($key, $value) = each($this->cc_types)) {
+          $types_array[] = array('id' => $key,
+                                 'text' => $value);
+        }
+
+        $today = getdate();
+
+        $months_array = array();
+        for ($i=1; $i<13; $i++) {
+          $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
+        }
+
+        $year_valid_from_array = array();
+        for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
+          $year_valid_from_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $year_expires_array = array();
+        for ($i=$today['year']; $i < $today['year']+10; $i++) {
+          $year_expires_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
+        }
+
+        $confirmation['fields'] = array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_FIRSTNAME,
+                                              'field' => tep_draw_input_field('cc_owner_firstname', $order->billing['firstname'])),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_OWNER_LASTNAME,
+                                              'field' => tep_draw_input_field('cc_owner_lastname', $order->billing['lastname'])),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_TYPE,
+                                              'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_NUMBER,
+                                              'field' => tep_draw_input_field('cc_number_nh-dns')),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM,
+                                              'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_VALID_FROM_INFO),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_EXPIRES,
+                                              'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_CVC,
+                                              'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')),
+                                        array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER,
+                                              'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_ISSUE_NUMBER_INFO));
+      }
+
+      return $confirmation;
+    }
+
+    function process_button() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_POST_VARS;
+
+        $process_button_string = tep_draw_hidden_field('cc_owner_firstname', $HTTP_POST_VARS['cc_owner_firstname']) .
+                                 tep_draw_hidden_field('cc_owner_lastname', $HTTP_POST_VARS['cc_owner_lastname']) .
+                                 tep_draw_hidden_field('cc_type', $HTTP_POST_VARS['cc_type']) .
+                                 tep_draw_hidden_field('cc_number_nh-dns', $HTTP_POST_VARS['cc_number_nh-dns']) .
+                                 tep_draw_hidden_field('cc_starts_month', $HTTP_POST_VARS['cc_starts_month']) .
+                                 tep_draw_hidden_field('cc_starts_year', $HTTP_POST_VARS['cc_starts_year']) .
+                                 tep_draw_hidden_field('cc_expires_month', $HTTP_POST_VARS['cc_expires_month']) .
+                                 tep_draw_hidden_field('cc_expires_year', $HTTP_POST_VARS['cc_expires_year']) .
+                                 tep_draw_hidden_field('cc_cvc_nh-dns', $HTTP_POST_VARS['cc_cvc_nh-dns']);
+
+        if (isset($HTTP_POST_VARS['cc_issue_nh-dns']) && !empty($HTTP_POST_VARS['cc_issue_nh-dns'])) {
+          $process_button_string .= tep_draw_hidden_field('cc_issue_nh-dns', $HTTP_POST_VARS['cc_issue_nh-dns']);
+        }
+
+        return $process_button_string;
+      }
+
+      return false;
+    }
+
+    function before_process() {
+      global $HTTP_POST_VARS, $order, $sendto;
+
+      if (isset($HTTP_POST_VARS['cc_owner_firstname']) && !empty($HTTP_POST_VARS['cc_owner_firstname']) && isset($HTTP_POST_VARS['cc_owner_lastname']) && !empty($HTTP_POST_VARS['cc_owner_lastname']) && isset($HTTP_POST_VARS['cc_type']) && isset($this->cc_types[$HTTP_POST_VARS['cc_type']]) && isset($HTTP_POST_VARS['cc_number_nh-dns']) && !empty($HTTP_POST_VARS['cc_number_nh-dns'])) {
+        if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_SERVER == 'Live') {
+          $api_url = 'https://payflowpro.verisign.com/transaction';
+        } else {
+          $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
+        }
+
+        $name = explode(' ', $HTTP_POST_VARS['cc_owner'], 2);
+
+        $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_USERNAME) ? MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_USERNAME : MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_VENDOR),
+                        'VENDOR' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_VENDOR,
+                        'PARTNER' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PARTNER,
+                        'PWD' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PASSWORD,
+                        'TENDER' => 'C',
+                        'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'),
+                        'AMT' => $this->format_raw($order->info['total']),
+                        'CURRENCY' => $order->info['currency'],
+                        'FIRSTNAME' => $HTTP_POST_VARS['cc_owner_firstname'],
+                        'LASTNAME' => $HTTP_POST_VARS['cc_owner_lastname'],
+                        'STREET' => $order->billing['street_address'],
+                        'CITY' => $order->billing['city'],
+                        'STATE' => tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']),
+                        'COUNTRY' => $order->billing['country']['iso_code_2'],
+                        'ZIP' => $order->billing['postcode'],
+                        'CLIENTIP' => tep_get_ip_address(),
+                        'EMAIL' => $order->customer['email_address'],
+                        'ACCT' => $HTTP_POST_VARS['cc_number_nh-dns'],
+                        'ACCTTYPE' => $HTTP_POST_VARS['cc_type'],
+                        'CARDSTART' => $HTTP_POST_VARS['cc_starts_month'] . $HTTP_POST_VARS['cc_starts_year'],
+                        'EXPDATE' => $HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'],
+                        'CVV2' => $HTTP_POST_VARS['cc_cvc_nh-dns'],
+                        'BUTTONSOURCE' => 'osCommerce22_Default_PRO2DP');
+
+        if ( ($HTTP_POST_VARS['cc_type'] == '9') || ($HTTP_POST_VARS['cc_type'] == 'S') ) {
+          $params['CARDISSUE'] = $HTTP_POST_VARS['cc_issue_nh-dns'];
+        }
+
+        if (is_numeric($sendto) && ($sendto > 0)) {
+          $params['SHIPTOFIRSTNAME'] = $order->delivery['firstname'];
+          $params['SHIPTOLASTNAME'] = $order->delivery['lastname'];
+          $params['SHIPTOSTREET'] = $order->delivery['street_address'];
+          $params['SHIPTOCITY'] = $order->delivery['city'];
+          $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
+          $params['SHIPTOCOUNTRY'] = $order->delivery['country']['iso_code_2'];
+          $params['SHIPTOZIP'] = $order->delivery['postcode'];
+        }
+
+        $post_string = '';
+
+        foreach ($params as $key => $value) {
+          $post_string .= $key . '[' . strlen(urlencode(utf8_encode(trim($value)))) . ']=' . urlencode(utf8_encode(trim($value))) . '&';
+        }
+
+        $post_string = substr($post_string, 0, -1);
+
+        $response = $this->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
+        $response_array = array();
+        parse_str($response, $response_array);
+
+        if ($response_array['RESULT'] != '0') {
+          switch ($response_array['RESULT']) {
+            case '1':
+            case '26':
+              $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_CFG_ERROR;
+              break;
+
+            case '7':
+              $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ADDRESS;
+              break;
+
+            case '12':
+              $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_DECLINED;
+              break;
+
+            case '23':
+            case '24':
+              $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_INVALID_CREDIT_CARD;
+              break;
+
+            default:
+              $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_GENERAL;
+              break;
+          }
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . urlencode($error_message), 'SSL'));
+        }
+      } else {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ERROR_ALL_FIELDS_REQUIRED, 'SSL'));
+      }
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE == 'Payment') {
+        global $HTTP_GET_VARS;
+
+        $error = array('error' => stripslashes(urldecode($HTTP_GET_VARS['error'])));
+
+        return $error;
+      }
+
+      return false;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Direct (UK)', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_STATUS', 'False', 'Do you want to accept PayPal Direct (UK) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_VENDOR', '', 'Your merchant login ID that you created when you registered for the Website Payments Pro account.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_USERNAME', '', 'If you set up one or more additional users on the account, this value is the ID of the user authorised to process transactions. If, however, you have not set up additional users on the account, USER has the same value as VENDOR.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PASSWORD', '', 'The 6- to 32-character password that you defined while registering for the account.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Partner', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PARTNER', 'PayPalUK', 'The ID provided to you by the authorised PayPal Reseller who registered you for the Payflow SDK. If you purchased your account directly from PayPal, use PayPalUK.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Card Acceptance Page', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE', 'Confirmation', 'The location to accept card information. Either on the Checkout Confirmation page or the Checkout Payment page.', '6', '0', 'tep_cfg_select_option(array(\'Confirmation\', \'Payment\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+   }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_STATUS', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_VENDOR', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_USERNAME', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PASSWORD', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_PARTNER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CARD_INPUT_PAGE', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ZONE', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CURL');
+    }
+
+    function sendTransactionToGateway($url, $parameters, $headers = null) {
+      $header = array();
+
+      $server = parse_url($url);
+
+      if (!isset($server['port'])) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (!isset($server['path'])) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (!empty($headers) && is_array($headers)) {
+        $header = array_merge($header, $headers);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        if (!empty($header)) {
+          curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
+        }
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_DP_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k' . (!empty($header) ? ' -H ' . escapeshellarg(implode("\r\n", $header)) : ''), $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_payflow_ec.php 2.3.1.src/includes/modules/payment/paypal_pro_payflow_ec.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_pro_payflow_ec.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_pro_payflow_ec.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,289 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class paypal_pro_payflow_ec {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function paypal_pro_payflow_ec() {
+      global $order;
+
+      $this->signature = 'paypal|paypal_pro_payflow_ec|1.1|2.2';
+
+      $this->code = 'paypal_pro_payflow_ec';
+      $this->title = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function checkout_initialization_method() {
+      global $language;
+
+      if (file_exists(DIR_FS_CATALOG . 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif')) {
+        $image = 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif';
+      } else {
+        $image = 'ext/modules/payment/paypal/images/btn_express.gif';
+      }
+
+      $string = '<a href="' . tep_href_link('ext/modules/payment/paypal/express_payflow.php', '', 'SSL') . '"><img src="' . $image . '" border="0" alt="" title="' . tep_output_string_protected(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_BUTTON) . '" /></a>';
+
+      return $string;
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      if (!tep_session_is_registered('ppeuk_token')) {
+        tep_redirect(tep_href_link('ext/modules/payment/paypal/express_payflow.php', '', 'SSL'));
+      }
+    }
+
+    function confirmation() {
+      global $comments;
+
+      if (!isset($comments)) {
+        $comments = null;
+      }
+
+      $confirmation = false;
+
+      if (empty($comments)) {
+        $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TEXT_COMMENTS,
+                                                      'field' => tep_draw_textarea_field('ppecomments', 'soft', '60', '5', $comments))));
+      }
+
+      return $confirmation;
+    }
+
+    function process_button() {
+      return false;
+    }
+
+    function before_process() {
+      global $order, $sendto, $ppeuk_token, $ppeuk_payerid, $HTTP_POST_VARS, $comments;
+
+      if (empty($comments)) {
+        if (isset($HTTP_POST_VARS['ppecomments']) && tep_not_null($HTTP_POST_VARS['ppecomments'])) {
+          $comments = tep_db_prepare_input($HTTP_POST_VARS['ppecomments']);
+
+          $order->info['comments'] = $comments;
+        }
+      }
+
+      if (MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_SERVER == 'Live') {
+        $api_url = 'https://payflowpro.verisign.com/transaction';
+      } else {
+        $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
+      }
+
+      $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME) ? MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME : MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR),
+                      'VENDOR' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR,
+                      'PARTNER' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PARTNER,
+                      'PWD' => MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PASSWORD,
+                      'TENDER' => 'P',
+                      'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'),
+                      'EMAIL' => $order->customer['email_address'],
+                      'TOKEN' => $ppeuk_token,
+                      'ACTION' => 'D',
+                      'PAYERID' => $ppeuk_payerid,
+                      'AMT' => $this->format_raw($order->info['total']),
+                      'CURRENCY' => $order->info['currency'],
+                      'BUTTONSOURCE' => 'osCommerce22_Default_PRO2EC');
+
+      if (is_numeric($sendto) && ($sendto > 0)) {
+        $params['SHIPTOSTREET'] = $order->delivery['street_address'];
+        $params['SHIPTOCITY'] = $order->delivery['city'];
+        $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
+        $params['SHIPTOCOUNTRY'] = $order->delivery['country']['iso_code_2'];
+        $params['SHIPTOZIP'] = $order->delivery['postcode'];
+      }
+
+      $post_string = '';
+
+      foreach ($params as $key => $value) {
+        $post_string .= $key . '[' . strlen(urlencode(utf8_encode(trim($value)))) . ']=' . urlencode(utf8_encode(trim($value))) . '&';
+      }
+
+      $post_string = substr($post_string, 0, -1);
+
+      $response = $this->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
+      $response_array = array();
+      parse_str($response, $response_array);
+
+      if ($response_array['RESULT'] != '0') {
+        switch ($response_array['RESULT']) {
+          case '1':
+          case '26':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_CFG_ERROR;
+            break;
+
+          case '7':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_ADDRESS;
+            break;
+
+          case '12':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_DECLINED;
+            break;
+
+          case '1000':
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_EXPRESS_DISABLED;
+            break;
+
+          default:
+            $error_message = MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ERROR_GENERAL;
+            break;
+        }
+
+        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
+      }
+    }
+
+    function after_process() {
+      tep_session_unregister('ppeuk_token');
+      tep_session_unregister('ppeuk_payerid');
+    }
+
+    function get_error() {
+      return false;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Express Checkout (UK)', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_STATUS', 'False', 'Do you want to accept PayPal Express Checkout (UK) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR', '', 'Your merchant login ID that you created when you registered for the Website Payments Pro account.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME', '', 'If you set up one or more additional users on the account, this value is the ID of the user authorised to process transactions. If, however, you have not set up additional users on the account, USER has the same value as VENDOR.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PASSWORD', '', 'The 6- to 32-character password that you defined while registering for the account.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Partner', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PARTNER', 'PayPalUK', 'The ID provided to you by the authorised PayPal Reseller who registered you for the Payflow SDK. If you purchased your account directly from PayPal, use PayPalUK.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+   }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_STATUS', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_VENDOR', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_USERNAME', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PASSWORD', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_PARTNER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ZONE', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_CURL');
+    }
+
+    function sendTransactionToGateway($url, $parameters, $headers = null) {
+      $header = array();
+
+      $server = parse_url($url);
+
+      if (!isset($server['port'])) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (!isset($server['path'])) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (!empty($headers) && is_array($headers)) {
+        $header = array_merge($header, $headers);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        if (!empty($header)) {
+          curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
+        }
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_PRO_PAYFLOW_EC_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k' . (!empty($header) ? ' -H ' . escapeshellarg(implode("\r\n", $header)) : ''), $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_standard.php 2.3.1.src/includes/modules/payment/paypal_standard.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_standard.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_standard.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: paypal_standard.php 1803 2008-01-11 18:16:37Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_uk_direct.php 2.3.1.src/includes/modules/payment/paypal_uk_direct.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_uk_direct.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_uk_direct.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,316 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_direct.php 1803 2008-01-11 18:16:37Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class paypal_uk_direct {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function paypal_uk_direct() {
-      global $order;
-
-      $this->signature = 'paypal|paypal_uk_direct|1.0|2.2';
-
-      $this->code = 'paypal_uk_direct';
-      $this->title = MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_TITLE;
-      $this->public_title = MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_PUBLIC_TITLE;
-      $this->description = MODULE_PAYMENT_PAYPAL_UK_DIRECT_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_PAYPAL_UK_DIRECT_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_PAYPAL_UK_DIRECT_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_PAYPAL_UK_DIRECT_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-
-      $this->cc_types = array('0' => 'Visa',
-                              '1' => 'MasterCard',
-                              '9' => 'Maestro',
-                              'S' => 'Solo');
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_UK_DIRECT_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_UK_DIRECT_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      return array('id' => $this->code,
-                   'module' => $this->public_title);
-    }
-
-    function pre_confirmation_check() {
-      return false;
-    }
-
-    function confirmation() {
-      global $order;
-
-      $types_array = array();
-      while (list($key, $value) = each($this->cc_types)) {
-        $types_array[] = array('id' => $key,
-                               'text' => $value);
-      }
-
-      $today = getdate();
-
-      $months_array = array();
-      for ($i=1; $i<13; $i++) {
-        $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
-      }
-
-      $year_valid_from_array = array();
-      for ($i=$today['year']-10; $i < $today['year']+1; $i++) {
-        $year_valid_from_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
-      }
-
-      $year_expires_array = array();
-      for ($i=$today['year']; $i < $today['year']+10; $i++) {
-        $year_expires_array[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
-      }
-
-      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_OWNER,
-                                                    'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'])),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_TYPE,
-                                                    'field' => tep_draw_pull_down_menu('cc_type', $types_array)),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_NUMBER,
-                                                    'field' => tep_draw_input_field('cc_number_nh-dns')),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM,
-                                                    'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . ' ' . MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_VALID_FROM_INFO),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_EXPIRES,
-                                                    'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_expires_array)),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_CVC,
-                                                    'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"')),
-                                              array('title' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER,
-                                                    'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . ' ' . MODULE_PAYMENT_PAYPAL_UK_DIRECT_CARD_ISSUE_NUMBER_INFO)));
-
-      return $confirmation;
-    }
-
-    function process_button() {
-      return false;
-    }
-
-    function before_process() {
-      global $HTTP_POST_VARS, $order, $sendto;
-
-      if (isset($HTTP_POST_VARS['cc_owner']) && !empty($HTTP_POST_VARS['cc_owner']) && isset($HTTP_POST_VARS['cc_type']) && isset($this->cc_types[$HTTP_POST_VARS['cc_type']]) && isset($HTTP_POST_VARS['cc_number_nh-dns']) && !empty($HTTP_POST_VARS['cc_number_nh-dns'])) {
-        if (MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_SERVER == 'Live') {
-          $api_url = 'https://payflowpro.verisign.com/transaction';
-        } else {
-          $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
-        }
-
-        $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_UK_DIRECT_USERNAME) ? MODULE_PAYMENT_PAYPAL_UK_DIRECT_USERNAME : MODULE_PAYMENT_PAYPAL_UK_DIRECT_VENDOR),
-                        'VENDOR' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_VENDOR,
-                        'PARTNER' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_PARTNER,
-                        'PWD' => MODULE_PAYMENT_PAYPAL_UK_DIRECT_PASSWORD,
-                        'TENDER' => 'C',
-                        'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'),
-                        'AMT' => $this->format_raw($order->info['total']),
-                        'CURRENCY' => $order->info['currency'],
-                        'NAME' => $HTTP_POST_VARS['cc_owner'],
-                        'STREET' => $order->billing['street_address'],
-                        'CITY' => $order->billing['city'],
-                        'STATE' => tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']),
-                        'COUNTRY' => $order->billing['country']['iso_code_2'],
-                        'ZIP' => $order->billing['postcode'],
-                        'CLIENTIP' => tep_get_ip_address(),
-                        'EMAIL' => $order->customer['email_address'],
-                        'ACCT' => $HTTP_POST_VARS['cc_number_nh-dns'],
-                        'ACCTTYPE' => $HTTP_POST_VARS['cc_type'],
-                        'CARDSTART' => $HTTP_POST_VARS['cc_starts_month'] . $HTTP_POST_VARS['cc_starts_year'],
-                        'EXPDATE' => $HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'],
-                        'CVV2' => $HTTP_POST_VARS['cc_cvc_nh-dns'],
-                        'BUTTONSOURCE' => 'osCommerce22_Default_PRO2DP');
-
-        if ( ($HTTP_POST_VARS['cc_type'] == '9') || ($HTTP_POST_VARS['cc_type'] == 'S') ) {
-          $params['CARDISSUE'] = $HTTP_POST_VARS['cc_issue_nh-dns'];
-        }
-
-        if (is_numeric($sendto) && ($sendto > 0)) {
-          $params['SHIPTOFIRSTNAME'] = $order->delivery['firstname'];
-          $params['SHIPTOLASTNAME'] = $order->delivery['lastname'];
-          $params['SHIPTOSTREET'] = $order->delivery['street_address'];
-          $params['SHIPTOCITY'] = $order->delivery['city'];
-          $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
-          $params['SHIPTOCOUNTRY'] = $order->delivery['country']['iso_code_2'];
-          $params['SHIPTOZIP'] = $order->delivery['postcode'];
-        }
-
-        $post_string = '';
-
-        foreach ($params as $key => $value) {
-          $post_string .= $key . '[' . strlen(trim($value)) . ']=' . trim($value) . '&';
-        }
-
-        $post_string = substr($post_string, 0, -1);
-
-        $response = $this->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
-        $response_array = array();
-        parse_str($response, $response_array);
-
-        if ($response_array['RESULT'] != '0') {
-          switch ($response_array['RESULT']) {
-            case '1':
-            case '26':
-              $error_message = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_CFG_ERROR;
-              break;
-
-            case '7':
-              $error_message = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ADDRESS;
-              break;
-
-            case '12':
-              $error_message = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_DECLINED;
-              break;
-
-            case '23':
-            case '24':
-              $error_message = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_INVALID_CREDIT_CARD;
-              break;
-
-            default:
-              $error_message = MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_GENERAL;
-              break;
-          }
-
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . urlencode($error_message), 'SSL'));
-        }
-      } else {
-        tep_redirect(tep_href_link(FILENAME_CHECKOUT_CONFIRMATION, 'error_message=' . MODULE_PAYMENT_PAYPAL_UK_DIRECT_ERROR_ALL_FIELDS_REQUIRED, 'SSL'));
-      }
-    }
-
-    function after_process() {
-      return false;
-    }
-
-    function get_error() {
-      return false;
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Direct (UK)', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_STATUS', 'False', 'Do you want to accept PayPal Direct (UK) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_VENDOR', '', 'Your merchant login ID that you created when you registered for the Website Payments Pro account.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_USERNAME', '', 'If you set up one or more additional users on the account, this value is the ID of the user authorised to process transactions. If, however, you have not set up additional users on the account, USER has the same value as VENDOR.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_PASSWORD', '', 'The 6- to 32-character password that you defined while registering for the account.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Partner', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_PARTNER', 'PayPalUK', 'The ID provided to you by the authorised PayPal Reseller who registered you for the Payflow SDK. If you purchased your account directly from PayPal, use PayPalUK.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
-   }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_PAYPAL_UK_DIRECT_STATUS', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_VENDOR', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_USERNAME', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_PASSWORD', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_PARTNER', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_ZONE', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_UK_DIRECT_CURL');
-    }
-
-    function sendTransactionToGateway($url, $parameters, $headers = null) {
-      $header = array();
-
-      $server = parse_url($url);
-
-      if (!isset($server['port'])) {
-        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
-      }
-
-      if (!isset($server['path'])) {
-        $server['path'] = '/';
-      }
-
-      if (isset($server['user']) && isset($server['pass'])) {
-        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
-      }
-
-      if (!empty($headers) && is_array($headers)) {
-        $header = array_merge($header, $headers);
-      }
-
-      if (function_exists('curl_init')) {
-        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
-        curl_setopt($curl, CURLOPT_PORT, $server['port']);
-        curl_setopt($curl, CURLOPT_HEADER, 0);
-        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
-        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
-        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
-        curl_setopt($curl, CURLOPT_POST, 1);
-        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
-
-        if (!empty($header)) {
-          curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
-        }
-
-        $result = curl_exec($curl);
-
-        curl_close($curl);
-      } else {
-        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_UK_DIRECT_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k' . (!empty($header) ? ' -H ' . escapeshellarg(implode("\r\n", $header)) : ''), $result);
-        $result = implode("\n", $result);
-      }
-
-      return $result;
-    }
-
-// format prices without currency formatting
-    function format_raw($number, $currency_code = '', $currency_value = '') {
-      global $currencies, $currency;
-
-      if (empty($currency_code) || !$this->is_set($currency_code)) {
-        $currency_code = $currency;
-      }
-
-      if (empty($currency_value) || !is_numeric($currency_value)) {
-        $currency_value = $currencies->currencies[$currency_code]['value'];
-      }
-
-      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypal_uk_express.php 2.3.1.src/includes/modules/payment/paypal_uk_express.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypal_uk_express.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypal_uk_express.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,289 +0,0 @@
-<?php
-/*
-  $Id: paypal_uk_express.php 1803 2008-01-11 18:16:37Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class paypal_uk_express {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function paypal_uk_express() {
-      global $order;
-
-      $this->signature = 'paypal|paypal_uk_express|1.0|2.2';
-
-      $this->code = 'paypal_uk_express';
-      $this->title = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_TITLE;
-      $this->public_title = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_PUBLIC_TITLE;
-      $this->description = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_PAYPAL_UK_EXPRESS_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function checkout_initialization_method() {
-      global $language;
-
-      if (file_exists(DIR_FS_CATALOG . 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif')) {
-        $image = 'ext/modules/payment/paypal/images/btn_express_' . basename($language) . '.gif';
-      } else {
-        $image = 'ext/modules/payment/paypal/images/btn_express.gif';
-      }
-
-      $string = '<a href="' . tep_href_link('ext/modules/payment/paypal/express_uk.php', '', 'SSL') . '"><img src="' . $image . '" border="0" alt="" title="' . tep_output_string_protected(MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_BUTTON) . '" /></a>';
-
-      return $string;
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      return array('id' => $this->code,
-                   'module' => $this->public_title);
-    }
-
-    function pre_confirmation_check() {
-      if (!tep_session_is_registered('ppeuk_token')) {
-        tep_redirect(tep_href_link('ext/modules/payment/paypal/express_uk.php', '', 'SSL'));
-      }
-    }
-
-    function confirmation() {
-      global $comments;
-
-      if (!isset($comments)) {
-        $comments = null;
-      }
-
-      $confirmation = false;
-
-      if (empty($comments)) {
-        $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TEXT_COMMENTS,
-                                                      'field' => tep_draw_textarea_field('ppecomments', 'soft', '60', '5', $comments))));
-      }
-
-      return $confirmation;
-    }
-
-    function process_button() {
-      return false;
-    }
-
-    function before_process() {
-      global $order, $sendto, $ppeuk_token, $ppeuk_payerid, $HTTP_POST_VARS, $comments;
-
-      if (empty($comments)) {
-        if (isset($HTTP_POST_VARS['ppecomments']) && tep_not_null($HTTP_POST_VARS['ppecomments'])) {
-          $comments = tep_db_prepare_input($HTTP_POST_VARS['ppecomments']);
-
-          $order->info['comments'] = $comments;
-        }
-      }
-
-      if (MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_SERVER == 'Live') {
-        $api_url = 'https://payflowpro.verisign.com/transaction';
-      } else {
-        $api_url = 'https://pilot-payflowpro.verisign.com/transaction';
-      }
-
-      $params = array('USER' => (tep_not_null(MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME) ? MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME : MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR),
-                      'VENDOR' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR,
-                      'PARTNER' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PARTNER,
-                      'PWD' => MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PASSWORD,
-                      'TENDER' => 'P',
-                      'TRXTYPE' => ((MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_METHOD == 'Sale') ? 'S' : 'A'),
-                      'EMAIL' => $order->customer['email_address'],
-                      'TOKEN' => $ppeuk_token,
-                      'ACTION' => 'D',
-                      'PAYERID' => $ppeuk_payerid,
-                      'AMT' => $this->format_raw($order->info['total']),
-                      'CURRENCY' => $order->info['currency'],
-                      'BUTTONSOURCE' => 'osCommerce22_Default_PRO2EC');
-
-      if (is_numeric($sendto) && ($sendto > 0)) {
-        $params['SHIPTOSTREET'] = $order->delivery['street_address'];
-        $params['SHIPTOCITY'] = $order->delivery['city'];
-        $params['SHIPTOSTATE'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
-        $params['SHIPTOCOUNTRY'] = $order->delivery['country']['iso_code_2'];
-        $params['SHIPTOZIP'] = $order->delivery['postcode'];
-      }
-
-      $post_string = '';
-
-      foreach ($params as $key => $value) {
-        $post_string .= $key . '[' . strlen(trim($value)) . ']=' . trim($value) . '&';
-      }
-
-      $post_string = substr($post_string, 0, -1);
-
-      $response = $this->sendTransactionToGateway($api_url, $post_string, array('X-VPS-REQUEST-ID: ' . md5($cartID . tep_session_id() . rand())));
-      $response_array = array();
-      parse_str($response, $response_array);
-
-      if ($response_array['RESULT'] != '0') {
-        switch ($response_array['RESULT']) {
-          case '1':
-          case '26':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_CFG_ERROR;
-            break;
-
-          case '7':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_ADDRESS;
-            break;
-
-          case '12':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_DECLINED;
-            break;
-
-          case '1000':
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_EXPRESS_DISABLED;
-            break;
-
-          default:
-            $error_message = MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ERROR_GENERAL;
-            break;
-        }
-
-        tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, 'error_message=' . urlencode($error_message), 'SSL'));
-      }
-    }
-
-    function after_process() {
-      tep_session_unregister('ppeuk_token');
-      tep_session_unregister('ppeuk_payerid');
-    }
-
-    function get_error() {
-      return false;
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPal Express Checkout (UK)', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_STATUS', 'False', 'Do you want to accept PayPal Express Checkout (UK) payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR', '', 'Your merchant login ID that you created when you registered for the Website Payments Pro account.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('User', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME', '', 'If you set up one or more additional users on the account, this value is the ID of the user authorised to process transactions. If, however, you have not set up additional users on the account, USER has the same value as VENDOR.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Password', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PASSWORD', '', 'The 6- to 32-character password that you defined while registering for the account.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Partner', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PARTNER', 'PayPalUK', 'The ID provided to you by the authorised PayPal Reseller who registered you for the Payflow SDK. If you purchased your account directly from PayPal, use PayPalUK.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_SERVER', 'Live', 'Use the live or testing (sandbox) gateway server to process transactions?', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Sandbox\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_METHOD', 'Sale', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authorization\', \'Sale\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
-   }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_PAYPAL_UK_EXPRESS_STATUS', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_VENDOR', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_USERNAME', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PASSWORD', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_PARTNER', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_SERVER', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_TRANSACTION_METHOD', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ZONE', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_UK_EXPRESS_CURL');
-    }
-
-    function sendTransactionToGateway($url, $parameters, $headers = null) {
-      $header = array();
-
-      $server = parse_url($url);
-
-      if (!isset($server['port'])) {
-        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
-      }
-
-      if (!isset($server['path'])) {
-        $server['path'] = '/';
-      }
-
-      if (isset($server['user']) && isset($server['pass'])) {
-        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
-      }
-
-      if (!empty($headers) && is_array($headers)) {
-        $header = array_merge($header, $headers);
-      }
-
-      if (function_exists('curl_init')) {
-        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
-        curl_setopt($curl, CURLOPT_PORT, $server['port']);
-        curl_setopt($curl, CURLOPT_HEADER, 0);
-        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
-        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
-        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
-        curl_setopt($curl, CURLOPT_POST, 1);
-        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
-
-        if (!empty($header)) {
-          curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
-        }
-
-        $result = curl_exec($curl);
-
-        curl_close($curl);
-      } else {
-        exec(escapeshellarg(MODULE_PAYMENT_PAYPAL_UK_EXPRESS_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k' . (!empty($header) ? ' -H ' . escapeshellarg(implode("\r\n", $header)) : ''), $result);
-        $result = implode("\n", $result);
-      }
-
-      return $result;
-    }
-
-// format prices without currency formatting
-    function format_raw($number, $currency_code = '', $currency_value = '') {
-      global $currencies, $currency;
-
-      if (empty($currency_code) || !$this->is_set($currency_code)) {
-        $currency_code = $currency;
-      }
-
-      if (empty($currency_value) || !is_numeric($currency_value)) {
-        $currency_value = $currencies->currencies[$currency_code]['value'];
-      }
-
-      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/paypoint_secpay.php 2.3.1.src/includes/modules/payment/paypoint_secpay.php
--- 2.2rc2a.cp.src/includes/modules/payment/paypoint_secpay.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/paypoint_secpay.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,209 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class paypoint_secpay {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function paypoint_secpay() {
+      global $order;
+
+      $this->signature = 'paypoint|paypoint_secpay|1.0|2.3';
+
+      $this->code = 'paypoint_secpay';
+      $this->title = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_PAYPOINT_SECPAY_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_PAYPOINT_SECPAY_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_PAYPOINT_SECPAY_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_PAYPOINT_SECPAY_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      $this->form_action_url = 'https://www.secpay.com/java-bin/ValCard';
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPOINT_SECPAY_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPOINT_SECPAY_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      return false;
+    }
+
+    function process_button() {
+      global $order, $currencies, $currency;
+
+      switch (MODULE_PAYMENT_PAYPOINT_SECPAY_CURRENCY) {
+        case 'Default Currency':
+          $sec_currency = DEFAULT_CURRENCY;
+          break;
+        case 'Any Currency':
+        default:
+          $sec_currency = $currency;
+          break;
+      }
+
+      switch (MODULE_PAYMENT_PAYPOINT_SECPAY_TEST_STATUS) {
+        case 'Always Fail':
+          $test_status = 'false';
+          break;
+        case 'Production':
+          $test_status = 'live';
+          break;
+        case 'Always Successful':
+        default:
+          $test_status = 'true';
+          break;
+      }
+
+// Calculate the digest to send to SECPAY
+
+      $digest_string = STORE_NAME . date('Ymdhis') . number_format($order->info['total'] * $currencies->get_value($sec_currency), $currencies->currencies[$sec_currency]['decimal_places'], '.', '') . MODULE_PAYMENT_PAYPOINT_SECPAY_REMOTE;
+
+// There is a bug in the digest code, if there are any spaces in the trans id ( usually in the STORE_NAME
+// SECPay will replace these with an _ and the hash is calculated of that so need to do a search and replace
+// in the digest_string for spaces and replace with _
+      $digest_string = str_replace(' ', '_', $digest_string);
+
+      $digest = md5($digest_string);
+
+// Incase this gets 'fixed' at the SECPay end do a search and replace on the trans_id too
+      $trans_id_string = STORE_NAME . date('Ymdhis');
+      $trans_id = str_replace(' ', '_', $trans_id_string);
+
+      $process_button_string = tep_draw_hidden_field('merchant', MODULE_PAYMENT_PAYPOINT_SECPAY_MERCHANT_ID) .
+                               tep_draw_hidden_field('trans_id', $trans_id) .
+                               tep_draw_hidden_field('amount', number_format($order->info['total'] * $currencies->get_value($sec_currency), $currencies->currencies[$sec_currency]['decimal_places'], '.', '')) .
+                               tep_draw_hidden_field('bill_name', $order->billing['firstname'] . ' ' . $order->billing['lastname']) .
+                               tep_draw_hidden_field('bill_addr_1', $order->billing['street_address']) .
+                               tep_draw_hidden_field('bill_addr_2', $order->billing['suburb']) .
+                               tep_draw_hidden_field('bill_city', $order->billing['city']) .
+                               tep_draw_hidden_field('bill_state', $order->billing['state']) .
+                               tep_draw_hidden_field('bill_post_code', $order->billing['postcode']) .
+                               tep_draw_hidden_field('bill_country', $order->billing['country']['title']) .
+                               tep_draw_hidden_field('bill_tel', $order->customer['telephone']) .
+                               tep_draw_hidden_field('bill_email', $order->customer['email_address']) .
+                               tep_draw_hidden_field('ship_name', $order->delivery['firstname'] . ' ' . $order->delivery['lastname']) .
+                               tep_draw_hidden_field('ship_addr_1', $order->delivery['street_address']) .
+                               tep_draw_hidden_field('ship_addr_2', $order->delivery['suburb']) .
+                               tep_draw_hidden_field('ship_city', $order->delivery['city']) .
+                               tep_draw_hidden_field('ship_state', $order->delivery['state']) .
+                               tep_draw_hidden_field('ship_post_code', $order->delivery['postcode']) .
+                               tep_draw_hidden_field('ship_country', $order->delivery['country']['title']) .
+                               tep_draw_hidden_field('currency', $sec_currency) .
+                               tep_draw_hidden_field('callback', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', false) . ';' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', false)) .
+                               tep_draw_hidden_field(tep_session_name(), tep_session_id()) .
+                               tep_draw_hidden_field('options', 'test_status=' . $test_status . ',dups=false,cb_flds=' . tep_session_name()) .
+                               tep_draw_hidden_field('digest', $digest);
+
+      return $process_button_string;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_SERVER_VARS;
+
+      if ( ($HTTP_GET_VARS['valid'] == 'true') && ($HTTP_GET_VARS['code'] == 'A') && !empty($HTTP_GET_VARS['auth_code']) && empty($HTTP_GET_VARS['resp_code']) && !empty($HTTP_GET_VARS[tep_session_name()]) ) {
+        $DIGEST_PASSWORD = MODULE_PAYMENT_PAYPOINT_SECPAY_READERS_DIGEST;
+        list($REQUEST_URI, $CHECK_SUM) = split('hash=', $HTTP_SERVER_VARS['REQUEST_URI']);
+
+        if ($HTTP_GET_VARS['hash'] != md5($REQUEST_URI . $DIGEST_PASSWORD)) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, tep_session_name() . '=' . $HTTP_GET_VARS[tep_session_name()] . '&payment_error=' . $this->code ."&detail=hash", 'SSL', false, false));
+        }
+      } else {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, tep_session_name() . '=' . $HTTP_GET_VARS[tep_session_name()] . '&payment_error=' . $this->code, 'SSL', false, false));
+      }
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      if ($HTTP_GET_VARS['code'] == 'N') {
+        $error = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE_N;
+      } elseif ($HTTP_GET_VARS['code'] == 'C') {
+        $error = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE_C;
+      } else {
+        $error = MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR_MESSAGE;
+      }
+
+      return array('title' => MODULE_PAYMENT_PAYPOINT_SECPAY_TEXT_ERROR,
+                   'error' => $error);
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPOINT_SECPAY_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable PayPoint.net SECPay Module', 'MODULE_PAYMENT_PAYPOINT_SECPAY_STATUS', 'False', 'Do you want to accept PayPoint.net SECPay payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Merchant ID', 'MODULE_PAYMENT_PAYPOINT_SECPAY_MERCHANT_ID', 'secpay', 'Merchant ID to use for the SECPay service', '6', '2', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Currency', 'MODULE_PAYMENT_PAYPOINT_SECPAY_CURRENCY', 'Any Currency', 'The currency to use for credit card transactions', '6', '3', 'tep_cfg_select_option(array(\'Any Currency\', \'Default Currency\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_PAYPOINT_SECPAY_TEST_STATUS', 'Always Successful', 'Transaction mode to use for the PayPoint.net SECPay service', '6', '4', 'tep_cfg_select_option(array(\'Always Successful\', \'Always Fail\', \'Production\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_PAYPOINT_SECPAY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_PAYPOINT_SECPAY_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_PAYPOINT_SECPAY_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Remote Password', 'MODULE_PAYMENT_PAYPOINT_SECPAY_REMOTE', 'secpay', 'The Remote Password needs to be created in the PayPoint extranet.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Digest Key', 'MODULE_PAYMENT_PAYPOINT_SECPAY_READERS_DIGEST', 'secpay', 'The Digest Key needs to be created in the PayPoint extranet.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_PAYPOINT_SECPAY_STATUS', 'MODULE_PAYMENT_PAYPOINT_SECPAY_MERCHANT_ID', 'MODULE_PAYMENT_PAYPOINT_SECPAY_REMOTE', 'MODULE_PAYMENT_PAYPOINT_SECPAY_READERS_DIGEST', 'MODULE_PAYMENT_PAYPOINT_SECPAY_CURRENCY', 'MODULE_PAYMENT_PAYPOINT_SECPAY_TEST_STATUS', 'MODULE_PAYMENT_PAYPOINT_SECPAY_ZONE', 'MODULE_PAYMENT_PAYPOINT_SECPAY_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPOINT_SECPAY_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/pm2checkout.php 2.3.1.src/includes/modules/payment/pm2checkout.php
--- 2.2rc2a.cp.src/includes/modules/payment/pm2checkout.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/pm2checkout.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: pm2checkout.php 1813 2008-01-13 12:53:40Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -17,7 +17,7 @@
     function pm2checkout() {
       global $order;
 
-      $this->signature = '2checkout|pm2checkout|1.1|2.2';
+      $this->signature = '2checkout|pm2checkout|1.2|2.2';
 
       $this->code = 'pm2checkout';
       $this->title = MODULE_PAYMENT_2CHECKOUT_TEXT_TITLE;
@@ -68,7 +68,9 @@
     }
 
     function pre_confirmation_check() {
-      return false;
+      if (MODULE_PAYMENT_2CHECKOUT_ROUTINE == 'Single-Page') {
+        $this->form_action_url = 'https://www.2checkout.com/checkout/spurchase';
+      }
     }
 
     function confirmation() {
@@ -76,13 +78,14 @@
     }
 
     function process_button() {
-      global $HTTP_POST_VARS, $currencies, $currency, $order, $languages_id;
+      global $HTTP_POST_VARS, $customer_id, $currencies, $currency, $order, $languages_id, $cartID;
 
       $process_button_string = tep_draw_hidden_field('sid', MODULE_PAYMENT_2CHECKOUT_LOGIN) .
-                               tep_draw_hidden_field('total', number_format($order->info['total'], 2)) .
-                               tep_draw_hidden_field('cart_order_id', date('YmdHis')) .
+                               tep_draw_hidden_field('total', $this->format_raw($order->info['total'], MODULE_PAYMENT_2CHECKOUT_CURRENCY)) .
+                               tep_draw_hidden_field('cart_order_id', date('YmdHis') . '-' . $customer_id . '-' . $cartID) .
                                tep_draw_hidden_field('fixed', 'Y') .
-                               tep_draw_hidden_field('card_holder_name', $order->billing['firstname'] . ' ' . $order->billing['lastname']) .
+                               tep_draw_hidden_field('first_name', $order->billing['firstname']) .
+                               tep_draw_hidden_field('last_name', $order->billing['lastname']) .
                                tep_draw_hidden_field('street_address', $order->billing['street_address']) .
                                tep_draw_hidden_field('city', $order->billing['city']) .
                                tep_draw_hidden_field('state', $order->billing['state']) .
@@ -90,6 +93,7 @@
                                tep_draw_hidden_field('country', $order->billing['country']['title']) .
                                tep_draw_hidden_field('email', $order->customer['email_address']) .
                                tep_draw_hidden_field('phone', $order->customer['telephone']) .
+                               tep_draw_hidden_field('ship_name', $order->delivery['firstname'] . ' ' . $order->delivery['lastname']) .
                                tep_draw_hidden_field('ship_street_address', $order->delivery['street_address']) .
                                tep_draw_hidden_field('ship_city', $order->delivery['city']) .
                                tep_draw_hidden_field('ship_state', $order->delivery['state']) .
@@ -100,10 +104,11 @@
         $process_button_string .= tep_draw_hidden_field('c_prod_' . ($i+1), (int)$order->products[$i]['id'] . ',' . (int)$order->products[$i]['qty']) .
                                   tep_draw_hidden_field('c_name_' . ($i+1), $order->products[$i]['name']) .
                                   tep_draw_hidden_field('c_description_' . ($i+1), $order->products[$i]['name']) .
-                                  tep_draw_hidden_field('c_price_' . ($i+1), tep_round(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), $currencies->currencies[$currency]['decimal_places']));
+                                  tep_draw_hidden_field('c_price_' . ($i+1), $this->format_raw(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), MODULE_PAYMENT_2CHECKOUT_CURRENCY));
       }
 
-      $process_button_string .= tep_draw_hidden_field('id_type', '1');
+      $process_button_string .= tep_draw_hidden_field('id_type', '1') .
+                                tep_draw_hidden_field('skip_landing', '1');
 
       if (MODULE_PAYMENT_2CHECKOUT_TESTMODE == 'Test') {
         $process_button_string .= tep_draw_hidden_field('demo', 'Y');
@@ -129,8 +134,8 @@
     function before_process() {
       global $HTTP_POST_VARS;
 
-      if ($HTTP_POST_VARS['credit_card_processed'] != 'Y') {
-        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'error_message=' . urlencode(MODULE_PAYMENT_2CHECKOUT_TEXT_ERROR_MESSAGE), 'SSL', true, false));
+      if ( ($HTTP_POST_VARS['credit_card_processed'] != 'Y') && ($HTTP_POST_VARS['credit_card_processed'] != 'K') ){
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', true, false));
       }
     }
 
@@ -147,8 +152,9 @@
         tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
       }
 
+// The KEY value returned from the gateway is intentionally broken for Test transactions so it is only checked in Production mode
       if (tep_not_null(MODULE_PAYMENT_2CHECKOUT_SECRET_WORD) && (MODULE_PAYMENT_2CHECKOUT_TESTMODE == 'Production')) {
-        if (md5(MODULE_PAYMENT_2CHECKOUT_SECRET_WORD . MODULE_PAYMENT_2CHECKOUT_LOGIN . $HTTP_POST_VARS['order_number'] . number_format($order->info['total'], 2)) != $HTTP_POST_VARS['key']) {
+        if (strtoupper(md5(MODULE_PAYMENT_2CHECKOUT_SECRET_WORD . MODULE_PAYMENT_2CHECKOUT_LOGIN . $HTTP_POST_VARS['order_number'] . $this->order_format($order->info['total'], MODULE_PAYMENT_2CHECKOUT_CURRENCY))) != strtoupper($HTTP_POST_VARS['key'])) {
           $sql_data_array = array('orders_id' => (int)$insert_id, 
                                   'orders_status_id' => (int)$order->info['order_status'], 
                                   'date_added' => 'now()', 
@@ -161,7 +167,10 @@
     }
 
     function get_error() {
-      return false;
+      $error = array('title' => '',
+                     'error' => MODULE_PAYMENT_2CHECKOUT_TEXT_ERROR_MESSAGE);
+
+      return $error;
     }
 
     function check() {
@@ -173,13 +182,15 @@
     }
 
     function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable 2CheckOut', 'MODULE_PAYMENT_2CHECKOUT_STATUS', 'False', 'Do you want to accept 2CheckOut payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Seller ID', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', '', 'Seller ID used for the 2CheckOut service', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'Test', 'Transaction mode used for the 2Checkout service', '6', '0', 'tep_cfg_select_option(array(\'Test\', \'Production\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Word', 'MODULE_PAYMENT_2CHECKOUT_SECRET_WORD', '', 'The secret word to confirm transactions with (must be the same as defined on the merchat account configuration page', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER', '0', 'Sort order of display (lowest is displayed first)', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_2CHECKOUT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable 2Checkout', 'MODULE_PAYMENT_2CHECKOUT_STATUS', 'False', 'Do you want to accept 2CheckOut payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor Account', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', '', 'The vendor account number for the 2Checkout gateway.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'Test', 'Transaction mode used for the 2Checkout gateway.', '6', '0', 'tep_cfg_select_option(array(\'Test\', \'Production\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Secret Word', 'MODULE_PAYMENT_2CHECKOUT_SECRET_WORD', '', 'The secret word to confirm transactions with. (Must be the same as defined on the Vendor Admin interface)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Payment Routine', 'MODULE_PAYMENT_2CHECKOUT_ROUTINE', 'Multi-Page', 'The payment routine to use on the 2Checkout gateway.', '6', '0', 'tep_cfg_select_option(array(\'Multi-Page\', \'Single-Page\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Processing Currency', 'MODULE_PAYMENT_2CHECKOUT_CURRENCY', '" . DEFAULT_CURRENCY . "', 'The currency to process transactions in. (Must be the same as defined on the Vendor Admin interface)', '6', '0', 'pm2checkout::getCurrencies(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER', '0', 'Sort order of display. (Lowest is displayed first)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_2CHECKOUT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value.', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
     }
 
     function remove() {
@@ -187,7 +198,36 @@
     }
 
     function keys() {
-      return array('MODULE_PAYMENT_2CHECKOUT_STATUS', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'MODULE_PAYMENT_2CHECKOUT_SECRET_WORD', 'MODULE_PAYMENT_2CHECKOUT_ZONE', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER');
+      return array('MODULE_PAYMENT_2CHECKOUT_STATUS', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'MODULE_PAYMENT_2CHECKOUT_SECRET_WORD', 'MODULE_PAYMENT_2CHECKOUT_ROUTINE', 'MODULE_PAYMENT_2CHECKOUT_CURRENCY', 'MODULE_PAYMENT_2CHECKOUT_ZONE', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function getCurrencies($value, $key = '') {
+      $name = (($key) ? 'configuration[' . $key . ']' : 'configuration_value');
+
+      $currencies_array = array();
+
+      $currencies_query = tep_db_query("select code, title from " . TABLE_CURRENCIES . " order by title");
+      while ($currencies = tep_db_fetch_array($currencies_query)) {
+        $currencies_array[] = array('id' => $currencies['code'],
+                                    'text' => $currencies['title']);
+      }
+
+      return tep_draw_pull_down_menu($name, $currencies_array, $value);
     }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/psigate.php 2.3.1.src/includes/modules/payment/psigate.php
--- 2.2rc2a.cp.src/includes/modules/payment/psigate.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/psigate.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: psigate.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/rbsworldpay_hosted.php 2.3.1.src/includes/modules/payment/rbsworldpay_hosted.php
--- 2.2rc2a.cp.src/includes/modules/payment/rbsworldpay_hosted.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/rbsworldpay_hosted.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,580 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class rbsworldpay_hosted {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function rbsworldpay_hosted() {
+      global $order;
+
+      $this->signature = 'rbs|worldpay_hosted|1.0|2.2';
+
+      $this->code = 'rbsworldpay_hosted';
+      $this->title = MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_RBSWORLDPAY_HOSTED_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_RBSWORLDPAY_HOSTED_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      if (defined('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE') && (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE == 'True')) {
+        $this->form_action_url = 'https://select-test.wp3.rbsworldpay.com/wcc/purchase';
+      } else {
+        $this->form_action_url = 'https://select.wp3.rbsworldpay.com/wcc/purchase';
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      global $cart_RBS_Worldpay_Hosted_ID;
+
+      if (tep_session_is_registered('cart_RBS_Worldpay_Hosted_ID')) {
+        $order_id = substr($cart_RBS_Worldpay_Hosted_ID, strpos($cart_RBS_Worldpay_Hosted_ID, '-')+1);
+
+        $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
+
+        if (tep_db_num_rows($check_query) < 1) {
+          tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
+          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
+
+          tep_session_unregister('cart_RBS_Worldpay_Hosted_ID');
+        }
+      }
+
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      global $cartID, $cart;
+
+      if (empty($cart->cartID)) {
+        $cartID = $cart->cartID = $cart->generate_cart_id();
+      }
+
+      if (!tep_session_is_registered('cartID')) {
+        tep_session_register('cartID');
+      }
+    }
+
+    function confirmation() {
+      global $cartID, $cart_RBS_Worldpay_Hosted_ID, $customer_id, $languages_id, $order, $order_total_modules;
+
+      $insert_order = false;
+
+      if (tep_session_is_registered('cart_RBS_Worldpay_Hosted_ID')) {
+        $order_id = substr($cart_RBS_Worldpay_Hosted_ID, strpos($cart_RBS_Worldpay_Hosted_ID, '-')+1);
+
+        $curr_check = tep_db_query("select currency from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
+        $curr = tep_db_fetch_array($curr_check);
+
+        if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_RBS_Worldpay_Hosted_ID, 0, strlen($cartID))) ) {
+          $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
+
+          if (tep_db_num_rows($check_query) < 1) {
+            tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
+            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
+          }
+
+          $insert_order = true;
+        }
+      } else {
+        $insert_order = true;
+      }
+
+      if ($insert_order == true) {
+        $order_totals = array();
+        if (is_array($order_total_modules->modules)) {
+          reset($order_total_modules->modules);
+          while (list(, $value) = each($order_total_modules->modules)) {
+            $class = substr($value, 0, strrpos($value, '.'));
+            if ($GLOBALS[$class]->enabled) {
+              for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {
+                if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {
+                  $order_totals[] = array('code' => $GLOBALS[$class]->code,
+                                          'title' => $GLOBALS[$class]->output[$i]['title'],
+                                          'text' => $GLOBALS[$class]->output[$i]['text'],
+                                          'value' => $GLOBALS[$class]->output[$i]['value'],
+                                          'sort_order' => $GLOBALS[$class]->sort_order);
+                }
+              }
+            }
+          }
+        }
+
+        $sql_data_array = array('customers_id' => $customer_id,
+                                'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
+                                'customers_company' => $order->customer['company'],
+                                'customers_street_address' => $order->customer['street_address'],
+                                'customers_suburb' => $order->customer['suburb'],
+                                'customers_city' => $order->customer['city'],
+                                'customers_postcode' => $order->customer['postcode'],
+                                'customers_state' => $order->customer['state'],
+                                'customers_country' => $order->customer['country']['title'],
+                                'customers_telephone' => $order->customer['telephone'],
+                                'customers_email_address' => $order->customer['email_address'],
+                                'customers_address_format_id' => $order->customer['format_id'],
+                                'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
+                                'delivery_company' => $order->delivery['company'],
+                                'delivery_street_address' => $order->delivery['street_address'],
+                                'delivery_suburb' => $order->delivery['suburb'],
+                                'delivery_city' => $order->delivery['city'],
+                                'delivery_postcode' => $order->delivery['postcode'],
+                                'delivery_state' => $order->delivery['state'],
+                                'delivery_country' => $order->delivery['country']['title'],
+                                'delivery_address_format_id' => $order->delivery['format_id'],
+                                'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
+                                'billing_company' => $order->billing['company'],
+                                'billing_street_address' => $order->billing['street_address'],
+                                'billing_suburb' => $order->billing['suburb'],
+                                'billing_city' => $order->billing['city'],
+                                'billing_postcode' => $order->billing['postcode'],
+                                'billing_state' => $order->billing['state'],
+                                'billing_country' => $order->billing['country']['title'],
+                                'billing_address_format_id' => $order->billing['format_id'],
+                                'payment_method' => $order->info['payment_method'],
+                                'cc_type' => $order->info['cc_type'],
+                                'cc_owner' => $order->info['cc_owner'],
+                                'cc_number' => $order->info['cc_number'],
+                                'cc_expires' => $order->info['cc_expires'],
+                                'date_purchased' => 'now()',
+                                'orders_status' => $order->info['order_status'],
+                                'currency' => $order->info['currency'],
+                                'currency_value' => $order->info['currency_value']);
+
+        tep_db_perform(TABLE_ORDERS, $sql_data_array);
+
+        $insert_id = tep_db_insert_id();
+
+        for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
+          $sql_data_array = array('orders_id' => $insert_id,
+                                  'title' => $order_totals[$i]['title'],
+                                  'text' => $order_totals[$i]['text'],
+                                  'value' => $order_totals[$i]['value'],
+                                  'class' => $order_totals[$i]['code'],
+                                  'sort_order' => $order_totals[$i]['sort_order']);
+
+          tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
+        }
+
+        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+          $sql_data_array = array('orders_id' => $insert_id,
+                                  'products_id' => tep_get_prid($order->products[$i]['id']),
+                                  'products_model' => $order->products[$i]['model'],
+                                  'products_name' => $order->products[$i]['name'],
+                                  'products_price' => $order->products[$i]['price'],
+                                  'final_price' => $order->products[$i]['final_price'],
+                                  'products_tax' => $order->products[$i]['tax'],
+                                  'products_quantity' => $order->products[$i]['qty']);
+
+          tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
+
+          $order_products_id = tep_db_insert_id();
+
+          $attributes_exist = '0';
+          if (isset($order->products[$i]['attributes'])) {
+            $attributes_exist = '1';
+            for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
+              if (DOWNLOAD_ENABLED == 'true') {
+                $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                     from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                     left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                     on pa.products_attributes_id=pad.products_attributes_id
+                                     where pa.products_id = '" . $order->products[$i]['id'] . "'
+                                     and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
+                                     and pa.options_id = popt.products_options_id
+                                     and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
+                                     and pa.options_values_id = poval.products_options_values_id
+                                     and popt.language_id = '" . $languages_id . "'
+                                     and poval.language_id = '" . $languages_id . "'";
+                $attributes = tep_db_query($attributes_query);
+              } else {
+                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
+              }
+              $attributes_values = tep_db_fetch_array($attributes);
+
+              $sql_data_array = array('orders_id' => $insert_id,
+                                      'orders_products_id' => $order_products_id,
+                                      'products_options' => $attributes_values['products_options_name'],
+                                      'products_options_values' => $attributes_values['products_options_values_name'],
+                                      'options_values_price' => $attributes_values['options_values_price'],
+                                      'price_prefix' => $attributes_values['price_prefix']);
+
+              tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
+
+              if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
+                $sql_data_array = array('orders_id' => $insert_id,
+                                        'orders_products_id' => $order_products_id,
+                                        'orders_products_filename' => $attributes_values['products_attributes_filename'],
+                                        'download_maxdays' => $attributes_values['products_attributes_maxdays'],
+                                        'download_count' => $attributes_values['products_attributes_maxcount']);
+
+                tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
+              }
+            }
+          }
+        }
+
+        $cart_RBS_Worldpay_Hosted_ID = $cartID . '-' . $insert_id;
+        tep_session_register('cart_RBS_Worldpay_Hosted_ID');
+      }
+
+      return false;
+    }
+
+    function process_button() {
+      global $order, $currency, $languages_id, $language, $customer_id, $cart_RBS_Worldpay_Hosted_ID;
+
+      $order_id = substr($cart_RBS_Worldpay_Hosted_ID, strpos($cart_RBS_Worldpay_Hosted_ID, '-')+1);
+
+      $lang_query = tep_db_query("select code from " . TABLE_LANGUAGES . " where languages_id = '" . (int)$languages_id . "'");
+      $lang = tep_db_fetch_array($lang_query);
+
+      $process_button_string = tep_draw_hidden_field('instId', MODULE_PAYMENT_RBSWORLDPAY_HOSTED_INSTALLATION_ID) .
+                               tep_draw_hidden_field('cartId', $order_id) .
+                               tep_draw_hidden_field('amount', $this->format_raw($order->info['total'])) .
+                               tep_draw_hidden_field('currency', $currency) .
+                               tep_draw_hidden_field('address', $order->billing['street_address']) .
+                               tep_draw_hidden_field('country', $order->billing['country']['iso_code_2']) .
+                               tep_draw_hidden_field('desc', STORE_NAME) .
+                               tep_draw_hidden_field('name', $order->billing['firstname'] . ' ' . $order->billing['lastname']) .
+                               tep_draw_hidden_field('postcode', $order->billing['postcode']) .
+                               tep_draw_hidden_field('tel', $order->customer['telephone']) .
+                               tep_draw_hidden_field('email', $order->customer['email_address']) .
+                               tep_draw_hidden_field('fixContact', 'Y') .
+                               tep_draw_hidden_field('hideCurrency', 'true') .
+                               tep_draw_hidden_field('lang', strtoupper($lang['code'])) .
+                               tep_draw_hidden_field('signatureFields', 'amount:currency:cartId') .
+                               tep_draw_hidden_field('signature', md5(MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD . ':' . $this->format_raw($order->info['total']) . ':' . $currency . ':' . $order_id)) .
+                               tep_draw_hidden_field('MC_callback', substr(tep_href_link('ext/modules/payment/rbsworldpay/hosted_callback.php', '', 'NONSSL', false, false), strpos(tep_href_link('ext/modules/payment/rbsworldpay/hosted_callback.php', '', 'NONSSL', false, false), '://')+3));
+
+      if (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TRANSACTION_METHOD == 'Pre-Authorization') {
+        $process_button_string .= tep_draw_hidden_field('authMode', 'E');
+      }
+
+      if (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE == 'True') {
+        $process_button_string .= tep_draw_hidden_field('testMode', '100');
+      }
+
+      $process_button_string .= tep_draw_hidden_field('M_sid', tep_session_id()) .
+                                tep_draw_hidden_field('M_cid', $customer_id) .
+                                tep_draw_hidden_field('M_lang', $language) .
+                                tep_draw_hidden_field('M_hash', md5(tep_session_id() . $customer_id . $order_id . $language . number_format($order->info['total'], 2) . MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD));
+
+      return $process_button_string;
+    }
+
+    function before_process() {
+      global $customer_id, $language, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart, $cart_RBS_Worldpay_Hosted_ID;
+      global $$payment;
+
+      $order_id = substr($cart_RBS_Worldpay_Hosted_ID, strpos($cart_RBS_Worldpay_Hosted_ID, '-')+1);
+
+      $check_query = tep_db_query("select orders_status from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
+      if (tep_db_num_rows($check_query)) {
+        $check = tep_db_fetch_array($check_query);
+
+        if ($check['orders_status'] == MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID) {
+          $hash_result = false;
+
+          if (isset($HTTP_GET_VARS['hash']) && !empty($HTTP_GET_VARS['hash']) && ($HTTP_GET_VARS['hash'] == md5(tep_session_name() . $customer_id . $order_id . $language . number_format($order->info['total'], 2) . MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD))) {
+            $hash_result = true;
+          }
+
+          $sql_data_array = array('orders_id' => $order_id,
+                                  'orders_status_id' => MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID,
+                                  'date_added' => 'now()',
+                                  'customer_notified' => '0',
+                                  'comments' => (($hash_result == true) ? 'WorldPay: Transaction Verified' : 'WorldPay: Incorrect Transaction Hash'));
+
+          tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+
+          if (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE == 'True') {
+            $sql_data_array = array('orders_id' => $order_id,
+                                    'orders_status_id' => MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID,
+                                    'date_added' => 'now()',
+                                    'customer_notified' => '0',
+                                    'comments' => MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TEXT_WARNING_DEMO_MODE);
+
+            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+          }
+        }
+      }
+
+      tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID) . "', last_modified = now() where orders_id = '" . (int)$order_id . "'");
+
+      $sql_data_array = array('orders_id' => $order_id,
+                              'orders_status_id' => (MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID),
+                              'date_added' => 'now()',
+                              'customer_notified' => (SEND_EMAILS == 'true') ? '1' : '0',
+                              'comments' => $order->info['comments']);
+
+      tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
+
+// initialized for the email confirmation
+      $products_ordered = '';
+      $subtotal = 0;
+      $total_tax = 0;
+
+      for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+// Stock Update - Joao Correia
+        if (STOCK_LIMITED == 'true') {
+          if (DOWNLOAD_ENABLED == 'true') {
+            $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
+                                FROM " . TABLE_PRODUCTS . " p
+                                LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                ON p.products_id=pa.products_id
+                                LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                ON pa.products_attributes_id=pad.products_attributes_id
+                                WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
+// Will work with only one option for downloadable products
+// otherwise, we have to build the query dynamically with a loop
+            $products_attributes = $order->products[$i]['attributes'];
+            if (is_array($products_attributes)) {
+              $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
+            }
+            $stock_query = tep_db_query($stock_query_raw);
+          } else {
+            $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+          }
+          if (tep_db_num_rows($stock_query) > 0) {
+            $stock_values = tep_db_fetch_array($stock_query);
+// do not decrement quantities if products_attributes_filename exists
+            if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
+              $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
+            } else {
+              $stock_left = $stock_values['products_quantity'];
+            }
+            tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+            if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
+              tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+            }
+          }
+        }
+
+// Update products_ordered (for bestsellers list)
+        tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
+
+//------insert customer choosen option to order--------
+        $attributes_exist = '0';
+        $products_ordered_attributes = '';
+        if (isset($order->products[$i]['attributes'])) {
+          $attributes_exist = '1';
+          for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
+            if (DOWNLOAD_ENABLED == 'true') {
+              $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
+                                   from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
+                                   left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
+                                   on pa.products_attributes_id=pad.products_attributes_id
+                                   where pa.products_id = '" . $order->products[$i]['id'] . "'
+                                   and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
+                                   and pa.options_id = popt.products_options_id
+                                   and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
+                                   and pa.options_values_id = poval.products_options_values_id
+                                   and popt.language_id = '" . $languages_id . "'
+                                   and poval.language_id = '" . $languages_id . "'";
+              $attributes = tep_db_query($attributes_query);
+            } else {
+              $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
+            }
+            $attributes_values = tep_db_fetch_array($attributes);
+
+            $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
+          }
+        }
+//------insert customer choosen option eof ----
+        $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
+        $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
+        $total_cost += $total_products_price;
+
+        $products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";
+      }
+
+// lets start with the email confirmation
+      $email_order = STORE_NAME . "\n" .
+                     EMAIL_SEPARATOR . "\n" .
+                     EMAIL_TEXT_ORDER_NUMBER . ' ' . $order_id . "\n" .
+                     EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $order_id, 'SSL', false) . "\n" .
+                     EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
+      if ($order->info['comments']) {
+        $email_order .= tep_db_output($order->info['comments']) . "\n\n";
+      }
+      $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
+                      EMAIL_SEPARATOR . "\n" .
+                      $products_ordered .
+                      EMAIL_SEPARATOR . "\n";
+
+      for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
+        $email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
+      }
+
+      if ($order->content_type != 'virtual') {
+        $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
+                        EMAIL_SEPARATOR . "\n" .
+                        tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
+      }
+
+      $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
+                      EMAIL_SEPARATOR . "\n" .
+                      tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
+
+      if (is_object($$payment)) {
+        $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
+                        EMAIL_SEPARATOR . "\n";
+        $payment_class = $$payment;
+        $email_order .= $payment_class->title . "\n\n";
+        if ($payment_class->email_footer) {
+          $email_order .= $payment_class->email_footer . "\n\n";
+        }
+      }
+
+      tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+
+// send emails to other people
+      if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
+        tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
+      }
+
+// load the after_process function from the payment modules
+      $this->after_process();
+
+      $cart->reset(true);
+
+// unregister session variables used during checkout
+      tep_session_unregister('sendto');
+      tep_session_unregister('billto');
+      tep_session_unregister('shipping');
+      tep_session_unregister('payment');
+      tep_session_unregister('comments');
+
+      tep_session_unregister('cart_RBS_Worldpay_Hosted_ID');
+
+      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      return false;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Preparing [WorldPay]' limit 1");
+
+      if (tep_db_num_rows($check_query) < 1) {
+        $status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
+        $status = tep_db_fetch_array($status_query);
+
+        $status_id = $status['status_id']+1;
+
+        $languages = tep_get_languages();
+
+        for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
+          tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $status_id . "', '" . $languages[$i]['id'] . "', 'Preparing [WorldPay]')");
+        }
+
+        $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
+        if (tep_db_num_rows($flags_query) == 1) {
+          tep_db_query("update " . TABLE_ORDERS_STATUS . " set public_flag = 0 and downloads_flag = 0 where orders_status_id = '" . $status_id . "'");
+        }
+      } else {
+        $check = tep_db_fetch_array($check_query);
+
+        $status_id = $check['orders_status_id'];
+      }
+
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable RBS WorldPay Hosted', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_STATUS', 'False', 'Do you want to accept RBS WorldPay Hosted payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Installation ID', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_INSTALLATION_ID', '', 'Your WorldPay Installation ID', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Callback Password', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_CALLBACK_PASSWORD', '', 'A password that is sent back in the callback response (specified in the WorldPay Customer Management System)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MD5 Password', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD', '', 'The MD5 secret encryption password used to validate transaction responses with (specified in the WorldPay Customer Management System)', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TRANSACTION_METHOD', 'Capture', 'The processing method to use for each transaction', '6', '0', 'tep_cfg_select_option(array(\'Pre-Authorization\', \'Capture\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Test Mode', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE', 'True', 'Process transactions in test mode?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID', '" . (int)$status_id . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_RBSWORLDPAY_HOSTED_STATUS', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_INSTALLATION_ID', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_CALLBACK_PASSWORD', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_MD5_PASSWORD', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TRANSACTION_METHOD', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_TESTMODE', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ZONE', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_ORDER_STATUS_ID', 'MODULE_PAYMENT_RBSWORLDPAY_HOSTED_SORT_ORDER');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$this->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/sage_pay_direct.php 2.3.1.src/includes/modules/payment/sage_pay_direct.php
--- 2.2rc2a.cp.src/includes/modules/payment/sage_pay_direct.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/sage_pay_direct.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,625 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sage_pay_direct {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function sage_pay_direct() {
+      global $order;
+
+      $this->signature = 'sage_pay|sage_pay_direct|1.0|2.3';
+
+      $this->code = 'sage_pay_direct';
+      $this->title = MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_SAGE_PAY_DIRECT_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_SAGE_PAY_DIRECT_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_SAGE_PAY_DIRECT_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_SAGE_PAY_DIRECT_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_SAGE_PAY_DIRECT_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ($this->hasCards() == false) ) {
+        $this->enabled = false;
+      }
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SAGE_PAY_DIRECT_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAGE_PAY_DIRECT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      global $order;
+
+      $card_types = array();
+      foreach ($this->getCardTypes() as $key => $value) {
+        $card_types[] = array('id' => $key,
+                              'text' => $value);
+      }
+
+      $today = getdate(); 
+
+      $months_array = array();
+      for ($i=1; $i<13; $i++) {
+        $months_array[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B', mktime(0, 0, 0, $i, 1, 2000)));
+      }
+
+      $year_valid_to_array = array();
+      for ($i=$today['year']; $i < $today['year']+10; $i++) {
+        $year_valid_to_array[] = array('id' => strftime('%y', mktime(0, 0, 0, 1, 1, $i)), 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)));
+      }
+
+      $year_valid_from_array = array();
+      for ($i=$today['year']-4; $i < $today['year']+1; $i++) {
+        $year_valid_from_array[] = array('id' => strftime('%y', mktime(0, 0, 0, 1, 1, $i)), 'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)));
+      }
+
+      $confirmation = array('fields' => array(array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_TYPE,
+                                                    'field' => tep_draw_pull_down_menu('cc_type', $card_types)),
+                                              array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_OWNER,
+                                                    'field' => tep_draw_input_field('cc_owner', $order->billing['firstname'] . ' ' . $order->billing['lastname'], 'maxlength="50"')),
+                                              array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_NUMBER,
+                                                    'field' => tep_draw_input_field('cc_number_nh-dns', '', 'maxlength="20"'))));
+
+      if ( (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True') || (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True') || (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX == 'True') ) {
+        $confirmation['fields'][] = array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_STARTS,
+                                          'field' => tep_draw_pull_down_menu('cc_starts_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_starts_year', $year_valid_from_array) . '&nbsp;' . MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_STARTS_INFO);
+      }
+
+      $confirmation['fields'][] = array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_EXPIRES,
+                                        'field' => tep_draw_pull_down_menu('cc_expires_month', $months_array) . '&nbsp;' . tep_draw_pull_down_menu('cc_expires_year', $year_valid_to_array));
+
+      if ( (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True') || (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True') ) {
+        $confirmation['fields'][] = array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_ISSUE_NUMBER,
+                                          'field' => tep_draw_input_field('cc_issue_nh-dns', '', 'size="3" maxlength="2"') . '&nbsp;' . MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_ISSUE_NUMBER_INFO);
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_VERIFY_WITH_CVC == 'True') {
+        $confirmation['fields'][] = array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_CREDIT_CARD_CVC,
+                                          'field' => tep_draw_input_field('cc_cvc_nh-dns', '', 'size="5" maxlength="4"'));
+      }
+
+      return $confirmation;
+    }
+
+    function process_button() {
+      return false;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_POST_VARS, $customer_id, $order, $currency, $order_totals, $cartID;
+
+      $error = null;
+
+      if (isset($HTTP_GET_VARS['check']) && ($HTTP_GET_VARS['check'] == '3D') && isset($HTTP_POST_VARS['MD']) && tep_not_null($HTTP_POST_VARS['MD']) && isset($HTTP_POST_VARS['PaRes']) && tep_not_null($HTTP_POST_VARS['PaRes'])) {
+        switch (MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_SERVER) {
+          case 'Live':
+            $gateway_url = 'https://live.sagepay.com/gateway/service/direct3dcallback.vsp';
+            break;
+
+          case 'Test':
+            $gateway_url = 'https://test.sagepay.com/gateway/service/direct3dcallback.vsp';
+            break;
+
+          default:
+            $gateway_url = 'https://test.sagepay.com/Simulator/VSPDirectCallback.asp';
+            break;
+        }
+
+        $post_string = 'MD=' . $HTTP_POST_VARS['MD'] . '&PARes=' . $HTTP_POST_VARS['PaRes'];
+
+        $transaction_response = $this->sendTransactionToGateway($gateway_url, $post_string);
+      } else {
+        $cc_type = substr($HTTP_POST_VARS['cc_type'], 0, 15);
+        $cc_owner = substr($HTTP_POST_VARS['cc_owner'], 0, 50);
+        $cc_number = substr(preg_replace('/[^0-9]/', '', $HTTP_POST_VARS['cc_number_nh-dns']), 0, 20);
+        $cc_start = null;
+        $cc_expires = null;
+        $cc_issue = null;
+        $cc_cvc = null;
+
+        $today = getdate(); 
+
+        $months_array = array();
+        for ($i=1; $i<13; $i++) {
+          $months_array[] = sprintf('%02d', $i);
+        }
+
+        $year_valid_to_array = array();
+        for ($i=$today['year']; $i < $today['year']+10; $i++) {
+          $year_valid_to_array[] = strftime('%y',mktime(0,0,0,1,1,$i));
+        }
+
+        $year_valid_from_array = array();
+        for ($i=$today['year']-4; $i < $today['year']+1; $i++) {
+          $year_valid_from_array[] = strftime('%Y',mktime(0,0,0,1,1,$i));
+        }
+
+        if ( (isset($HTTP_POST_VARS['cc_type']) == false) || ($this->isCard($cc_type) == false) ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardtype', 'SSL'));
+        }
+
+        if ( (isset($HTTP_POST_VARS['cc_owner']) == false) || empty($cc_owner) ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardowner', 'SSL'));
+        }
+
+        if ( (isset($HTTP_POST_VARS['cc_number_nh-dns']) == false) || (is_numeric($cc_number) == false) ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardnumber', 'SSL'));
+        }
+
+        if ( (($cc_type == 'MAESTRO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True')) || (($cc_type == 'SOLO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True')) || (($cc_type == 'AMEX') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX == 'True')) ) {
+          if ( in_array($HTTP_POST_VARS['cc_starts_month'], $months_array) == false ) {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardstart', 'SSL'));
+          }
+
+          if ( in_array($HTTP_POST_VARS['cc_starts_year'], $year_valid_from_array) == false ) {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardstart', 'SSL'));
+          }
+
+          $cc_start = substr($HTTP_POST_VARS['cc_starts_month'] . $HTTP_POST_VARS['cc_starts_year'], 0, 4);
+        }
+
+        if ( in_array($HTTP_POST_VARS['cc_expires_month'], $months_array) == false ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardexpires', 'SSL'));
+        }
+
+        if ( in_array($HTTP_POST_VARS['cc_expires_year'], $year_valid_to_array) == false ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardexpires', 'SSL'));
+        }
+
+        if ( ($HTTP_POST_VARS['cc_expires_year'] == date('y')) && ($HTTP_POST_VARS['cc_expires_month'] < date('m')) ) {
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardexpires', 'SSL'));
+        }
+
+        $cc_expires = substr($HTTP_POST_VARS['cc_expires_month'] . $HTTP_POST_VARS['cc_expires_year'], 0, 4);
+
+        if ( (($cc_type == 'MAESTRO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True')) || (($cc_type == 'SOLO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True')) ) {
+          $cc_issue = substr($HTTP_POST_VARS['cc_issue_nh-dns'], 0, 2);
+
+          if ( (isset($HTTP_POST_VARS['cc_issue_nh-dns']) == false) || empty($cc_issue) ) {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardissue', 'SSL'));
+          }
+        }
+
+        if (MODULE_PAYMENT_SAGE_PAY_DIRECT_VERIFY_WITH_CVC == 'True') {
+          $cc_cvc = substr($HTTP_POST_VARS['cc_cvc_nh-dns'], 0, 4);
+
+          if ( (isset($HTTP_POST_VARS['cc_cvc_nh-dns']) == false) || empty($cc_cvc) ) {
+            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&error=cardcvc', 'SSL'));
+          }
+        }
+
+        $params = array('VPSProtocol' => '2.23',
+                        'ReferrerID' => 'C74D7B82-E9EB-4FBD-93DB-76F0F551C802',
+                        'Vendor' => substr(MODULE_PAYMENT_SAGE_PAY_DIRECT_VENDOR_LOGIN_NAME, 0, 15),
+                        'VendorTxCode' => substr(date('YmdHis') . '-' . $customer_id . '-' . $cartID, 0, 40),
+                        'Amount' => $this->format_raw($order->info['total']),
+                        'Currency' => $currency,
+                        'Description' => substr(STORE_NAME, 0, 100),
+                        'CardHolder' => $cc_owner,
+                        'CardNumber' => $cc_number,
+                        'ExpiryDate' => $cc_expires,
+                        'CardType' => $cc_type,
+                        'BillingSurname' => substr($order->billing['lastname'], 0, 20),
+                        'BillingFirstnames' => substr($order->billing['firstname'], 0, 20),
+                        'BillingAddress1' => substr($order->billing['street_address'], 0, 100),
+                        'BillingCity' => substr($order->billing['city'], 0, 40),
+                        'BillingPostCode' => substr($order->billing['postcode'], 0, 10),
+                        'BillingCountry' => $order->billing['country']['iso_code_2'],
+                        'BillingPhone' => substr($order->customer['telephone'], 0, 20),
+                        'DeliverySurname' => substr($order->delivery['lastname'], 0, 20),
+                        'DeliveryFirstnames' => substr($order->delivery['firstname'], 0, 20),
+                        'DeliveryAddress1' => substr($order->delivery['street_address'], 0, 100),
+                        'DeliveryCity' => substr($order->delivery['city'], 0, 40),
+                        'DeliveryPostCode' => substr($order->delivery['postcode'], 0, 10),
+                        'DeliveryCountry' => $order->delivery['country']['iso_code_2'],
+                        'CustomerName' => substr($order->billing['firstname'] . ' ' . $order->billing['lastname'], 0, 100),
+                        'DeliveryPhone' => substr($order->customer['telephone'], 0, 20),
+                        'CustomerEMail' => substr($order->customer['email_address'], 0, 255),
+                        'Apply3DSecure' => '0');
+
+        $ip_address = tep_get_ip_address();
+
+        if ( (ip2long($ip_address) != -1) && (ip2long($ip_address) != false) ) {
+          $params['ClientIPAddress']= $ip_address;
+        }
+
+        if ( MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_METHOD == 'Payment' ) {
+          $params['TxType'] = 'PAYMENT';
+        } elseif ( MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_METHOD == 'Deferred' ) {
+          $params['TxType'] = 'DEFERRED';
+        } else {
+          $params['TxType'] = 'AUTHENTICATE';
+        }
+
+        if ( (($cc_type == 'MAESTRO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True')) || (($cc_type == 'SOLO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True')) || (($cc_type == 'AMEX') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX == 'True')) ) {
+          $params['StartDate'] = $cc_start;
+        }
+
+        if ( (($cc_type == 'MAESTRO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True')) || (($cc_type == 'SOLO') && (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True')) ) {
+          $params['IssueNumber'] = $cc_issue;
+        }
+
+        if (MODULE_PAYMENT_SAGE_PAY_DIRECT_VERIFY_WITH_CVC == 'True') {
+          $params['CV2'] = $cc_cvc;
+        }
+
+        if ($params['BillingCountry'] == 'US') {
+          $params['BillingState'] = tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], '');
+        }
+
+        if ($params['DeliveryCountry'] == 'US') {
+          $params['DeliveryState'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], '');
+        }
+
+        $contents = array();
+
+        foreach ($order->products as $product) {
+          $product_name = $product['name'];
+
+          if (isset($product['attributes'])) {
+            foreach ($product['attributes'] as $att) {
+              $product_name .= '; ' . $att['option'] . '=' . $att['value'];
+            }
+          }
+
+          $contents[] = str_replace(array(':', "\n", "\r", '&'), '', $product_name) . ':' . $product['qty'] . ':' . $this->format_raw($product['final_price']) . ':' . $this->format_raw(($product['tax'] / 100) * $product['final_price']) . ':' . $this->format_raw((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) . ':' . $this->format_raw(((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) * $product['qty']);
+        }
+
+        foreach ($order_totals as $ot) {
+          $contents[] = str_replace(array(':', "\n", "\r", '&'), '', strip_tags($ot['title'])) . ':---:---:---:---:' . $this->format_raw($ot['value']);
+        }
+
+        $params['Basket'] = substr(sizeof($contents) . ':' . implode(':', $contents), 0, 7500);
+
+        $post_string = '';
+
+        foreach ($params as $key => $value) {
+          $post_string .= $key . '=' . urlencode(trim($value)) . '&';
+        }
+
+        switch (MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_SERVER) {
+          case 'Live':
+            $gateway_url = 'https://live.sagepay.com/gateway/service/vspdirect-register.vsp';
+            break;
+
+          case 'Test':
+            $gateway_url = 'https://test.sagepay.com/gateway/service/vspdirect-register.vsp';
+            break;
+
+          default:
+            $gateway_url = 'https://test.sagepay.com/Simulator/VSPDirectGateway.asp';
+            break;
+        }
+
+        $transaction_response = $this->sendTransactionToGateway($gateway_url, $post_string);
+      }
+
+      $string_array = explode(chr(10), $transaction_response);
+      $return = array();
+
+      foreach ($string_array as $string) {
+        if (strpos($string, '=') != false) {
+          $parts = explode('=', $string, 2);
+          $return[trim($parts[0])] = trim($parts[1]);
+        }
+      }
+
+      if ($return['Status'] == '3DAUTH') {
+        global $sage_pay_direct_acsurl, $sage_pay_direct_pareq, $sage_pay_direct_md;
+
+        tep_session_register('sage_pay_direct_acsurl');
+        $sage_pay_direct_acsurl = $return['ACSURL'];
+
+        tep_session_register('sage_pay_direct_pareq');
+        $sage_pay_direct_pareq = $return['PAReq'];
+
+        tep_session_register('sage_pay_direct_md');
+        $sage_pay_direct_md = $return['MD'];
+
+        tep_redirect(tep_href_link('ext/modules/payment/sage_pay/checkout.php', '', 'SSL'));
+      }
+
+      if ( ($return['Status'] != 'OK') && ($return['Status'] != 'AUTHENTICATED') && ($return['Status'] != 'REGISTERED') ) {
+        $error = $this->getErrorMessageNumber($return['StatusDetail']);
+
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : ''), 'SSL'));
+      }
+
+      if ( isset($return['VPSTxId']) ) {
+        $order->info['comments'] = 'Sage Pay Reference ID: ' . $return['VPSTxId'] . (tep_not_null($order->info['comments']) ? "\n\n" . $order->info['comments'] : '');
+      }
+    }
+
+    function after_process() {
+      if (tep_session_is_registered('sage_pay_direct_acsurl')) {
+        tep_session_unregister('sage_pay_direct_acsurl');
+        tep_session_unregister('sage_pay_direct_pareq');
+        tep_session_unregister('sage_pay_direct_md');
+      }
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_GENERAL;
+
+      if ( isset($HTTP_GET_VARS['error']) && tep_not_null($HTTP_GET_VARS['error']) ) {
+        if ( is_numeric($HTTP_GET_VARS['error']) && $this->errorMessageNumberExists($HTTP_GET_VARS['error']) ) {
+          $message = $this->getErrorMessage($HTTP_GET_VARS['error']) . ' ' . MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_GENERAL;
+        } else {
+          switch ($HTTP_GET_VARS['error']) {
+            case 'cardtype':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDTYPE;
+              break;
+
+            case 'cardowner':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDOWNER;
+              break;
+
+            case 'cardnumber':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDNUMBER;
+              break;
+
+            case 'cardstart':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDSTART;
+              break;
+
+            case 'cardexpires':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDEXPIRES;
+              break;
+
+            case 'cardissue':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDISSUE;
+              break;
+
+            case 'cardcvc':
+              $message = MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_CARDCVC;
+              break;
+          }
+        }
+      }
+
+      $error = array('title' => MODULE_PAYMENT_SAGE_PAY_DIRECT_ERROR_TITLE,
+                     'error' => $message);
+
+      return $error;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_SAGE_PAY_DIRECT_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Sage Pay Direct Module', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_STATUS', 'False', 'Do you want to accept Sage Pay Direct payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor Login Name', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_VENDOR_LOGIN_NAME', '', 'The vendor login name to connect to the gateway with.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Verify With CVC', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_VERIFY_WITH_CVC', 'True', 'Verify the credit card with the billing address with the Credit Card Verification Checknumber (CVC)?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_METHOD', 'Authenticate', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authenticate\', \'Deferred\', \'Payment\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_SERVER', 'Simulator', 'Perform transactions on the production server or on the testing server.', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Test\', \'Simulator\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_VISA', 'True', 'Do you want to accept Visa payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Mastercard', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MC', 'True', 'Do you want to accept Mastercard payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa Delta/Debit', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DELTA', 'True', 'Do you want to accept Visa Delta/Debit payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Solo', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO', 'True', 'Do you want to accept Solo payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Maestro', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO', 'True', 'Do you want to accept Maestro payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Visa Electron UK Debit', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_UKE', 'True', 'Do you want to accept Visa Electron UK Debit payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept American Express', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX', 'True', 'Do you want to accept American Express payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Diners Club', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DC', 'True', 'Do you want to accept Diners Club payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Accept Japan Credit Bureau', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_JCB', 'True', 'Do you want to accept Japan Credit Bureau payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_SAGE_PAY_DIRECT_STATUS', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_VENDOR_LOGIN_NAME', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_METHOD', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_VERIFY_WITH_CVC', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_TRANSACTION_SERVER', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ZONE', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ORDER_STATUS_ID', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_SORT_ORDER', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_CURL', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_VISA', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MC', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DELTA', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_UKE', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DC', 'MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_JCB');
+    }
+
+    function sendTransactionToGateway($url, $parameters) {
+      $server = parse_url($url);
+
+      if (isset($server['port']) === false) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (isset($server['path']) === false) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_SAGE_PAY_DIRECT_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k', $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function getCardTypes() {
+      $this->_cards = array();
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_VISA == 'True') {
+        $this->_cards['VISA'] = 'Visa';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MC == 'True') {
+        $this->_cards['MC'] = 'Mastercard';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DELTA == 'True') {
+        $this->_cards['DELTA'] = 'Visa Delta/Debit';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_SOLO == 'True') {
+        $this->_cards['SOLO'] = 'Solo';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_MAESTRO == 'True') {
+        $this->_cards['MAESTRO'] = 'Maestro';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_UKE == 'True') {
+        $this->_cards['UKE'] = 'Visa Electron UK Debit';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_AMEX == 'True') {
+        $this->_cards['AMEX'] = 'American Express';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_DC == 'True') {
+        $this->_cards['DC'] = 'Diners Club';
+      }
+
+      if (MODULE_PAYMENT_SAGE_PAY_DIRECT_ALLOW_JCB == 'True') {
+        $this->_cards['JCB'] = 'Japan Credit Bureau';
+      }
+
+      return $this->_cards;
+    }
+
+    function hasCards() {
+      if (!isset($this->_cards)) {
+        $this->getCardTypes();
+      }
+
+      return !empty($this->_cards);
+    }
+
+    function isCard($key) {
+      if (!isset($this->_cards)) {
+        $this->getCardTypes();
+      }
+
+      return isset($this->_cards[$key]);
+    }
+
+    function loadErrorMessages() {
+      $errors = array();
+
+      if (file_exists(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php')) {
+        include(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php');
+      }
+
+      $this->_error_messages = $errors;
+    }
+
+    function getErrorMessageNumber($string) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      $error = explode(' ', $string, 2);
+
+      if (is_numeric($error[0]) && $this->errorMessageNumberExists($error[0])) {
+        return $error[0];
+      }
+
+      return false;
+    }
+
+    function getErrorMessage($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      if (is_numeric($number) && $this->errorMessageNumberExists($number)) {
+        return $this->_error_messages[$number];
+      }
+
+      return false;
+    }
+
+    function errorMessageNumberExists($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      return (is_numeric($number) && isset($this->_error_messages[$number]));
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/sage_pay_form.php 2.3.1.src/includes/modules/payment/sage_pay_form.php
--- 2.2rc2a.cp.src/includes/modules/payment/sage_pay_form.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/sage_pay_form.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,431 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  function sage_pay_form_textarea_field($value = '', $key = '') {
+    return tep_draw_textarea_field('configuration[' . $key . ']', 'soft', 60, 5, $value);
+  }
+
+  class sage_pay_form {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function sage_pay_form() {
+      global $order;
+
+      $this->signature = 'sage_pay|sage_pay_form|1.2|2.2';
+
+      $this->code = 'sage_pay_form';
+      $this->title = MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_SAGE_PAY_FORM_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_SAGE_PAY_FORM_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_SAGE_PAY_FORM_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_SAGE_PAY_FORM_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_SAGE_PAY_FORM_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+
+      switch (MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_SERVER) {
+        case 'Live':
+          $this->form_action_url = 'https://live.sagepay.com/gateway/service/vspform-register.vsp';
+          break;
+
+        case 'Test':
+          $this->form_action_url = 'https://test.sagepay.com/gateway/service/vspform-register.vsp';
+          break;
+
+        default:
+          $this->form_action_url = 'https://test.sagepay.com/Simulator/VSPFormGateway.asp';
+          break;
+      }
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SAGE_PAY_FORM_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAGE_PAY_FORM_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      return false;
+    }
+
+    function process_button() {
+      global $customer_id, $order, $currency, $cartID;
+
+      $process_button_string = '';
+
+      $params = array('VPSProtocol' => '2.23',
+                      'ReferrerID' => 'C74D7B82-E9EB-4FBD-93DB-76F0F551C802',
+                      'Vendor' => substr(MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_LOGIN_NAME, 0, 15));
+
+      if ( MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_METHOD == 'Payment' ) {
+        $params['TxType'] = 'PAYMENT';
+      } elseif ( MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_METHOD == 'Deferred' ) {
+        $params['TxType'] = 'DEFERRED';
+      } else {
+        $params['TxType'] = 'AUTHENTICATE';
+      }
+
+      $crypt = array('VendorTxCode' => substr(date('YmdHis') . '-' . $customer_id . '-' . $cartID, 0, 40),
+                     'Amount' => $this->format_raw($order->info['total']),
+                     'Currency' => $currency,
+                     'Description' => substr(STORE_NAME, 0, 100),
+                     'SuccessURL' => tep_href_link(FILENAME_CHECKOUT_PROCESS, tep_session_name() . '=' . tep_session_id(), 'SSL', false),
+                     'FailureURL' => tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false),
+                     'CustomerName' => substr($order->billing['firstname'] . ' ' . $order->billing['lastname'], 0, 100),
+                     'CustomerEMail' => substr($order->customer['email_address'], 0, 255),
+                     'BillingSurname' => substr($order->billing['lastname'], 0, 20),
+                     'BillingFirstnames' => substr($order->billing['firstname'], 0, 20),
+                     'BillingAddress1' => substr($order->billing['street_address'], 0, 100),
+                     'BillingCity' => substr($order->billing['city'], 0, 40),
+                     'BillingPostCode' => substr($order->billing['postcode'], 0, 10),
+                     'BillingCountry' => $order->billing['country']['iso_code_2']);
+
+      if ($crypt['BillingCountry'] == 'US') {
+        $crypt['BillingState'] = tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], '');
+      }
+
+      $crypt['BillingPhone'] = substr($order->customer['telephone'], 0, 20);
+      $crypt['DeliverySurname'] = substr($order->delivery['lastname'], 0, 20);
+      $crypt['DeliveryFirstnames'] = substr($order->delivery['firstname'], 0, 20);
+      $crypt['DeliveryAddress1'] = substr($order->delivery['street_address'], 0, 100);
+      $crypt['DeliveryCity'] = substr($order->delivery['city'], 0, 40);
+      $crypt['DeliveryPostCode'] = substr($order->delivery['postcode'], 0, 10);
+      $crypt['DeliveryCountry'] = $order->delivery['country']['iso_code_2'];
+
+      if ($crypt['DeliveryCountry'] == 'US') {
+        $crypt['DeliveryState'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], '');
+      }
+
+      if (tep_not_null(MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_EMAIL)) {
+        $crypt['VendorEMail'] = substr(MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_EMAIL, 0, 255);
+      }
+
+      switch (MODULE_PAYMENT_SAGE_PAY_FORM_SEND_EMAIL) {
+        case 'No One':
+          $crypt['SendEMail'] = 0;
+          break;
+
+        case 'Customer and Vendor':
+          $crypt['SendEMail'] = 1;
+          break;
+
+        case 'Vendor Only':
+          $crypt['SendEMail'] = 2;
+          break;
+      }
+
+      if (tep_not_null(MODULE_PAYMENT_SAGE_PAY_FORM_CUSTOMER_EMAIL_MESSAGE)) {
+        $crypt['eMailMessage'] = substr(MODULE_PAYMENT_SAGE_PAY_FORM_CUSTOMER_EMAIL_MESSAGE, 0, 7500);
+      }
+
+      $contents = array();
+
+      foreach ($order->products as $product) {
+        $product_name = $product['name'];
+
+        if (isset($product['attributes'])) {
+          foreach ($product['attributes'] as $att) {
+            $product_name .= '; ' . $att['option'] . '=' . $att['value'];
+          }
+        }
+
+        $contents[] = str_replace(array(':', "\n", "\r", '&'), '', $product_name) . ':' . $product['qty'] . ':' . $this->format_raw($product['final_price']) . ':' . $this->format_raw(($product['tax'] / 100) * $product['final_price']) . ':' . $this->format_raw((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) . ':' . $this->format_raw(((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) * $product['qty']);
+      }
+
+      foreach ($this->getOrderTotalsSummary() as $ot) {
+        $contents[] = str_replace(array(':', "\n", "\r", '&'), '', strip_tags($ot['title'])) . ':---:---:---:---:' . $this->format_raw($ot['value']);
+      }
+
+      $crypt['Basket'] = substr(sizeof($contents) . ':' . implode(':', $contents), 0, 7500);
+      $crypt['Apply3DSecure'] = '0';
+
+      $crypt_string = '';
+
+      foreach ($crypt as $key => $value) {
+        $crypt_string .= $key . '=' . trim($value) . '&';
+      }
+
+      $crypt_string = substr($crypt_string, 0, -1);
+
+      $params['Crypt'] = base64_encode($this->simpleXor($crypt_string, MODULE_PAYMENT_SAGE_PAY_FORM_ENCRYPTION_PASSWORD));
+
+      foreach ($params as $key => $value) {
+        $process_button_string .= tep_draw_hidden_field($key, $value);
+      }
+
+      return $process_button_string;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_POST_VARS, $order;
+
+      if (isset($HTTP_GET_VARS['crypt']) && tep_not_null($HTTP_GET_VARS['crypt'])) {
+        $transaction_response = $this->simpleXor($this->base64Decode($HTTP_GET_VARS['crypt']), MODULE_PAYMENT_SAGE_PAY_FORM_ENCRYPTION_PASSWORD);
+
+        $string_array = explode('&', $transaction_response);
+        $return = array('Status' => null);
+
+        foreach ($string_array as $string) {
+          if (strpos($string, '=') != false) {
+            $parts = explode('=', $string, 2);
+            $return[trim($parts[0])] = trim($parts[1]);
+          }
+        }
+
+        if ( ($return['Status'] != 'OK') && ($return['Status'] != 'AUTHENTICATED') && ($return['Status'] != 'REGISTERED') ) {
+          $error = $this->getErrorMessageNumber($return['StatusDetail']);
+
+          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : ''), 'SSL'));
+        }
+
+        if ( isset($return['VPSTxId']) ) {
+          $order->info['comments'] = 'Sage Pay Reference ID: ' . $return['VPSTxId'] . (tep_not_null($order->info['comments']) ? "\n\n" . $order->info['comments'] : '');
+        }
+      } else {
+        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL'));
+      }
+    }
+
+    function after_process() {
+      return false;
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      $message = MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_GENERAL;
+
+      if ( isset($HTTP_GET_VARS['error']) && is_numeric($HTTP_GET_VARS['error']) && $this->errorMessageNumberExists($HTTP_GET_VARS['error']) ) {
+        $message = $this->getErrorMessage($HTTP_GET_VARS['error']) . ' ' . MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_GENERAL;
+      } elseif (isset($HTTP_GET_VARS['crypt']) && tep_not_null($HTTP_GET_VARS['crypt'])) {
+        $transaction_response = $this->simpleXor($this->base64Decode($HTTP_GET_VARS['crypt']), MODULE_PAYMENT_SAGE_PAY_FORM_ENCRYPTION_PASSWORD);
+
+        $string_array = explode('&', $transaction_response);
+        $return = array('Status' => null);
+
+        foreach ($string_array as $string) {
+          if (strpos($string, '=') != false) {
+            $parts = explode('=', $string, 2);
+            $return[trim($parts[0])] = trim($parts[1]);
+          }
+        }
+
+        $error_number = $this->getErrorMessageNumber($return['StatusDetail']);
+
+        if ( is_numeric($error_number) && $this->errorMessageNumberExists($error_number) ) {
+          $message = $this->getErrorMessage($error_number) . ' ' . MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_GENERAL;
+        }
+      }
+
+      $error = array('title' => MODULE_PAYMENT_SAGE_PAY_FORM_ERROR_TITLE,
+                     'error' => $message);
+
+      return $error;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_SAGE_PAY_FORM_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Sage Pay Form Module', 'MODULE_PAYMENT_SAGE_PAY_FORM_STATUS', 'False', 'Do you want to accept Sage Pay Form payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor Login Name', 'MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_LOGIN_NAME', '', 'The vendor login name to connect to the gateway with.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Encryption Password', 'MODULE_PAYMENT_SAGE_PAY_FORM_ENCRYPTION_PASSWORD', '', 'The encrpytion password to secure transactions with.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_METHOD', 'Authenticate', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authenticate\', \'Deferred\', \'Payment\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_SERVER', 'Simulator', 'Perform transactions on the production server or on the testing server.', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Test\', \'Simulator\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor E-Mail', 'MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_EMAIL', '', 'An e-mail address on which you can be contacted when a transaction completes. NOTE: If you wish to use multiple email addresses, you should add them using the : (colon) character as a separator. e.g. me@mail1.com:me@mail2.com', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Send E-Mail', 'MODULE_PAYMENT_SAGE_PAY_FORM_SEND_EMAIL', 'Customer and Vendor', 'Who to send e-mails to.', '6', '0', 'tep_cfg_select_option(array(\'No One\', \'Customer and Vendor\', \'Vendor Only\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Customer E-Mail Message', 'MODULE_PAYMENT_SAGE_PAY_FORM_CUSTOMER_EMAIL_MESSAGE', '', 'A message to the customer which is inserted into the successful transaction e-mails only.', '6', '0', 'sage_pay_form_textarea_field(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_SAGE_PAY_FORM_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_SAGE_PAY_FORM_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_SAGE_PAY_FORM_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_SAGE_PAY_FORM_STATUS', 'MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_LOGIN_NAME', 'MODULE_PAYMENT_SAGE_PAY_FORM_ENCRYPTION_PASSWORD', 'MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_METHOD', 'MODULE_PAYMENT_SAGE_PAY_FORM_TRANSACTION_SERVER', 'MODULE_PAYMENT_SAGE_PAY_FORM_VENDOR_EMAIL', 'MODULE_PAYMENT_SAGE_PAY_FORM_SEND_EMAIL', 'MODULE_PAYMENT_SAGE_PAY_FORM_CUSTOMER_EMAIL_MESSAGE', 'MODULE_PAYMENT_SAGE_PAY_FORM_ZONE', 'MODULE_PAYMENT_SAGE_PAY_FORM_ORDER_STATUS_ID', 'MODULE_PAYMENT_SAGE_PAY_FORM_SORT_ORDER');
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function getOrderTotalsSummary() {
+      global $order_total_modules;
+
+      $order_total_array = array();
+
+      if (is_array($order_total_modules->modules)) {
+        foreach ($order_total_modules->modules as $value) {
+          $class = substr($value, 0, strrpos($value, '.'));
+          if ($GLOBALS[$class]->enabled) {
+            for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {
+              if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {
+                $order_total_array[] = array('code' => $GLOBALS[$class]->code,
+                                             'title' => $GLOBALS[$class]->output[$i]['title'],
+                                             'text' => $GLOBALS[$class]->output[$i]['text'],
+                                             'value' => $GLOBALS[$class]->output[$i]['value'],
+                                             'sort_order' => $GLOBALS[$class]->sort_order);
+              }
+            }
+          }
+        }
+      }
+
+      return $order_total_array;
+    }
+
+    function loadErrorMessages() {
+      $errors = array();
+
+      if (file_exists(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php')) {
+        include(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php');
+      }
+
+      $this->_error_messages = $errors;
+    }
+
+    function getErrorMessageNumber($string) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      $error = explode(' ', $string, 2);
+
+      if (is_numeric($error[0]) && $this->errorMessageNumberExists($error[0])) {
+        return $error[0];
+      }
+
+      return false;
+    }
+
+    function getErrorMessage($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      if (is_numeric($number) && $this->errorMessageNumberExists($number)) {
+        return $this->_error_messages[$number];
+      }
+
+      return false;
+    }
+
+    function errorMessageNumberExists($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      return (is_numeric($number) && isset($this->_error_messages[$number]));
+    }
+
+/*  From the Sage Pay Form PHP Kit:
+**  The SimpleXor encryption algorithm                                                                                **
+**  NOTE: This is a placeholder really.  Future releases of VSP Form will use AES or TwoFish.  Proper encryption      **
+**  This simple function and the Base64 will deter script kiddies and prevent the "View Source" type tampering        **
+**  It won't stop a half decent hacker though, but the most they could do is change the amount field to something     **
+**  else, so provided the vendor checks the reports and compares amounts, there is no harm done.  It's still          **
+**  more secure than the other PSPs who don't both encrypting their forms at all                                      */
+
+    function simpleXor($InString, $Key) {
+// Initialise key array
+      $KeyList = array();
+// Initialise out variable
+      $output = "";
+
+// Convert $Key into array of ASCII values
+      for ($i=0; $i<strlen($Key); $i++) {
+        $KeyList[$i] = ord(substr($Key, $i, 1));
+      }
+
+// Step through string a character at a time
+      for ($i=0; $i<strlen($InString); $i++) {
+// Get ASCII code from string, get ASCII code from key (loop through with MOD), XOR the two, get the character from the result
+// % is MOD (modulus), ^ is XOR
+        $output .= @chr(ord(substr($InString, $i, 1)) ^ ($KeyList[$i % strlen($Key)]));
+      }
+
+// Return the result
+      return $output;
+    }
+
+/*  From the Sage Pay Form PHP Kit:
+** Base 64 decoding function **
+** PHP does it natively but just for consistency and ease of maintenance, let's declare our own function **/
+
+    function base64Decode($scrambled) {
+// Initialise output variable
+      $output = '';
+
+// Fix plus to space conversion issue
+      $scrambled = str_replace(' ', '+', $scrambled);
+
+// Do encoding
+      $output = base64_decode($scrambled);
+
+// Return the result
+      return $output;
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/sage_pay_server.php 2.3.1.src/includes/modules/payment/sage_pay_server.php
--- 2.2rc2a.cp.src/includes/modules/payment/sage_pay_server.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/sage_pay_server.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,453 @@
+<?php
+/*
+  $Id: $
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2009 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sage_pay_server {
+    var $code, $title, $description, $enabled;
+
+// class constructor
+    function sage_pay_server() {
+      global $order;
+
+      $this->signature = 'sage_pay|sage_pay_server|1.0|2.3';
+
+      $this->code = 'sage_pay_server';
+      $this->title = MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_TITLE;
+      $this->public_title = MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_PUBLIC_TITLE;
+      $this->description = MODULE_PAYMENT_SAGE_PAY_SERVER_TEXT_DESCRIPTION;
+      $this->sort_order = MODULE_PAYMENT_SAGE_PAY_SERVER_SORT_ORDER;
+      $this->enabled = ((MODULE_PAYMENT_SAGE_PAY_SERVER_STATUS == 'True') ? true : false);
+
+      if ((int)MODULE_PAYMENT_SAGE_PAY_SERVER_ORDER_STATUS_ID > 0) {
+        $this->order_status = MODULE_PAYMENT_SAGE_PAY_SERVER_ORDER_STATUS_ID;
+      }
+
+      if (is_object($order)) $this->update_status();
+    }
+
+// class methods
+    function update_status() {
+      global $order;
+
+      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SAGE_PAY_SERVER_ZONE > 0) ) {
+        $check_flag = false;
+        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SAGE_PAY_SERVER_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
+        while ($check = tep_db_fetch_array($check_query)) {
+          if ($check['zone_id'] < 1) {
+            $check_flag = true;
+            break;
+          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
+            $check_flag = true;
+            break;
+          }
+        }
+
+        if ($check_flag == false) {
+          $this->enabled = false;
+        }
+      }
+    }
+
+    function javascript_validation() {
+      return false;
+    }
+
+    function selection() {
+      return array('id' => $this->code,
+                   'module' => $this->public_title);
+    }
+
+    function pre_confirmation_check() {
+      return false;
+    }
+
+    function confirmation() {
+      return false;
+    }
+
+    function process_button() {
+      return false;
+    }
+
+    function before_process() {
+      global $HTTP_GET_VARS, $HTTP_POST_VARS, $sage_pay_server_securitykey, $sage_pay_server_nexturl, $customer_id, $order, $currency, $order_totals, $cartID;
+
+      $error = null;
+
+      if (isset($HTTP_GET_VARS['check']) && ($HTTP_GET_VARS['check'] == 'SERVER')) {
+        $sig = $HTTP_POST_VARS['VPSTxId'] . $HTTP_POST_VARS['VendorTxCode'] . $HTTP_POST_VARS['Status'];
+
+        if ($HTTP_POST_VARS['Status'] == 'OK') {
+          $sig .= $HTTP_POST_VARS['TxAuthNo'];
+        }
+
+        $sig .= substr(MODULE_PAYMENT_SAGE_PAY_SERVER_VENDOR_LOGIN_NAME, 0, 15);
+
+        if ( ($HTTP_POST_VARS['Status'] != 'AUTHENTICATED') && ($HTTP_POST_VARS['Status'] != 'REGISTERED') ) {
+          $sig .= $HTTP_POST_VARS['AVSCV2'];
+        }
+
+        $sig .= $sage_pay_server_securitykey;
+
+        if ( ($HTTP_POST_VARS['Status'] != 'AUTHENTICATED') && ($HTTP_POST_VARS['Status'] != 'REGISTERED') ) {
+          $sig .= $HTTP_POST_VARS['AddressResult'] . $HTTP_POST_VARS['PostCodeResult'] . $HTTP_POST_VARS['CV2Result'];
+        }
+
+        $sig .= $HTTP_POST_VARS['GiftAid'] . $HTTP_POST_VARS['3DSecureStatus'];
+
+        if ($HTTP_POST_VARS['3DSecureStatus'] == 'OK') {
+          $sig .= $HTTP_POST_VARS['CAVV'];
+        }
+
+        if ( ($HTTP_POST_VARS['AddressStatus'] == 'NONE') || ($HTTP_POST_VARS['AddressStatus'] == 'CONFIRMED') || ($HTTP_POST_VARS['AddressStatus'] == 'UNCONFIRMED') ) {
+          $sig .= $HTTP_POST_VARS['AddressStatus'];
+        }
+
+        if ( ($HTTP_POST_VARS['PayerStatus'] == 'VERIFIED') || ($HTTP_POST_VARS['PayerStatus'] == 'UNVERIFIED') ) {
+          $sig .= $HTTP_POST_VARS['PayerStatus'];
+        }
+
+        if ( in_array($HTTP_POST_VARS['CardType'], array('VISA', 'MC', 'DELTA', 'SOLO', 'MAESTRO', 'UKE', 'AMEX', 'DC', 'JCB', 'SWITCH', 'LASER', 'PAYPAL')) ) {
+          $sig .= $HTTP_POST_VARS['CardType'];
+        }
+
+        $sig .= $HTTP_POST_VARS['Last4Digits'];
+
+        if (isset($HTTP_POST_VARS['VPSSignature']) && ($HTTP_POST_VARS['VPSSignature'] == strtoupper(md5($sig)))) {
+          if ( ($HTTP_POST_VARS['Status'] != 'OK') && ($HTTP_POST_VARS['Status'] != 'AUTHENTICATED') && ($HTTP_POST_VARS['Status'] != 'REGISTERED') ) {
+            tep_session_unregister('sage_pay_server_securitykey');
+            tep_session_unregister('sage_pay_server_nexturl');
+
+            $error = $this->getErrorMessageNumber($HTTP_POST_VARS['StatusDetail']);
+
+            if ( MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE == 'Normal' ) {
+              $error_url = tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : '') . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false);
+            } else {
+              $error_url = tep_href_link('ext/modules/payment/sage_pay/redirect.php', 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : '') . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false);
+            }
+
+            $result = 'Status=OK' . chr(13) . chr(10) .
+                      'RedirectURL=' . $error_url;
+          } else {
+            $result = 'Status=OK' . chr(13) . chr(10) .
+                      'RedirectURL=' . tep_href_link(FILENAME_CHECKOUT_PROCESS, 'check=PROCESS&key=' . md5($sage_pay_server_securitykey) . '&VPSTxId=' . $HTTP_POST_VARS['VPSTxId'] . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false);
+          }
+        } else {
+          tep_session_unregister('sage_pay_server_securitykey');
+          tep_session_unregister('sage_pay_server_nexturl');
+
+          $error = $this->getErrorMessageNumber($HTTP_POST_VARS['StatusDetail']);
+
+          if ( MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE == 'Normal' ) {
+            $error_url = tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : '') . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false);
+          } else {
+            $error_url = tep_href_link('ext/modules/payment/sage_pay/redirect.php', 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : '') . '&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false);
+          }
+
+          $result = 'Status=INVALID' . chr(13) . chr(10) .
+                    'RedirectURL=' . $error_url;
+        }
+
+        echo $result;
+        exit;
+      } elseif (isset($HTTP_GET_VARS['check']) && ($HTTP_GET_VARS['check'] == 'PROCESS')) {
+        if ($HTTP_GET_VARS['key'] == md5($sage_pay_server_securitykey)) {
+          tep_session_unregister('sage_pay_server_securitykey');
+          tep_session_unregister('sage_pay_server_nexturl');
+
+          if ( isset($HTTP_GET_VARS['VPSTxId']) ) {
+            $order->info['comments'] = 'Sage Pay Reference ID: ' . $HTTP_GET_VARS['VPSTxId'] . (tep_not_null($order->info['comments']) ? "\n\n" . $order->info['comments'] : '');
+          }
+
+          return true;
+        }
+      } else {
+        $params = array('VPSProtocol' => '2.23',
+                        'ReferrerID' => 'C74D7B82-E9EB-4FBD-93DB-76F0F551C802',
+                        'Vendor' => substr(MODULE_PAYMENT_SAGE_PAY_SERVER_VENDOR_LOGIN_NAME, 0, 15),
+                        'VendorTxCode' => substr(date('YmdHis') . '-' . $customer_id . '-' . $cartID, 0, 40),
+                        'Amount' => $this->format_raw($order->info['total']),
+                        'Currency' => $currency,
+                        'Description' => substr(STORE_NAME, 0, 100),
+                        'NotificationURL' => tep_href_link(FILENAME_CHECKOUT_PROCESS, 'check=SERVER&' . tep_session_name() . '=' . tep_session_id(), 'SSL', false),
+                        'BillingSurname' => substr($order->billing['lastname'], 0, 20),
+                        'BillingFirstnames' => substr($order->billing['firstname'], 0, 20),
+                        'BillingAddress1' => substr($order->billing['street_address'], 0, 100),
+                        'BillingCity' => substr($order->billing['city'], 0, 40),
+                        'BillingPostCode' => substr($order->billing['postcode'], 0, 10),
+                        'BillingCountry' => $order->billing['country']['iso_code_2'],
+                        'BillingPhone' => substr($order->customer['telephone'], 0, 20),
+                        'DeliverySurname' => substr($order->delivery['lastname'], 0, 20),
+                        'DeliveryFirstnames' => substr($order->delivery['firstname'], 0, 20),
+                        'DeliveryAddress1' => substr($order->delivery['street_address'], 0, 100),
+                        'DeliveryCity' => substr($order->delivery['city'], 0, 40),
+                        'DeliveryPostCode' => substr($order->delivery['postcode'], 0, 10),
+                        'DeliveryCountry' => $order->delivery['country']['iso_code_2'],
+                        'DeliveryPhone' => substr($order->customer['telephone'], 0, 20),
+                        'CustomerEMail' => substr($order->customer['email_address'], 0, 255),
+                        'Apply3DSecure' => '0');
+
+        $ip_address = tep_get_ip_address();
+
+        if ( (ip2long($ip_address) != -1) && (ip2long($ip_address) != false) ) {
+          $params['ClientIPAddress']= $ip_address;
+        }
+
+        if ( MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_METHOD == 'Payment' ) {
+          $params['TxType'] = 'PAYMENT';
+        } elseif ( MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_METHOD == 'Deferred' ) {
+          $params['TxType'] = 'DEFERRED';
+        } else {
+          $params['TxType'] = 'AUTHENTICATE';
+        }
+
+        if ($params['BillingCountry'] == 'US') {
+          $params['BillingState'] = tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], '');
+        }
+
+        if ($params['DeliveryCountry'] == 'US') {
+          $params['DeliveryState'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], '');
+        }
+
+        if ( MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE != 'Normal' ) {
+          $params['Profile'] = 'LOW';
+        }
+
+        $contents = array();
+
+        foreach ($order->products as $product) {
+          $product_name = $product['name'];
+
+          if (isset($product['attributes'])) {
+            foreach ($product['attributes'] as $att) {
+              $product_name .= '; ' . $att['option'] . '=' . $att['value'];
+            }
+          }
+
+          $contents[] = str_replace(array(':', "\n", "\r", '&'), '', $product_name) . ':' . $product['qty'] . ':' . $this->format_raw($product['final_price']) . ':' . $this->format_raw(($product['tax'] / 100) * $product['final_price']) . ':' . $this->format_raw((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) . ':' . $this->format_raw(((($product['tax'] / 100) * $product['final_price']) + $product['final_price']) * $product['qty']);
+        }
+
+        foreach ($order_totals as $ot) {
+          $contents[] = str_replace(array(':', "\n", "\r", '&'), '', strip_tags($ot['title'])) . ':---:---:---:---:' . $this->format_raw($ot['value']);
+        }
+
+        $params['Basket'] = substr(sizeof($contents) . ':' . implode(':', $contents), 0, 7500);
+
+        $post_string = '';
+
+        foreach ($params as $key => $value) {
+          $post_string .= $key . '=' . urlencode(trim($value)) . '&';
+        }
+
+        switch (MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_SERVER) {
+          case 'Live':
+            $gateway_url = 'https://live.sagepay.com/gateway/service/vspserver-register.vsp';
+            break;
+
+          case 'Test':
+            $gateway_url = 'https://test.sagepay.com/gateway/service/vspserver-register.vsp';
+            break;
+
+          default:
+            $gateway_url = 'https://test.sagepay.com/Simulator/VSPServerGateway.asp?Service=VendorRegisterTx';
+            break;
+        }
+
+        $transaction_response = $this->sendTransactionToGateway($gateway_url, $post_string);
+
+        $string_array = explode(chr(10), $transaction_response);
+        $return = array();
+
+        foreach ($string_array as $string) {
+          if (strpos($string, '=') != false) {
+            $parts = explode('=', $string, 2);
+            $return[trim($parts[0])] = trim($parts[1]);
+          }
+        }
+
+        if ($return['Status'] == 'OK') {
+          tep_session_register('sage_pay_server_securitykey');
+          $sage_pay_server_securitykey = $return['SecurityKey'];
+
+          tep_session_register('sage_pay_server_nexturl');
+          $sage_pay_server_nexturl = $return['NextURL'];
+
+          if ( MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE == 'Normal' ) {
+            tep_redirect($return['NextURL']);
+          } else {
+            tep_redirect(tep_href_link('ext/modules/payment/sage_pay/checkout.php', '', 'SSL'));
+          }
+        } else {
+          $error = $this->getErrorMessageNumber($return['StatusDetail']);
+        }
+      }
+
+      tep_session_unregister('sage_pay_server_securitykey');
+      tep_session_unregister('sage_pay_server_nexturl');
+
+      tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code . (tep_not_null($error) ? '&error=' . $error : ''), 'SSL'));
+    }
+
+    function after_process() {
+      global $cart;
+
+      $cart->reset(true);
+
+// unregister session variables used during checkout
+      tep_session_unregister('sendto');
+      tep_session_unregister('billto');
+      tep_session_unregister('shipping');
+      tep_session_unregister('payment');
+      tep_session_unregister('comments');
+
+      tep_redirect(tep_href_link('ext/modules/payment/sage_pay/redirect.php', '', 'SSL'));
+    }
+
+    function get_error() {
+      global $HTTP_GET_VARS;
+
+      $message = MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_GENERAL;
+
+      if ( isset($HTTP_GET_VARS['error']) && is_numeric($HTTP_GET_VARS['error']) && $this->errorMessageNumberExists($HTTP_GET_VARS['error']) ) {
+        $message = $this->getErrorMessage($HTTP_GET_VARS['error']) . ' ' . MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_GENERAL;
+      }
+
+      $error = array('title' => MODULE_PAYMENT_SAGE_PAY_SERVER_ERROR_TITLE,
+                     'error' => $message);
+
+      return $error;
+    }
+
+    function check() {
+      if (!isset($this->_check)) {
+        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_SAGE_PAY_SERVER_STATUS'");
+        $this->_check = tep_db_num_rows($check_query);
+      }
+      return $this->_check;
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Sage Pay Server Module', 'MODULE_PAYMENT_SAGE_PAY_SERVER_STATUS', 'False', 'Do you want to accept Sage Pay Server payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Vendor Login Name', 'MODULE_PAYMENT_SAGE_PAY_SERVER_VENDOR_LOGIN_NAME', '', 'The vendor login name to connect to the gateway with.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Profile Payment Page', 'MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE', 'Normal', 'Profile page to use for the payment page.', '6', '0', 'tep_cfg_select_option(array(\'Normal\', \'Low\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_METHOD', 'Authenticate', 'The processing method to use for each transaction.', '6', '0', 'tep_cfg_select_option(array(\'Authenticate\', \'Deferred\', \'Payment\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Server', 'MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_SERVER', 'Simulator', 'Perform transactions on the production server or on the testing server.', '6', '0', 'tep_cfg_select_option(array(\'Live\', \'Test\', \'Simulator\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_SAGE_PAY_SERVER_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_SAGE_PAY_SERVER_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_SAGE_PAY_SERVER_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('cURL Program Location', 'MODULE_PAYMENT_SAGE_PAY_SERVER_CURL', '/usr/bin/curl', 'The location to the cURL program application.', '6', '0' , now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_PAYMENT_SAGE_PAY_SERVER_STATUS', 'MODULE_PAYMENT_SAGE_PAY_SERVER_VENDOR_LOGIN_NAME', 'MODULE_PAYMENT_SAGE_PAY_SERVER_PROFILE_PAGE', 'MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_METHOD', 'MODULE_PAYMENT_SAGE_PAY_SERVER_TRANSACTION_SERVER', 'MODULE_PAYMENT_SAGE_PAY_SERVER_ZONE', 'MODULE_PAYMENT_SAGE_PAY_SERVER_ORDER_STATUS_ID', 'MODULE_PAYMENT_SAGE_PAY_SERVER_SORT_ORDER', 'MODULE_PAYMENT_SAGE_PAY_SERVER_CURL');
+    }
+
+    function sendTransactionToGateway($url, $parameters) {
+      $server = parse_url($url);
+
+      if (isset($server['port']) === false) {
+        $server['port'] = ($server['scheme'] == 'https') ? 443 : 80;
+      }
+
+      if (isset($server['path']) === false) {
+        $server['path'] = '/';
+      }
+
+      if (isset($server['user']) && isset($server['pass'])) {
+        $header[] = 'Authorization: Basic ' . base64_encode($server['user'] . ':' . $server['pass']);
+      }
+
+      if (function_exists('curl_init')) {
+        $curl = curl_init($server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : ''));
+        curl_setopt($curl, CURLOPT_PORT, $server['port']);
+        curl_setopt($curl, CURLOPT_HEADER, 0);
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
+        curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
+        curl_setopt($curl, CURLOPT_POST, 1);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
+
+        $result = curl_exec($curl);
+
+        curl_close($curl);
+      } else {
+        exec(escapeshellarg(MODULE_PAYMENT_SAGE_PAY_SERVER_CURL) . ' -d ' . escapeshellarg($parameters) . ' "' . $server['scheme'] . '://' . $server['host'] . $server['path'] . (isset($server['query']) ? '?' . $server['query'] : '') . '" -P ' . $server['port'] . ' -k', $result);
+        $result = implode("\n", $result);
+      }
+
+      return $result;
+    }
+
+// format prices without currency formatting
+    function format_raw($number, $currency_code = '', $currency_value = '') {
+      global $currencies, $currency;
+
+      if (empty($currency_code) || !$currencies->is_set($currency_code)) {
+        $currency_code = $currency;
+      }
+
+      if (empty($currency_value) || !is_numeric($currency_value)) {
+        $currency_value = $currencies->currencies[$currency_code]['value'];
+      }
+
+      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
+    }
+
+    function loadErrorMessages() {
+      $errors = array();
+
+      if (file_exists(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php')) {
+        include(dirname(__FILE__) . '/../../../ext/modules/payment/sage_pay/errors.php');
+      }
+
+      $this->_error_messages = $errors;
+    }
+
+    function getErrorMessageNumber($string) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      $error = explode(' ', $string, 2);
+
+      if (is_numeric($error[0]) && $this->errorMessageNumberExists($error[0])) {
+        return $error[0];
+      }
+
+      return false;
+    }
+
+    function getErrorMessage($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      if (is_numeric($number) && $this->errorMessageNumberExists($number)) {
+        return $this->_error_messages[$number];
+      }
+
+      return false;
+    }
+
+    function errorMessageNumberExists($number) {
+      if (!isset($this->_error_messages)) {
+        $this->loadErrorMessages();
+      }
+
+      return (is_numeric($number) && isset($this->_error_messages[$number]));
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/secpay.php 2.3.1.src/includes/modules/payment/secpay.php
--- 2.2rc2a.cp.src/includes/modules/payment/secpay.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/secpay.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,188 +0,0 @@
-<?php
-/*
-  $Id: secpay.php 1739 2007-12-20 00:52:16Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2003 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class secpay {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function secpay() {
-      global $order;
-
-      $this->code = 'secpay';
-      $this->title = MODULE_PAYMENT_SECPAY_TEXT_TITLE;
-      $this->description = MODULE_PAYMENT_SECPAY_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_SECPAY_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_SECPAY_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_SECPAY_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_SECPAY_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-
-      $this->form_action_url = 'https://www.secpay.com/java-bin/ValCard';
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_SECPAY_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_SECPAY_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      return array('id' => $this->code,
-                   'module' => $this->title);
-    }
-
-    function pre_confirmation_check() {
-      return false;
-    }
-
-    function confirmation() {
-      return false;
-    }
-
-    function process_button() {
-      global $order, $currencies, $currency;
-
-      switch (MODULE_PAYMENT_SECPAY_CURRENCY) {
-        case 'Default Currency':
-          $sec_currency = DEFAULT_CURRENCY;
-          break;
-        case 'Any Currency':
-        default:
-          $sec_currency = $currency;
-          break;
-      }
-
-      switch (MODULE_PAYMENT_SECPAY_TEST_STATUS) {
-        case 'Always Fail':
-          $test_status = 'false';
-          break;
-        case 'Production':
-          $test_status = 'live';
-          break;
-        case 'Always Successful':
-        default:
-          $test_status = 'true';
-          break;
-      }
-
-      $process_button_string = tep_draw_hidden_field('merchant', MODULE_PAYMENT_SECPAY_MERCHANT_ID) .
-                               tep_draw_hidden_field('trans_id', STORE_NAME . date('Ymdhis')) .
-                               tep_draw_hidden_field('amount', number_format($order->info['total'] * $currencies->get_value($sec_currency), $currencies->currencies[$sec_currency]['decimal_places'], '.', '')) .
-                               tep_draw_hidden_field('bill_name', $order->billing['firstname'] . ' ' . $order->billing['lastname']) .
-                               tep_draw_hidden_field('bill_addr_1', $order->billing['street_address']) .
-                               tep_draw_hidden_field('bill_addr_2', $order->billing['suburb']) .
-                               tep_draw_hidden_field('bill_city', $order->billing['city']) .
-                               tep_draw_hidden_field('bill_state', $order->billing['state']) .
-                               tep_draw_hidden_field('bill_post_code', $order->billing['postcode']) .
-                               tep_draw_hidden_field('bill_country', $order->billing['country']['title']) .
-                               tep_draw_hidden_field('bill_tel', $order->customer['telephone']) .
-                               tep_draw_hidden_field('bill_email', $order->customer['email_address']) .
-                               tep_draw_hidden_field('ship_name', $order->delivery['firstname'] . ' ' . $order->delivery['lastname']) .
-                               tep_draw_hidden_field('ship_addr_1', $order->delivery['street_address']) .
-                               tep_draw_hidden_field('ship_addr_2', $order->delivery['suburb']) .
-                               tep_draw_hidden_field('ship_city', $order->delivery['city']) .
-                               tep_draw_hidden_field('ship_state', $order->delivery['state']) .
-                               tep_draw_hidden_field('ship_post_code', $order->delivery['postcode']) .
-                               tep_draw_hidden_field('ship_country', $order->delivery['country']['title']) .
-                               tep_draw_hidden_field('currency', $sec_currency) .
-                               tep_draw_hidden_field('callback', tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', false) . ';' . tep_href_link(FILENAME_CHECKOUT_PAYMENT, 'payment_error=' . $this->code, 'SSL', false)) .
-                               tep_draw_hidden_field(tep_session_name(), tep_session_id()) .
-                               tep_draw_hidden_field('options', 'test_status=' . $test_status . ',dups=false,cb_post=true,cb_flds=' . tep_session_name());
-
-      return $process_button_string;
-    }
-
-    function before_process() {
-      global $HTTP_POST_VARS;
-
-      if ($HTTP_POST_VARS['valid'] == 'true') {
-        if ($remote_host = getenv('REMOTE_HOST')) {
-          if ($remote_host != 'secpay.com') {
-            $remote_host = gethostbyaddr($remote_host);
-          }
-          if ($remote_host != 'secpay.com') {
-            tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, tep_session_name() . '=' . $HTTP_POST_VARS[tep_session_name()] . '&payment_error=' . $this->code, 'SSL', false, false));
-          }
-        } else {
-          tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, tep_session_name() . '=' . $HTTP_POST_VARS[tep_session_name()] . '&payment_error=' . $this->code, 'SSL', false, false));
-        }
-      }
-    }
-
-    function after_process() {
-      return false;
-    }
-
-    function get_error() {
-      global $HTTP_GET_VARS;
-
-      if (isset($HTTP_GET_VARS['message']) && (strlen($HTTP_GET_VARS['message']) > 0)) {
-        $error = stripslashes(urldecode($HTTP_GET_VARS['message']));
-      } else {
-        $error = MODULE_PAYMENT_SECPAY_TEXT_ERROR_MESSAGE;
-      }
-
-      return array('title' => MODULE_PAYMENT_SECPAY_TEXT_ERROR,
-                   'error' => $error);
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_SECPAY_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable SECpay Module', 'MODULE_PAYMENT_SECPAY_STATUS', 'True', 'Do you want to accept SECPay payments?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Merchant ID', 'MODULE_PAYMENT_SECPAY_MERCHANT_ID', 'secpay', 'Merchant ID to use for the SECPay service', '6', '2', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Currency', 'MODULE_PAYMENT_SECPAY_CURRENCY', 'Any Currency', 'The currency to use for credit card transactions', '6', '3', 'tep_cfg_select_option(array(\'Any Currency\', \'Default Currency\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_SECPAY_TEST_STATUS', 'Always Successful', 'Transaction mode to use for the SECPay service', '6', '4', 'tep_cfg_select_option(array(\'Always Successful\', \'Always Fail\', \'Production\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_SECPAY_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_SECPAY_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_SECPAY_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-    }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_SECPAY_STATUS', 'MODULE_PAYMENT_SECPAY_MERCHANT_ID', 'MODULE_PAYMENT_SECPAY_CURRENCY', 'MODULE_PAYMENT_SECPAY_TEST_STATUS', 'MODULE_PAYMENT_SECPAY_ZONE', 'MODULE_PAYMENT_SECPAY_ORDER_STATUS_ID', 'MODULE_PAYMENT_SECPAY_SORT_ORDER');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/sofortueberweisung_direct.php 2.3.1.src/includes/modules/payment/sofortueberweisung_direct.php
--- 2.2rc2a.cp.src/includes/modules/payment/sofortueberweisung_direct.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/sofortueberweisung_direct.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: sofortueberweisung_direct.php 1782 2008-01-10 01:10:52Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/payment/worldpay_junior.php 2.3.1.src/includes/modules/payment/worldpay_junior.php
--- 2.2rc2a.cp.src/includes/modules/payment/worldpay_junior.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/payment/worldpay_junior.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,576 +0,0 @@
-<?php
-/*
-  $Id: worldpay_junior.php 1807 2008-01-13 00:50:08Z hpdl $
-
-  osCommerce, Open Source E-Commerce Solutions
-  http://www.oscommerce.com
-
-  Copyright (c) 2008 osCommerce
-
-  Released under the GNU General Public License
-*/
-
-  class worldpay_junior {
-    var $code, $title, $description, $enabled;
-
-// class constructor
-    function worldpay_junior() {
-      global $order;
-
-      $this->signature = 'worldpay|worldpay_junior|1.0|2.2';
-
-      $this->code = 'worldpay_junior';
-      $this->title = MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_TITLE;
-      $this->public_title = MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_PUBLIC_TITLE;
-      $this->description = MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_DESCRIPTION;
-      $this->sort_order = MODULE_PAYMENT_WORLDPAY_JUNIOR_SORT_ORDER;
-      $this->enabled = ((MODULE_PAYMENT_WORLDPAY_JUNIOR_STATUS == 'True') ? true : false);
-
-      if ((int)MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID > 0) {
-        $this->order_status = MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID;
-      }
-
-      if (is_object($order)) $this->update_status();
-
-      $this->form_action_url = 'https://select.worldpay.com/wcc/purchase';
-    }
-
-// class methods
-    function update_status() {
-      global $order;
-
-      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_WORLDPAY_JUNIOR_ZONE > 0) ) {
-        $check_flag = false;
-        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_WORLDPAY_JUNIOR_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
-        while ($check = tep_db_fetch_array($check_query)) {
-          if ($check['zone_id'] < 1) {
-            $check_flag = true;
-            break;
-          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
-            $check_flag = true;
-            break;
-          }
-        }
-
-        if ($check_flag == false) {
-          $this->enabled = false;
-        }
-      }
-    }
-
-    function javascript_validation() {
-      return false;
-    }
-
-    function selection() {
-      global $cart_Worldpay_Junior_ID;
-
-      if (tep_session_is_registered('cart_Worldpay_Junior_ID')) {
-        $order_id = substr($cart_Worldpay_Junior_ID, strpos($cart_Worldpay_Junior_ID, '-')+1);
-
-        $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
-
-        if (tep_db_num_rows($check_query) < 1) {
-          tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
-          tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
-          tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
-          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
-          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
-          tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
-
-          tep_session_unregister('cart_Worldpay_Junior_ID');
-        }
-      }
-
-      return array('id' => $this->code,
-                   'module' => $this->public_title);
-    }
-
-    function pre_confirmation_check() {
-      global $cartID, $cart;
-
-      if (empty($cart->cartID)) {
-        $cartID = $cart->cartID = $cart->generate_cart_id();
-      }
-
-      if (!tep_session_is_registered('cartID')) {
-        tep_session_register('cartID');
-      }
-    }
-
-    function confirmation() {
-      global $cartID, $cart_Worldpay_Junior_ID, $customer_id, $languages_id, $order, $order_total_modules;
-
-      $insert_order = false;
-
-      if (tep_session_is_registered('cart_Worldpay_Junior_ID')) {
-        $order_id = substr($cart_Worldpay_Junior_ID, strpos($cart_Worldpay_Junior_ID, '-')+1);
-
-        $curr_check = tep_db_query("select currency from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
-        $curr = tep_db_fetch_array($curr_check);
-
-        if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_Worldpay_Junior_ID, 0, strlen($cartID))) ) {
-          $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');
-
-          if (tep_db_num_rows($check_query) < 1) {
-            tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
-            tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
-            tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
-            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
-            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
-            tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
-          }
-
-          $insert_order = true;
-        }
-      } else {
-        $insert_order = true;
-      }
-
-      if ($insert_order == true) {
-        $order_totals = array();
-        if (is_array($order_total_modules->modules)) {
-          reset($order_total_modules->modules);
-          while (list(, $value) = each($order_total_modules->modules)) {
-            $class = substr($value, 0, strrpos($value, '.'));
-            if ($GLOBALS[$class]->enabled) {
-              for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {
-                if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {
-                  $order_totals[] = array('code' => $GLOBALS[$class]->code,
-                                          'title' => $GLOBALS[$class]->output[$i]['title'],
-                                          'text' => $GLOBALS[$class]->output[$i]['text'],
-                                          'value' => $GLOBALS[$class]->output[$i]['value'],
-                                          'sort_order' => $GLOBALS[$class]->sort_order);
-                }
-              }
-            }
-          }
-        }
-
-        $sql_data_array = array('customers_id' => $customer_id,
-                                'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
-                                'customers_company' => $order->customer['company'],
-                                'customers_street_address' => $order->customer['street_address'],
-                                'customers_suburb' => $order->customer['suburb'],
-                                'customers_city' => $order->customer['city'],
-                                'customers_postcode' => $order->customer['postcode'],
-                                'customers_state' => $order->customer['state'],
-                                'customers_country' => $order->customer['country']['title'],
-                                'customers_telephone' => $order->customer['telephone'],
-                                'customers_email_address' => $order->customer['email_address'],
-                                'customers_address_format_id' => $order->customer['format_id'],
-                                'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
-                                'delivery_company' => $order->delivery['company'],
-                                'delivery_street_address' => $order->delivery['street_address'],
-                                'delivery_suburb' => $order->delivery['suburb'],
-                                'delivery_city' => $order->delivery['city'],
-                                'delivery_postcode' => $order->delivery['postcode'],
-                                'delivery_state' => $order->delivery['state'],
-                                'delivery_country' => $order->delivery['country']['title'],
-                                'delivery_address_format_id' => $order->delivery['format_id'],
-                                'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
-                                'billing_company' => $order->billing['company'],
-                                'billing_street_address' => $order->billing['street_address'],
-                                'billing_suburb' => $order->billing['suburb'],
-                                'billing_city' => $order->billing['city'],
-                                'billing_postcode' => $order->billing['postcode'],
-                                'billing_state' => $order->billing['state'],
-                                'billing_country' => $order->billing['country']['title'],
-                                'billing_address_format_id' => $order->billing['format_id'],
-                                'payment_method' => $order->info['payment_method'],
-                                'cc_type' => $order->info['cc_type'],
-                                'cc_owner' => $order->info['cc_owner'],
-                                'cc_number' => $order->info['cc_number'],
-                                'cc_expires' => $order->info['cc_expires'],
-                                'date_purchased' => 'now()',
-                                'orders_status' => $order->info['order_status'],
-                                'currency' => $order->info['currency'],
-                                'currency_value' => $order->info['currency_value']);
-
-        tep_db_perform(TABLE_ORDERS, $sql_data_array);
-
-        $insert_id = tep_db_insert_id();
-
-        for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
-          $sql_data_array = array('orders_id' => $insert_id,
-                                  'title' => $order_totals[$i]['title'],
-                                  'text' => $order_totals[$i]['text'],
-                                  'value' => $order_totals[$i]['value'],
-                                  'class' => $order_totals[$i]['code'],
-                                  'sort_order' => $order_totals[$i]['sort_order']);
-
-          tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
-        }
-
-        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
-          $sql_data_array = array('orders_id' => $insert_id,
-                                  'products_id' => tep_get_prid($order->products[$i]['id']),
-                                  'products_model' => $order->products[$i]['model'],
-                                  'products_name' => $order->products[$i]['name'],
-                                  'products_price' => $order->products[$i]['price'],
-                                  'final_price' => $order->products[$i]['final_price'],
-                                  'products_tax' => $order->products[$i]['tax'],
-                                  'products_quantity' => $order->products[$i]['qty']);
-
-          tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
-
-          $order_products_id = tep_db_insert_id();
-
-          $attributes_exist = '0';
-          if (isset($order->products[$i]['attributes'])) {
-            $attributes_exist = '1';
-            for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
-              if (DOWNLOAD_ENABLED == 'true') {
-                $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
-                                     from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
-                                     left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
-                                     on pa.products_attributes_id=pad.products_attributes_id
-                                     where pa.products_id = '" . $order->products[$i]['id'] . "'
-                                     and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
-                                     and pa.options_id = popt.products_options_id
-                                     and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
-                                     and pa.options_values_id = poval.products_options_values_id
-                                     and popt.language_id = '" . $languages_id . "'
-                                     and poval.language_id = '" . $languages_id . "'";
-                $attributes = tep_db_query($attributes_query);
-              } else {
-                $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
-              }
-              $attributes_values = tep_db_fetch_array($attributes);
-
-              $sql_data_array = array('orders_id' => $insert_id,
-                                      'orders_products_id' => $order_products_id,
-                                      'products_options' => $attributes_values['products_options_name'],
-                                      'products_options_values' => $attributes_values['products_options_values_name'],
-                                      'options_values_price' => $attributes_values['options_values_price'],
-                                      'price_prefix' => $attributes_values['price_prefix']);
-
-              tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
-
-              if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
-                $sql_data_array = array('orders_id' => $insert_id,
-                                        'orders_products_id' => $order_products_id,
-                                        'orders_products_filename' => $attributes_values['products_attributes_filename'],
-                                        'download_maxdays' => $attributes_values['products_attributes_maxdays'],
-                                        'download_count' => $attributes_values['products_attributes_maxcount']);
-
-                tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
-              }
-            }
-          }
-        }
-
-        $cart_Worldpay_Junior_ID = $cartID . '-' . $insert_id;
-        tep_session_register('cart_Worldpay_Junior_ID');
-      }
-
-      return false;
-    }
-
-    function process_button() {
-      global $order, $currency, $languages_id, $language, $customer_id, $cart_Worldpay_Junior_ID;
-
-      $order_id = substr($cart_Worldpay_Junior_ID, strpos($cart_Worldpay_Junior_ID, '-')+1);
-
-      $lang_query = tep_db_query("select code from " . TABLE_LANGUAGES . " where languages_id = '" . (int)$languages_id . "'");
-      $lang = tep_db_fetch_array($lang_query);
-
-      $process_button_string = tep_draw_hidden_field('instId', MODULE_PAYMENT_WORLDPAY_JUNIOR_INSTALLATION_ID) .
-                               tep_draw_hidden_field('amount', $this->format_raw($order->info['total'])) .
-                               tep_draw_hidden_field('currency', $currency) .
-                               tep_draw_hidden_field('hideCurrency', 'true') .
-                               tep_draw_hidden_field('cartId', $order_id) .
-                               tep_draw_hidden_field('desc', STORE_NAME) .
-                               tep_draw_hidden_field('name', $order->billing['firstname'] . ' ' . $order->billing['lastname']) .
-                               tep_draw_hidden_field('address', $order->billing['street_address']) .
-                               tep_draw_hidden_field('postcode', $order->billing['postcode']) .
-                               tep_draw_hidden_field('country', $order->billing['country']['iso_code_2']) .
-                               tep_draw_hidden_field('tel', $order->customer['telephone']) .
-                               tep_draw_hidden_field('email', $order->customer['email_address']) .
-                               tep_draw_hidden_field('fixContact', 'Y') .
-                               tep_draw_hidden_field('lang', strtoupper($lang['code'])) .
-                               tep_draw_hidden_field('signatureFields', 'amount:currency:cartId') .
-                               tep_draw_hidden_field('signature', md5(MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD . ':' . $this->format_raw($order->info['total']) . ':' . $currency . ':' . $order_id)) .
-                               tep_draw_hidden_field('MC_callback', substr(tep_href_link('ext/modules/payment/worldpay/junior_callback.php', '', 'NONSSL', false, false), strpos(tep_href_link('ext/modules/payment/worldpay/junior_callback.php', '', 'NONSSL', false, false), '://')+3));
-
-      if (MODULE_PAYMENT_WORLDPAY_JUNIOR_TRANSACTION_METHOD == 'Pre-Authorization') {
-        $process_button_string .= tep_draw_hidden_field('authMode', 'E');
-      }
-
-      if (MODULE_PAYMENT_WORLDPAY_JUNIOR_TESTMODE == 'True') {
-        $process_button_string .= tep_draw_hidden_field('testMode', '100');
-      }
-
-      $process_button_string .= tep_draw_hidden_field('M_sid', tep_session_id()) .
-                                tep_draw_hidden_field('M_cid', $customer_id) .
-                                tep_draw_hidden_field('M_lang', $language) .
-                                tep_draw_hidden_field('M_hash', md5(tep_session_id() . $customer_id . $order_id . $language . number_format($order->info['total'], 2) . MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD));
-
-      return $process_button_string;
-    }
-
-    function before_process() {
-      global $customer_id, $language, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart, $cart_Worldpay_Junior_ID;
-      global $$payment;
-
-      $order_id = substr($cart_Worldpay_Junior_ID, strpos($cart_Worldpay_Junior_ID, '-')+1);
-
-      $check_query = tep_db_query("select orders_status from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
-      if (tep_db_num_rows($check_query)) {
-        $check = tep_db_fetch_array($check_query);
-
-        if ($check['orders_status'] == MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID) {
-          $hash_result = false;
-
-          if (isset($HTTP_GET_VARS['hash']) && !empty($HTTP_GET_VARS['hash']) && ($HTTP_GET_VARS['hash'] == md5(tep_session_name() . $customer_id . $order_id . $language . number_format($order->info['total'], 2) . MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD))) {
-            $hash_result = true;
-          }
-
-          $sql_data_array = array('orders_id' => $order_id,
-                                  'orders_status_id' => MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID,
-                                  'date_added' => 'now()',
-                                  'customer_notified' => '0',
-                                  'comments' => (($hash_result == true) ? 'WorldPay: Transaction Verified' : 'WorldPay: Incorrect Transaction Hash'));
-
-          tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-
-          if (MODULE_PAYMENT_WORLDPAY_JUNIOR_TESTMODE == 'True') {
-            $sql_data_array = array('orders_id' => $order_id,
-                                    'orders_status_id' => MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID,
-                                    'date_added' => 'now()',
-                                    'customer_notified' => '0',
-                                    'comments' => MODULE_PAYMENT_WORLDPAY_JUNIOR_TEXT_WARNING_DEMO_MODE);
-
-            tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-          }
-        }
-      }
-
-      tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . (MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID) . "', last_modified = now() where orders_id = '" . (int)$order_id . "'");
-
-      $sql_data_array = array('orders_id' => $order_id,
-                              'orders_status_id' => (MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID),
-                              'date_added' => 'now()',
-                              'customer_notified' => (SEND_EMAILS == 'true') ? '1' : '0',
-                              'comments' => $order->info['comments']);
-
-      tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
-
-// initialized for the email confirmation
-      $products_ordered = '';
-      $subtotal = 0;
-      $total_tax = 0;
-
-      for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
-// Stock Update - Joao Correia
-        if (STOCK_LIMITED == 'true') {
-          if (DOWNLOAD_ENABLED == 'true') {
-            $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
-                                FROM " . TABLE_PRODUCTS . " p
-                                LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
-                                ON p.products_id=pa.products_id
-                                LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
-                                ON pa.products_attributes_id=pad.products_attributes_id
-                                WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
-// Will work with only one option for downloadable products
-// otherwise, we have to build the query dynamically with a loop
-            $products_attributes = $order->products[$i]['attributes'];
-            if (is_array($products_attributes)) {
-              $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
-            }
-            $stock_query = tep_db_query($stock_query_raw);
-          } else {
-            $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
-          }
-          if (tep_db_num_rows($stock_query) > 0) {
-            $stock_values = tep_db_fetch_array($stock_query);
-// do not decrement quantities if products_attributes_filename exists
-            if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
-              $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
-            } else {
-              $stock_left = $stock_values['products_quantity'];
-            }
-            tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
-            if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
-              tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
-            }
-          }
-        }
-
-// Update products_ordered (for bestsellers list)
-        tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
-
-//------insert customer choosen option to order--------
-        $attributes_exist = '0';
-        $products_ordered_attributes = '';
-        if (isset($order->products[$i]['attributes'])) {
-          $attributes_exist = '1';
-          for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
-            if (DOWNLOAD_ENABLED == 'true') {
-              $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
-                                   from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
-                                   left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
-                                   on pa.products_attributes_id=pad.products_attributes_id
-                                   where pa.products_id = '" . $order->products[$i]['id'] . "'
-                                   and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
-                                   and pa.options_id = popt.products_options_id
-                                   and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
-                                   and pa.options_values_id = poval.products_options_values_id
-                                   and popt.language_id = '" . $languages_id . "'
-                                   and poval.language_id = '" . $languages_id . "'";
-              $attributes = tep_db_query($attributes_query);
-            } else {
-              $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
-            }
-            $attributes_values = tep_db_fetch_array($attributes);
-
-            $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
-          }
-        }
-//------insert customer choosen option eof ----
-        $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
-        $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
-        $total_cost += $total_products_price;
-
-        $products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";
-      }
-
-// lets start with the email confirmation
-      $email_order = STORE_NAME . "\n" .
-                     EMAIL_SEPARATOR . "\n" .
-                     EMAIL_TEXT_ORDER_NUMBER . ' ' . $order_id . "\n" .
-                     EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $order_id, 'SSL', false) . "\n" .
-                     EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
-      if ($order->info['comments']) {
-        $email_order .= tep_db_output($order->info['comments']) . "\n\n";
-      }
-      $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
-                      EMAIL_SEPARATOR . "\n" .
-                      $products_ordered .
-                      EMAIL_SEPARATOR . "\n";
-
-      for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
-        $email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
-      }
-
-      if ($order->content_type != 'virtual') {
-        $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
-                        EMAIL_SEPARATOR . "\n" .
-                        tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
-      }
-
-      $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
-                      EMAIL_SEPARATOR . "\n" .
-                      tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
-
-      if (is_object($$payment)) {
-        $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
-                        EMAIL_SEPARATOR . "\n";
-        $payment_class = $$payment;
-        $email_order .= $payment_class->title . "\n\n";
-        if ($payment_class->email_footer) {
-          $email_order .= $payment_class->email_footer . "\n\n";
-        }
-      }
-
-      tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
-
-// send emails to other people
-      if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
-        tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
-      }
-
-// load the after_process function from the payment modules
-      $this->after_process();
-
-      $cart->reset(true);
-
-// unregister session variables used during checkout
-      tep_session_unregister('sendto');
-      tep_session_unregister('billto');
-      tep_session_unregister('shipping');
-      tep_session_unregister('payment');
-      tep_session_unregister('comments');
-
-      tep_session_unregister('cart_Worldpay_Junior_ID');
-
-      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
-    }
-
-    function after_process() {
-      return false;
-    }
-
-    function get_error() {
-      return false;
-    }
-
-    function check() {
-      if (!isset($this->_check)) {
-        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_WORLDPAY_JUNIOR_STATUS'");
-        $this->_check = tep_db_num_rows($check_query);
-      }
-      return $this->_check;
-    }
-
-    function install() {
-      $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Preparing [WorldPay]' limit 1");
-
-      if (tep_db_num_rows($check_query) < 1) {
-        $status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
-        $status = tep_db_fetch_array($status_query);
-
-        $status_id = $status['status_id']+1;
-
-        $languages = tep_get_languages();
-
-        for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
-          tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $status_id . "', '" . $languages[$i]['id'] . "', 'Preparing [WorldPay]')");
-        }
-
-        $flags_query = tep_db_query("describe " . TABLE_ORDERS_STATUS . " public_flag");
-        if (tep_db_num_rows($flags_query) == 1) {
-          tep_db_query("update " . TABLE_ORDERS_STATUS . " set public_flag = 0 and downloads_flag = 0 where orders_status_id = '" . $status_id . "'");
-        }
-      } else {
-        $check = tep_db_fetch_array($check_query);
-
-        $status_id = $check['orders_status_id'];
-      }
-
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable WorldPay Select Junior', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_STATUS', 'False', 'Do you want to accept WorldPay Select Junior payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Installation ID', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_INSTALLATION_ID', '', 'Your WorldPay Installation ID', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Callback Password', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_CALLBACK_PASSWORD', '', 'A password that is sent back in the callback response (specified in the WorldPay Customer Management System)', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('MD5 Password', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD', '', 'The MD5 secret encryption password used to validate transaction responses with (specified in the WorldPay Customer Management System)', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Method', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_TRANSACTION_METHOD', 'Capture', 'The processing method to use for each transaction', '6', '0', 'tep_cfg_select_option(array(\'Pre-Authorization\', \'Capture\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Test Mode', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_TESTMODE', 'True', 'Process transactions in test mode?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Preparing Order Status', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID', '" . (int)$status_id . "', 'Set the status of prepared orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
-    }
-
-    function remove() {
-      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
-    }
-
-    function keys() {
-      return array('MODULE_PAYMENT_WORLDPAY_JUNIOR_STATUS', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_INSTALLATION_ID', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_CALLBACK_PASSWORD', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_MD5_PASSWORD', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_TRANSACTION_METHOD', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_TESTMODE', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_ZONE', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_ORDER_STATUS_ID', 'MODULE_PAYMENT_WORLDPAY_JUNIOR_SORT_ORDER');
-    }
-
-// format prices without currency formatting
-    function format_raw($number, $currency_code = '', $currency_value = '') {
-      global $currencies, $currency;
-
-      if (empty($currency_code) || !$this->is_set($currency_code)) {
-        $currency_code = $currency;
-      }
-
-      if (empty($currency_value) || !is_numeric($currency_value)) {
-        $currency_value = $currencies->currencies[$currency_code]['value'];
-      }
-
-      return number_format(tep_round($number * $currency_value, $currencies->currencies[$currency_code]['decimal_places']), $currencies->currencies[$currency_code]['decimal_places'], '.', '');
-    }
-  }
-?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/product_listing.php 2.3.1.src/includes/modules/product_listing.php
--- 2.2rc2a.cp.src/includes/modules/product_listing.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/product_listing.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,31 +1,43 @@
 <?php
 /*
-  $Id: product_listing.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   $listing_split = new splitPageResults($listing_sql, MAX_DISPLAY_SEARCH_RESULTS, 'p.products_id');
+?>
+
+  <div class="contentText">
 
+<?php
   if ( ($listing_split->number_of_rows > 0) && ( (PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3') ) ) {
 ?>
-<table border="0" width="100%" cellspacing="0" cellpadding="2">
-  <tr>
-    <td class="smallText"><?php echo $listing_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?></td>
-    <td class="smallText" align="right"><?php echo TEXT_RESULT_PAGE . ' ' . $listing_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-  </tr>
-</table>
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $listing_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $listing_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?></span>
+    </div>
+
+    <br />
+
 <?php
   }
 
-  $list_box_contents = array();
+  $prod_list_contents = '<div class="ui-widget infoBoxContainer">' .
+                        '  <div class="ui-widget-header ui-corner-top infoBoxHeading">' .
+                        '    <table border="0" width="100%" cellspacing="0" cellpadding="2" class="productListingHeader">' .
+                        '      <tr>';
 
   for ($col=0, $n=sizeof($column_list); $col<$n; $col++) {
+    $lc_align = '';
+
     switch ($column_list[$col]) {
       case 'PRODUCT_LIST_MODEL':
         $lc_text = TABLE_HEADING_MODEL;
@@ -65,100 +77,95 @@
       $lc_text = tep_create_sort_heading($HTTP_GET_VARS['sort'], $col+1, $lc_text);
     }
 
-    $list_box_contents[0][] = array('align' => $lc_align,
-                                    'params' => 'class="productListing-heading"',
-                                    'text' => '&nbsp;' . $lc_text . '&nbsp;');
+    $prod_list_contents .= '        <td' . (tep_not_null($lc_align) ? ' align="' . $lc_align . '"' : '') . '>' . $lc_text . '</td>';
   }
 
+  $prod_list_contents .= '      </tr>' .
+                         '    </table>' .
+                         '  </div>';
+
   if ($listing_split->number_of_rows > 0) {
     $rows = 0;
     $listing_query = tep_db_query($listing_split->sql_query);
+
+    $prod_list_contents .= '  <div class="ui-widget-content ui-corner-bottom productListTable">' .
+                           '    <table border="0" width="100%" cellspacing="0" cellpadding="2" class="productListingData">';
+
     while ($listing = tep_db_fetch_array($listing_query)) {
       $rows++;
 
-      if (($rows/2) == floor($rows/2)) {
-        $list_box_contents[] = array('params' => 'class="productListing-even"');
-      } else {
-        $list_box_contents[] = array('params' => 'class="productListing-odd"');
-      }
-
-      $cur_row = sizeof($list_box_contents) - 1;
+      $prod_list_contents .= '      <tr>';
 
       for ($col=0, $n=sizeof($column_list); $col<$n; $col++) {
-        $lc_align = '';
-
         switch ($column_list[$col]) {
           case 'PRODUCT_LIST_MODEL':
-            $lc_align = '';
-            $lc_text = '&nbsp;' . $listing['products_model'] . '&nbsp;';
+            $prod_list_contents .= '        <td>' . $listing['products_model'] . '</td>';
             break;
           case 'PRODUCT_LIST_NAME':
-            $lc_align = '';
-            if (isset($HTTP_GET_VARS['manufacturers_id'])) {
-              $lc_text = '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id'] . '&products_id=' . $listing['products_id']) . '">' . $listing['products_name'] . '</a>';
+            if (isset($HTTP_GET_VARS['manufacturers_id']) && tep_not_null($HTTP_GET_VARS['manufacturers_id'])) {
+              $prod_list_contents .= '        <td><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id'] . '&products_id=' . $listing['products_id']) . '">' . $listing['products_name'] . '</a></td>';
             } else {
-              $lc_text = '&nbsp;<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, ($cPath ? 'cPath=' . $cPath . '&' : '') . 'products_id=' . $listing['products_id']) . '">' . $listing['products_name'] . '</a>&nbsp;';
+              $prod_list_contents .= '        <td><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, ($cPath ? 'cPath=' . $cPath . '&' : '') . 'products_id=' . $listing['products_id']) . '">' . $listing['products_name'] . '</a></td>';
             }
             break;
           case 'PRODUCT_LIST_MANUFACTURER':
-            $lc_align = '';
-            $lc_text = '&nbsp;<a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $listing['manufacturers_id']) . '">' . $listing['manufacturers_name'] . '</a>&nbsp;';
+            $prod_list_contents .= '        <td><a href="' . tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $listing['manufacturers_id']) . '">' . $listing['manufacturers_name'] . '</a></td>';
             break;
           case 'PRODUCT_LIST_PRICE':
-            $lc_align = 'right';
             if (tep_not_null($listing['specials_new_products_price'])) {
-              $lc_text = '&nbsp;<s>' .  $currencies->display_price($listing['products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '</s>&nbsp;&nbsp;<span class="productSpecialPrice">' . $currencies->display_price($listing['specials_new_products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '</span>&nbsp;';
+              $prod_list_contents .= '        <td align="right"><del>' .  $currencies->display_price($listing['products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '</del>&nbsp;&nbsp;<span class="productSpecialPrice">' . $currencies->display_price($listing['specials_new_products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '</span></td>';
             } else {
-              $lc_text = '&nbsp;' . $currencies->display_price($listing['products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '&nbsp;';
+              $prod_list_contents .= '        <td align="right">' . $currencies->display_price($listing['products_price'], tep_get_tax_rate($listing['products_tax_class_id'])) . '</td>';
             }
             break;
           case 'PRODUCT_LIST_QUANTITY':
-            $lc_align = 'right';
-            $lc_text = '&nbsp;' . $listing['products_quantity'] . '&nbsp;';
+            $prod_list_contents .= '        <td align="right">' . $listing['products_quantity'] . '</td>';
             break;
           case 'PRODUCT_LIST_WEIGHT':
-            $lc_align = 'right';
-            $lc_text = '&nbsp;' . $listing['products_weight'] . '&nbsp;';
+            $prod_list_contents .= '        <td align="right">' . $listing['products_weight'] . '</td>';
             break;
           case 'PRODUCT_LIST_IMAGE':
-            $lc_align = 'center';
-            if (isset($HTTP_GET_VARS['manufacturers_id'])) {
-              $lc_text = '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id'] . '&products_id=' . $listing['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $listing['products_image'], $listing['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>';
+            if (isset($HTTP_GET_VARS['manufacturers_id'])  && tep_not_null($HTTP_GET_VARS['manufacturers_id'])) {
+              $prod_list_contents .= '        <td align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id'] . '&products_id=' . $listing['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $listing['products_image'], $listing['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></td>';
             } else {
-              $lc_text = '&nbsp;<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, ($cPath ? 'cPath=' . $cPath . '&' : '') . 'products_id=' . $listing['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $listing['products_image'], $listing['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>&nbsp;';
+              $prod_list_contents .= '        <td align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, ($cPath ? 'cPath=' . $cPath . '&' : '') . 'products_id=' . $listing['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $listing['products_image'], $listing['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></td>';
             }
             break;
           case 'PRODUCT_LIST_BUY_NOW':
-            $lc_align = 'center';
-            $lc_text = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id']) . '">' . tep_image_button('button_buy_now.gif', IMAGE_BUTTON_BUY_NOW) . '</a>&nbsp;';
+            $prod_list_contents .= '        <td align="center">' . tep_draw_button(IMAGE_BUTTON_BUY_NOW, 'cart', tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id'])) . '</td>';
             break;
         }
-
-        $list_box_contents[$cur_row][] = array('align' => $lc_align,
-                                               'params' => 'class="productListing-data"',
-                                               'text'  => $lc_text);
       }
+
+      $prod_list_contents .= '      </tr>';
     }
 
-    new productListingBox($list_box_contents);
+    $prod_list_contents .= '    </table>' .
+                           '  </div>' .
+                           '</div>';
+
+    echo $prod_list_contents;
   } else {
-    $list_box_contents = array();
+?>
 
-    $list_box_contents[0] = array('params' => 'class="productListing-odd"');
-    $list_box_contents[0][] = array('params' => 'class="productListing-data"',
-                                   'text' => TEXT_NO_PRODUCTS);
+    <p><?php echo TEXT_NO_PRODUCTS; ?></p>
 
-    new productListingBox($list_box_contents);
+<?php
   }
 
   if ( ($listing_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3')) ) {
 ?>
-<table border="0" width="100%" cellspacing="0" cellpadding="2">
-  <tr>
-    <td class="smallText"><?php echo $listing_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?></td>
-    <td class="smallText" align="right"><?php echo TEXT_RESULT_PAGE . ' ' . $listing_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-  </tr>
-</table>
+
+    <br />
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $listing_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $listing_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS); ?></span>
+    </div>
+
 <?php
   }
 ?>
+
+  </div>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/shipping/flat.php 2.3.1.src/includes/modules/shipping/flat.php
--- 2.2rc2a.cp.src/includes/modules/shipping/flat.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/shipping/flat.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: flat.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/shipping/item.php 2.3.1.src/includes/modules/shipping/item.php
--- 2.2rc2a.cp.src/includes/modules/shipping/item.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/shipping/item.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: item.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2008 osCommerce
 
   Released under the GNU General Public License
 */
@@ -46,13 +46,15 @@
 
 // class methods
     function quote($method = '') {
-      global $order, $total_count;
+      global $order;
+
+      $number_of_items = $this->getNumberOfItems();
 
       $this->quotes = array('id' => $this->code,
                             'module' => MODULE_SHIPPING_ITEM_TEXT_TITLE,
                             'methods' => array(array('id' => $this->code,
                                                      'title' => MODULE_SHIPPING_ITEM_TEXT_WAY,
-                                                     'cost' => (MODULE_SHIPPING_ITEM_COST * $total_count) + MODULE_SHIPPING_ITEM_HANDLING)));
+                                                     'cost' => (MODULE_SHIPPING_ITEM_COST * $number_of_items) + MODULE_SHIPPING_ITEM_HANDLING)));
 
       if ($this->tax_class > 0) {
         $this->quotes['tax'] = tep_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
@@ -87,5 +89,33 @@
     function keys() {
       return array('MODULE_SHIPPING_ITEM_STATUS', 'MODULE_SHIPPING_ITEM_COST', 'MODULE_SHIPPING_ITEM_HANDLING', 'MODULE_SHIPPING_ITEM_TAX_CLASS', 'MODULE_SHIPPING_ITEM_ZONE', 'MODULE_SHIPPING_ITEM_SORT_ORDER');
     }
+
+    function getNumberOfItems() {
+      global $order, $total_count;
+
+      $number_of_items = $total_count;
+
+      if ($order->content_type == 'mixed') {
+        $number_of_items = 0;
+
+        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+          $number_of_items += $order->products[$i]['qty'];
+
+          if (isset($order->products[$i]['attributes'])) {
+            reset($order->products[$i]['attributes']);
+            while (list($option, $value) = each($order->products[$i]['attributes'])) {
+              $virtual_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad where pa.products_id = '" . (int)$order->products[$i]['id'] . "' and pa.options_values_id = '" . (int)$value['value_id'] . "' and pa.products_attributes_id = pad.products_attributes_id");
+              $virtual_check = tep_db_fetch_array($virtual_check_query);
+
+              if ($virtual_check['total'] > 0) {
+                $number_of_items -= $order->products[$i]['qty'];
+              }
+            }
+          }
+        }
+      }
+
+      return $number_of_items;
+    }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/shipping/table.php 2.3.1.src/includes/modules/shipping/table.php
--- 2.2rc2a.cp.src/includes/modules/shipping/table.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/shipping/table.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: table.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2008 osCommerce
 
   Released under the GNU General Public License
 */
@@ -46,15 +46,15 @@
 
 // class methods
     function quote($method = '') {
-      global $order, $cart, $shipping_weight, $shipping_num_boxes;
+      global $order, $shipping_weight, $shipping_num_boxes;
 
       if (MODULE_SHIPPING_TABLE_MODE == 'price') {
-        $order_total = $cart->show_total();
+        $order_total = $this->getShippableTotal();
       } else {
         $order_total = $shipping_weight;
       }
 
-      $table_cost = split("[:,]" , MODULE_SHIPPING_TABLE_COST);
+      $table_cost = preg_split("/[:,]/" , MODULE_SHIPPING_TABLE_COST);
       $size = sizeof($table_cost);
       for ($i=0, $n=$size; $i<$n; $i+=2) {
         if ($order_total <= $table_cost[$i]) {
@@ -107,5 +107,33 @@
     function keys() {
       return array('MODULE_SHIPPING_TABLE_STATUS', 'MODULE_SHIPPING_TABLE_COST', 'MODULE_SHIPPING_TABLE_MODE', 'MODULE_SHIPPING_TABLE_HANDLING', 'MODULE_SHIPPING_TABLE_TAX_CLASS', 'MODULE_SHIPPING_TABLE_ZONE', 'MODULE_SHIPPING_TABLE_SORT_ORDER');
     }
+
+    function getShippableTotal() {
+      global $order, $cart, $currencies;
+
+      $order_total = $cart->show_total();
+
+      if ($order->content_type == 'mixed') {
+        $order_total = 0;
+
+        for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
+          $order_total += $currencies->calculate_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']);
+
+          if (isset($order->products[$i]['attributes'])) {
+            reset($order->products[$i]['attributes']);
+            while (list($option, $value) = each($order->products[$i]['attributes'])) {
+              $virtual_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad where pa.products_id = '" . (int)$order->products[$i]['id'] . "' and pa.options_values_id = '" . (int)$value['value_id'] . "' and pa.products_attributes_id = pad.products_attributes_id");
+              $virtual_check = tep_db_fetch_array($virtual_check_query);
+
+              if ($virtual_check['total'] > 0) {
+                $order_total -= $currencies->calculate_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']);
+              }
+            }
+          }
+        }
+      }
+
+      return $order_total;
+    }
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/shipping/usps.php 2.3.1.src/includes/modules/shipping/usps.php
--- 2.2rc2a.cp.src/includes/modules/shipping/usps.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/shipping/usps.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: usps.php 1783 2008-01-10 01:16:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -8,6 +8,9 @@
   Copyright (c) 2008 osCommerce
 
   Released under the GNU General Public License
+
+  Based on USPS Methods 26-Feb-2010
+  http://addons.oscommerce.com/info/487
 */
 
   class usps {
@@ -43,20 +46,36 @@
         }
       }
 
-      $this->types = array('EXPRESS' => 'Express Mail',
-                           'FIRST CLASS' => 'First-Class Mail',
-                           'PRIORITY' => 'Priority Mail',
-                           'PARCEL' => 'Parcel Post');
-
-      $this->intl_types = array('Global Express Guaranteed',
-                                'Global Express Guaranteed Non-Document Rectangular',
-                                'Global Express Guaranteed Non-Document Non-Rectangular',
-                                'Express Mail International (EMS)',
-                                'Express Mail International (EMS) Flat Rate Envelope',
-                                'Priority Mail International',
-                                'Priority Mail International Flat Rate Envelope',
-                                'Priority Mail International Flat Rate Box',
-                                'First-Class Mail International');
+      $this->types = array(
+// Domestic Types
+                           'Express Mail',
+                           'Express Mail Flat Rate Envelope',
+                           'Priority Mail',
+                           'Priority Mail Flat Rate Envelope',
+                           'Priority Mail Small Flat Rate Box',
+                           'Priority Mail Medium Flat Rate Box',
+                           'Priority Mail Large Flat Rate Box',
+                           'First-Class Mail Flat',
+                           'First-Class Mail Parcel',
+                           'Parcel Post',
+                           'Bound Printed Matter',
+                           'Media Mail',
+                           'Library Mail',
+// International Types
+                           'Global Express Guaranteed (GXG)',
+                           'Global Express Guaranteed Non-Document Rectangular',
+                           'Global Express Guaranteed Non-Document Non-Rectangular',
+                           'USPS GXG Envelopes',
+                           'Express Mail International',
+                           'Express Mail International Flat Rate Envelope',
+                           'Priority Mail International',
+                           'Priority Mail International Large Flat Rate Box',
+                           'Priority Mail International Medium Flat Rate Box',
+                           'Priority Mail International Small Flat Rate Box',
+                           'Priority Mail International Flat Rate Envelope',
+                           'First-Class Mail International Package',
+                           'First-Class Mail International Large Envelope'
+                          );
 
       $this->countries = $this->country_list();
     }
@@ -65,9 +84,9 @@
     function quote($method = '') {
       global $order, $shipping_weight, $shipping_num_boxes;
 
-      if ( tep_not_null($method) && (isset($this->types[$method]) || in_array($method, $this->intl_types)) ) {
-        $this->_setService($method);
-      }
+      // if ( tep_not_null($method) && in_array($method, $this->types)) {
+      //   $this->_setService($method);
+      // }
 
       $this->_setMachinable('False');
       $this->_setContainer('None');
@@ -78,9 +97,7 @@
       $shipping_pounds = floor ($shipping_weight);
       $shipping_ounces = round(16 * ($shipping_weight - floor($shipping_weight)));
       $this->_setWeight($shipping_pounds, $shipping_ounces);
-
       $uspsQuote = $this->_getQuote();
-
       if (is_array($uspsQuote)) {
         if (isset($uspsQuote['error'])) {
           $this->quotes = array('module' => $this->title,
@@ -94,9 +111,14 @@
           for ($i=0; $i<$size; $i++) {
             list($type, $cost) = each($uspsQuote[$i]);
 
-            $methods[] = array('id' => $type,
-                               'title' => ((isset($this->types[$type])) ? $this->types[$type] : $type),
+// echo "USPS $type @ $cost<br />";
+	    if (($method == '' && in_array($type, $this->types)) || $method == $type) {
+	       if (strpos($type, "Flat Rate")) $type_flat = $type . ', subject to verification';
+	       else $type_flat = $type;
+               $methods[] = array('id' => $type,
+                               'title' => $type_flat,
                                'cost' => ($cost + MODULE_SHIPPING_USPS_HANDLING) * $shipping_num_boxes);
+            }
           }
 
           $this->quotes['methods'] = $methods;
@@ -166,39 +188,29 @@
       global $order;
 
       if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {
-        $request  = '<RateRequest USERID="' . MODULE_SHIPPING_USPS_USERID . '" PASSWORD="' . MODULE_SHIPPING_USPS_PASSWORD . '">';
-        $services_count = 0;
-
-        if (isset($this->service)) {
-          $this->types = array($this->service => $this->types[$this->service]);
-        }
-
         $dest_zip = str_replace(' ', '', $order->delivery['postcode']);
         if ($order->delivery['country']['iso_code_2'] == 'US') $dest_zip = substr($dest_zip, 0, 5);
-
-        reset($this->types);
-        while (list($key, $value) = each($this->types)) {
-          $request .= '<Package ID="' . $services_count . '">' .
-                      '<Service>' . $key . '</Service>' .
-                      '<ZipOrigination>' . SHIPPING_ORIGIN_ZIP . '</ZipOrigination>' .
-                      '<ZipDestination>' . $dest_zip . '</ZipDestination>' .
-                      '<Pounds>' . $this->pounds . '</Pounds>' .
-                      '<Ounces>' . $this->ounces . '</Ounces>' .
-                      '<Container>' . $this->container . '</Container>' .
-                      '<Size>' . $this->size . '</Size>' .
-                      '<Machinable>' . $this->machinable . '</Machinable>' .
-                      '</Package>';
-          $services_count++;
-        }
-        $request .= '</RateRequest>';
-
-        $request = 'API=Rate&XML=' . urlencode($request);
+	$request = '<RateV3Request USERID="' . MODULE_SHIPPING_USPS_USERID . '">' .
+	    '<Package ID="0">' .
+	      '<Service>' . 'ALL' . '</Service>' .
+              '<ZipOrigination>' . SHIPPING_ORIGIN_ZIP . '</ZipOrigination>' .
+              '<ZipDestination>' . $dest_zip . '</ZipDestination>' .
+	      '<Pounds>' . $this->pounds . '</Pounds>' .
+	      '<Ounces>' . $this->ounces . '</Ounces>' .
+	      '<Container/><Size>Regular</Size><Machinable>True</Machinable>' .
+	    '</Package></RateV3Request>';
+        $request = 'API=RateV3&XML=' . urlencode($request);
       } else {
-        $request  = '<IntlRateRequest USERID="' . MODULE_SHIPPING_USPS_USERID . '" PASSWORD="' . MODULE_SHIPPING_USPS_PASSWORD . '">' .
+        $request  = '<IntlRateRequest USERID="' . MODULE_SHIPPING_USPS_USERID . '">' .
                     '<Package ID="0">' .
                     '<Pounds>' . $this->pounds . '</Pounds>' .
                     '<Ounces>' . $this->ounces . '</Ounces>' .
                     '<MailType>Package</MailType>' .
+		    '<GXG>' .
+		    '<Length>12</Length><Width>12</Width><Height>12</Height>' .
+		    '<POBoxFlag>N</POBoxFlag><GiftFlag>N</GiftFlag>' .
+		    '</GXG>' .
+		    '<ValueOfContents>50</ValueOfContents>' .
                     '<Country>' . $this->countries[$order->delivery['country']['iso_code_2']] . '</Country>' .
                     '</Package>' .
                     '</IntlRateRequest>';
@@ -217,14 +229,12 @@
         $http->addHeader('Host', 'production.shippingapis.com');
         $http->addHeader('User-Agent', 'osCommerce');
         $http->addHeader('Connection', 'Close');
-
         if ($http->Get('/shippingapi.dll?' . $request)) $body = $http->getBody();
 
         $http->Disconnect();
       } else {
         return false;
       }
-
       $response = array();
       while (true) {
         if ($start = strpos($body, '<Package ID=')) {
@@ -236,14 +246,13 @@
           break;
         }
       }
-
       $rates = array();
       if ($order->delivery['country']['id'] == SHIPPING_ORIGIN_COUNTRY) {
         if (sizeof($response) == '1') {
-          if (ereg('<Error>', $response[0])) {
-            $number = ereg('<Number>(.*)</Number>', $response[0], $regs);
+          if (preg_match('/<Error>/', $response[0])) {
+            $number = preg_match('/<Number>(.*)<\/Number>/', $response[0], $regs);
             $number = $regs[1];
-            $description = ereg('<Description>(.*)</Description>', $response[0], $regs);
+            $description = preg_match('/<Description>(.*)<\/Description>/', $response[0], $regs);
             $description = $regs[1];
 
             return array('error' => $number . ' - ' . $description);
@@ -252,20 +261,27 @@
 
         $n = sizeof($response);
         for ($i=0; $i<$n; $i++) {
-          if (strpos($response[$i], '<Postage>')) {
-            $service = ereg('<Service>(.*)</Service>', $response[$i], $regs);
+	  $resp = $response[$i];
+	  $pos = 0;
+	  while (1) {
+	    $pos = strpos($response[$i], '<Postage', $pos);
+            if ($pos === FALSE) break;
+	    $end = strpos($response[$i], '</Postage>', $pos);
+	    if ($end === FALSE) break;
+	    $resp = substr($response[$i], $pos, $end-$pos);
+            $service = preg_match('/<MailService>(.*)<\/MailService>/', $resp, $regs);
             $service = $regs[1];
-            $postage = ereg('<Postage>(.*)</Postage>', $response[$i], $regs);
+            $postage = preg_match('/<Rate>(.*)<\/Rate>/', $resp, $regs);
             $postage = $regs[1];
-
+	    $pos = $end;
             $rates[] = array($service => $postage);
           }
         }
       } else {
-        if (ereg('<Error>', $response[0])) {
-          $number = ereg('<Number>(.*)</Number>', $response[0], $regs);
+        if (preg_match('/<Error>/', $response[0])) {
+          $number = preg_match('/<Number>(.*)<\/Number>/', $response[0], $regs);
           $number = $regs[1];
-          $description = ereg('<Description>(.*)</Description>', $response[0], $regs);
+          $description = preg_match('/<Description>(.*)<\/Description>/', $response[0], $regs);
           $description = $regs[1];
 
           return array('error' => $number . ' - ' . $description);
@@ -286,9 +302,9 @@
           $size = sizeof($services);
           for ($i=0, $n=$size; $i<$n; $i++) {
             if (strpos($services[$i], '<Postage>')) {
-              $service = ereg('<SvcDescription>(.*)</SvcDescription>', $services[$i], $regs);
+              $service = preg_match('/<SvcDescription>(.*)<\/SvcDescription>/', $services[$i], $regs);
               $service = $regs[1];
-              $postage = ereg('<Postage>(.*)</Postage>', $services[$i], $regs);
+              $postage = preg_match('/<Postage>(.*)<\/Postage>/', $services[$i], $regs);
               $postage = $regs[1];
 
               if (isset($this->service) && ($service != $this->service) ) {
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/shipping/zones.php 2.3.1.src/includes/modules/shipping/zones.php
--- 2.2rc2a.cp.src/includes/modules/shipping/zones.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/shipping/zones.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,7 +1,7 @@
 <?php
 /*
 
-  $Id: zones.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -121,7 +121,7 @@
 
       for ($i=1; $i<=$this->num_zones; $i++) {
         $countries_table = constant('MODULE_SHIPPING_ZONES_COUNTRIES_' . $i);
-        $country_zones = split("[,]", $countries_table);
+        $country_zones = preg_split("/[,]/", $countries_table);
         if (in_array($dest_country, $country_zones)) {
           $dest_zone = $i;
           break;
@@ -134,7 +134,7 @@
         $shipping = -1;
         $zones_cost = constant('MODULE_SHIPPING_ZONES_COST_' . $dest_zone);
 
-        $zones_table = split("[:,]" , $zones_cost);
+        $zones_table = preg_split("/[:,]/" , $zones_cost);
         $size = sizeof($zones_table);
         for ($i=0; $i<$size; $i+=2) {
           if ($shipping_weight <= $zones_table[$i]) {
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_digg.php 2.3.1.src/includes/modules/social_bookmarks/sb_digg.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_digg.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_digg.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_digg {
+    var $code = 'sb_digg';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'digg.png';
+    var $enabled = false;
+
+    function sb_digg() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_DIGG_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_DIGG_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_DIGG_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_DIGG_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_DIGG_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_DIGG_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      return '<a href="http://digg.com/submit?url=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . '" target="_blank"><img src="images/social_bookmarks/' . $this->icon . '" border="0" title="' . tep_output_string_protected($this->public_title) . '" alt="' . tep_output_string_protected($this->public_title) . '"/></a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_DIGG_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Digg Module', 'MODULE_SOCIAL_BOOKMARKS_DIGG_STATUS', 'True', 'Do you want to allow products to be shared through Digg?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_DIGG_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_DIGG_STATUS', 'MODULE_SOCIAL_BOOKMARKS_DIGG_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_email.php 2.3.1.src/includes/modules/social_bookmarks/sb_email.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_email.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_email.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_email {
+    var $code = 'sb_email';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'email.png';
+    var $enabled = false;
+
+    function sb_email() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_EMAIL_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_EMAIL_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_EMAIL_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_EMAIL_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_EMAIL_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_EMAIL_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      return '<a href="' . tep_href_link(FILENAME_TELL_A_FRIEND, 'products_id=' . $HTTP_GET_VARS['products_id']) . '"><img src="images/social_bookmarks/' . $this->icon . '" border="0" title="' . tep_output_string_protected($this->public_title) . '" alt="' . tep_output_string_protected($this->public_title) . '" /></a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_EMAIL_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable E-Mail Module', 'MODULE_SOCIAL_BOOKMARKS_EMAIL_STATUS', 'True', 'Do you want to allow products to be shared through e-mail?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_EMAIL_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_EMAIL_STATUS', 'MODULE_SOCIAL_BOOKMARKS_EMAIL_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_facebook_like.php 2.3.1.src/includes/modules/social_bookmarks/sb_facebook_like.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_facebook_like.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_facebook_like.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,78 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_facebook_like {
+    var $code = 'sb_facebook_like';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'facebook.png';
+    var $enabled = false;
+
+    function sb_facebook_like() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      $style = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STYLE == 'Standard') ? 'standard' : 'button_count';
+      $faces = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_FACES == 'True') ? 'true' : 'false';
+      $width = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_WIDTH;
+      $action = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_VERB == 'Like') ? 'like' : 'recommend';
+      $scheme = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SCHEME == 'Light') ? 'light' : 'dark';
+
+      return '<iframe src="http://www.facebook.com/plugins/like.php?href=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . '&amp;layout=' . $style . '&amp;show_faces=' . $faces . '&amp;width=' . $width . '&amp;action=' . $action . '&amp;colorscheme=' . $scheme . '&amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:' . $width . 'px; height:35px;" allowTransparency="true"></iframe>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Facebook Like Module', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STATUS', 'True', 'Do you want to allow products to be shared through Facebook Like?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Layout Style', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STYLE', 'Standard', 'Determines the size and amount of social context next to the button.', '6', '1', 'tep_cfg_select_option(array(\'Standard\', \'Button Count\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Show Faces', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_FACES', 'False', 'Show profile pictures below the button?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Width', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_WIDTH', '125', 'The width of the iframe in pixels.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Verb to Display', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_VERB', 'Like', 'The verb to display in the button.', '6', '1', 'tep_cfg_select_option(array(\'Like\', \'Recommend\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Color Scheme', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SCHEME', 'Light', 'The color scheme of the button.', '6', '1', 'tep_cfg_select_option(array(\'Light\', \'Dark\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STATUS', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_STYLE', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_FACES', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_WIDTH', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_VERB', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SCHEME', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_LIKE_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_facebook.php 2.3.1.src/includes/modules/social_bookmarks/sb_facebook.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_facebook.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_facebook.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_facebook {
+    var $code = 'sb_facebook';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'facebook.png';
+    var $enabled = false;
+
+    function sb_facebook() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_FACEBOOK_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_FACEBOOK_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      return '<a href="http://www.facebook.com/share.php?u=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . '" target="_blank"><img src="images/social_bookmarks/' . $this->icon . '" border="0" title="' . tep_output_string_protected($this->public_title) . '" alt="' . tep_output_string_protected($this->public_title) . '" /></a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Facebook Module', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_STATUS', 'True', 'Do you want to allow products to be shared through Facebook?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_FACEBOOK_STATUS', 'MODULE_SOCIAL_BOOKMARKS_FACEBOOK_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_google_buzz.php 2.3.1.src/includes/modules/social_bookmarks/sb_google_buzz.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_google_buzz.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_google_buzz.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_google_buzz {
+    var $code = 'sb_google_buzz';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'google_buzz.png';
+    var $enabled = false;
+
+    function sb_google_buzz() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      return '<a href="http://www.google.com/buzz/post?url=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . '" target="_blank"><img src="images/social_bookmarks/' . $this->icon . '" border="0" title="' . tep_output_string_protected($this->public_title) . '" alt="' . tep_output_string_protected($this->public_title) . '" /></a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Google Buzz Module', 'MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_STATUS', 'True', 'Do you want to allow products to be shared through Google Buzz?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_STATUS', 'MODULE_SOCIAL_BOOKMARKS_GOOGLE_BUZZ_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_twitter_button.php 2.3.1.src/includes/modules/social_bookmarks/sb_twitter_button.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_twitter_button.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_twitter_button.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,89 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_twitter_button {
+    var $code = 'sb_twitter_button';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'twitter.png';
+    var $enabled = false;
+
+    function sb_twitter_button() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      $params = array('url=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)));
+
+      if ( strlen(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_ACCOUNT) > 0 ) {
+        $params[] = 'via=' . urlencode(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_ACCOUNT);
+      }
+
+      if ( strlen(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT) > 0 ) {
+        $params[] = 'related=' . urlencode(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT) . ((strlen(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT_DESC) > 0) ? ':' . urlencode(MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT_DESC) : '');
+      }
+
+      if ( MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_COUNT_POSITION == 'Vertical' ) {
+        $params[] = 'count=vertical';
+      } elseif ( MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_COUNT_POSITION == 'None' ) {
+        $params[] = 'count=none';
+      }
+
+      $params = implode('&', $params);
+
+      return '<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script><a href="http://twitter.com/share?' . $params . '" target="_blank" class="twitter-share-button">' . tep_output_string_protected($this->public_title) . '</a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Twitter Button Module', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_STATUS', 'True', 'Do you want to allow products to be shared through Twitter Button?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Shop Owner Twitter Account', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_ACCOUNT', '', 'The Twitter account to attribute the tweet to and is recommended to the user to follow.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Related Twitter Account', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT', '', 'A related Twitter account that is also recommended to the user to follow.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Related Twitter Account Description', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT_DESC', '', 'A description for the related Twitter account.', '6', '0', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Count Position', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_COUNT_POSITION', 'Horizontal', 'The position of the counter.', '6', '0', 'tep_cfg_select_option(array(\'Horizontal\', \'Vertical\', \'None\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_STATUS', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_ACCOUNT', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_RELATED_ACCOUNT_DESC', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_COUNT_POSITION', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_BUTTON_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_twitter.php 2.3.1.src/includes/modules/social_bookmarks/sb_twitter.php
--- 2.2rc2a.cp.src/includes/modules/social_bookmarks/sb_twitter.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/modules/social_bookmarks/sb_twitter.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,67 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  class sb_twitter {
+    var $code = 'sb_twitter';
+    var $title;
+    var $description;
+    var $sort_order;
+    var $icon = 'twitter.png';
+    var $enabled = false;
+
+    function sb_twitter() {
+      $this->title = MODULE_SOCIAL_BOOKMARKS_TWITTER_TITLE;
+      $this->public_title = MODULE_SOCIAL_BOOKMARKS_TWITTER_PUBLIC_TITLE;
+      $this->description = MODULE_SOCIAL_BOOKMARKS_TWITTER_DESCRIPTION;
+
+      if ( defined('MODULE_SOCIAL_BOOKMARKS_TWITTER_STATUS') ) {
+        $this->sort_order = MODULE_SOCIAL_BOOKMARKS_TWITTER_SORT_ORDER;
+        $this->enabled = (MODULE_SOCIAL_BOOKMARKS_TWITTER_STATUS == 'True');
+      }
+    }
+
+    function getOutput() {
+      global $HTTP_GET_VARS;
+
+      return '<a href="http://twitter.com/home?status=' . urlencode(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . '" target="_blank"><img src="images/social_bookmarks/' . $this->icon . '" border="0" title="' . tep_output_string_protected($this->public_title) . '" alt="' . tep_output_string_protected($this->public_title) . '" /></a>';
+    }
+
+    function isEnabled() {
+      return $this->enabled;
+    }
+
+    function getIcon() {
+      return $this->icon;
+    }
+
+    function getPublicTitle() {
+      return $this->public_title;
+    }
+
+    function check() {
+      return defined('MODULE_SOCIAL_BOOKMARKS_TWITTER_STATUS');
+    }
+
+    function install() {
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Twitter Module', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_STATUS', 'True', 'Do you want to allow products to be shared through Twitter?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
+      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
+    }
+
+    function remove() {
+      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
+    }
+
+    function keys() {
+      return array('MODULE_SOCIAL_BOOKMARKS_TWITTER_STATUS', 'MODULE_SOCIAL_BOOKMARKS_TWITTER_SORT_ORDER');
+    }
+  }
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/modules/upcoming_products.php 2.3.1.src/includes/modules/upcoming_products.php
--- 2.2rc2a.cp.src/includes/modules/upcoming_products.php	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/modules/upcoming_products.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: upcoming_products.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,38 +13,28 @@
   $expected_query = tep_db_query("select p.products_id, pd.products_name, products_date_available as date_expected from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where to_days(products_date_available) >= to_days(now()) and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by " . EXPECTED_PRODUCTS_FIELD . " " . EXPECTED_PRODUCTS_SORT . " limit " . MAX_DISPLAY_UPCOMING_PRODUCTS);
   if (tep_db_num_rows($expected_query) > 0) {
 ?>
-<!-- upcoming_products //-->
-          <tr>
-            <td><br><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="tableHeading">&nbsp;<?php echo TABLE_HEADING_UPCOMING_PRODUCTS; ?>&nbsp;</td>
-                <td align="right" class="tableHeading">&nbsp;<?php echo TABLE_HEADING_DATE_EXPECTED; ?>&nbsp;</td>
-              </tr>
-              <tr>
-                <td colspan="2"><?php echo tep_draw_separator(); ?></td>
-              </tr>
-              <tr>
+
+  <div class="ui-widget infoBoxContainer">
+    <div class="ui-widget-header ui-corner-top infoBoxHeading">
+      <span><?php echo TABLE_HEADING_UPCOMING_PRODUCTS; ?></span>
+      <span style="float: right;"><?php echo TABLE_HEADING_DATE_EXPECTED; ?></span>
+    </div>
+
+    <div class="ui-widget-content ui-corner-bottom">
+      <table border="0" width="100%" cellspacing="0" cellpadding="2" class="productListTable">
 <?php
-    $row = 0;
     while ($expected = tep_db_fetch_array($expected_query)) {
-      $row++;
-      if (($row / 2) == floor($row / 2)) {
-        echo '              <tr class="upcomingProducts-even">' . "\n";
-      } else {
-        echo '              <tr class="upcomingProducts-odd">' . "\n";
-      }
-
-      echo '                <td class="smallText">&nbsp;<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $expected['products_id']) . '">' . $expected['products_name'] . '</a>&nbsp;</td>' . "\n" .
-           '                <td align="right" class="smallText">&nbsp;' . tep_date_short($expected['date_expected']) . '&nbsp;</td>' . "\n" .
-           '              </tr>' . "\n";
+      echo '        <tr>' . "\n" .
+           '          <td><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $expected['products_id']) . '">' . $expected['products_name'] . '</a></td>' . "\n" .
+           '          <td align="right">' . tep_date_short($expected['date_expected']) . '</td>' . "\n" .
+           '        </tr>' . "\n";
     }
 ?>
-              <tr>
-                <td colspan="2"><?php echo tep_draw_separator(); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-<!-- upcoming_products_eof //-->
+
+      </table>
+    </div>
+  </div>
+
 <?php
   }
 ?>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/spiders.txt 2.3.1.src/includes/spiders.txt
--- 2.2rc2a.cp.src/includes/spiders.txt	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/spiders.txt	2010-11-15 03:42:36.000000000 -0600
@@ -1,4 +1,4 @@
-$Id: spiders.txt 1739 2007-12-20 00:52:16Z hpdl $
+$Id$
 almaden.ibm.com
 appie 1.1
 architext
diff -x .svn -aruN 2.2rc2a.cp.src/includes/template_bottom.php 2.3.1.src/includes/template_bottom.php
--- 2.2rc2a.cp.src/includes/template_bottom.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/template_bottom.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,45 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+?>
+
+</div> <!-- bodyContent //-->
+
+<?php
+  if ($oscTemplate->hasBlocks('boxes_column_left')) {
+?>
+
+<div id="columnLeft" class="grid_<?php echo $oscTemplate->getGridColumnWidth(); ?> pull_<?php echo $oscTemplate->getGridContentWidth(); ?>">
+  <?php echo $oscTemplate->getBlocks('boxes_column_left'); ?>
+</div>
+
+<?php
+  }
+
+  if ($oscTemplate->hasBlocks('boxes_column_right')) {
+?>
+
+<div id="columnRight" class="grid_<?php echo $oscTemplate->getGridColumnWidth(); ?>">
+  <?php echo $oscTemplate->getBlocks('boxes_column_right'); ?>
+</div>
+
+<?php
+  }
+?>
+
+<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
+
+</div> <!-- bodyWrapper //-->
+
+<?php echo $oscTemplate->getBlocks('footer_scripts'); ?>
+
+</body>
+</html>
diff -x .svn -aruN 2.2rc2a.cp.src/includes/template_top.php 2.3.1.src/includes/template_top.php
--- 2.2rc2a.cp.src/includes/template_top.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/template_top.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,57 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  $oscTemplate->buildBlocks();
+
+  if (!$oscTemplate->hasBlocks('boxes_column_left')) {
+    $oscTemplate->setGridContentWidth($oscTemplate->getGridContentWidth() + $oscTemplate->getGridColumnWidth());
+  }
+
+  if (!$oscTemplate->hasBlocks('boxes_column_right')) {
+    $oscTemplate->setGridContentWidth($oscTemplate->getGridContentWidth() + $oscTemplate->getGridColumnWidth());
+  }
+?>
+<!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" <?php echo HTML_PARAMS; ?>>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
+<title><?php echo tep_output_string_protected($oscTemplate->getTitle()); ?></title>
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>" />
+<link rel="stylesheet" type="text/css" href="ext/jquery/ui/redmond/jquery-ui-1.8.6.css" />
+<script type="text/javascript" src="ext/jquery/jquery-1.4.2.min.js"></script>
+<script type="text/javascript" src="ext/jquery/ui/jquery-ui-1.8.6.min.js"></script>
+
+<?php
+  if (tep_not_null(JQUERY_DATEPICKER_I18N_CODE)) {
+?>
+<script type="text/javascript" src="ext/jquery/ui/i18n/jquery.ui.datepicker-<?php echo JQUERY_DATEPICKER_I18N_CODE; ?>.js"></script>
+<script type="text/javascript">
+$.datepicker.setDefaults($.datepicker.regional['<?php echo JQUERY_DATEPICKER_I18N_CODE; ?>']);
+</script>
+<?php
+  }
+?>
+
+<script type="text/javascript" src="ext/jquery/bxGallery/jquery.bxGallery.1.1.min.js"></script>
+<link rel="stylesheet" type="text/css" href="ext/jquery/fancybox/jquery.fancybox-1.3.4.css" />
+<script type="text/javascript" src="ext/jquery/fancybox/jquery.fancybox-1.3.4.pack.js"></script>
+<link rel="stylesheet" type="text/css" href="ext/960gs/<?php echo ((stripos(HTML_PARAMS, 'dir="rtl"') !== false) ? 'rtl_' : ''); ?>960_24_col.css" />
+<link rel="stylesheet" type="text/css" href="stylesheet.css" />
+<?php echo $oscTemplate->getBlocks('header_tags'); ?>
+</head>
+<body>
+
+<div id="bodyWrapper" class="container_<?php echo $oscTemplate->getGridContainerWidth(); ?>">
+
+<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
+
+<div id="bodyContent" class="grid_<?php echo $oscTemplate->getGridContentWidth(); ?> <?php echo ($oscTemplate->hasBlocks('boxes_column_left') ? 'push_' . $oscTemplate->getGridColumnWidth() : ''); ?>">
diff -x .svn -aruN 2.2rc2a.cp.src/includes/tld.txt 2.3.1.src/includes/tld.txt
--- 2.2rc2a.cp.src/includes/tld.txt	2008-01-31 16:34:14.000000000 -0600
+++ 2.3.1.src/includes/tld.txt	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-# $Id: tld.txt 1739 2007-12-20 00:52:16Z hpdl $
-#
-# osCommerce, Open Source E-Commerce Solutions
-# http://www.oscommerce.com
-#
-# Copyright (c) 2003 osCommerce
-#
-# Released under the GNU General Public License
-#
-# Original 7 TLDs
-com     # all are eligible to register
-edu     # degree-granting educational institutions of higher education
-gov     # United States Government
-int     # organizations established by international treaties
-mil     # United States Military
-net     # all are eligible to register
-org     # noncommercial community, all are eligible to register
-
-# Recent additions
-aero    # members of the air-transport industry
-biz     # businesses
-coop    # cooperative associations
-info    # all are eligible to register
-museum  # museums
-name    # individuals
-pro     # credentialed professionals
diff -x .svn -aruN 2.2rc2a.cp.src/includes/version.php 2.3.1.src/includes/version.php
--- 2.2rc2a.cp.src/includes/version.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/version.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1 @@
+2.3.1
\ No newline at end of file
diff -x .svn -aruN 2.2rc2a.cp.src/includes/work/.htaccess 2.3.1.src/includes/work/.htaccess
--- 2.2rc2a.cp.src/includes/work/.htaccess	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/includes/work/.htaccess	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,4 @@
+<Files *>
+  Order Deny,Allow
+  Deny from all
+</Files>
diff -x .svn -aruN 2.2rc2a.cp.src/index.php 2.3.1.src/index.php
--- 2.2rc2a.cp.src/index.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/index.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: index.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -16,8 +16,8 @@
   $category_depth = 'top';
   if (isset($cPath) && tep_not_null($cPath)) {
     $categories_products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = '" . (int)$current_category_id . "'");
-    $cateqories_products = tep_db_fetch_array($categories_products_query);
-    if ($cateqories_products['total'] > 0) {
+    $categories_products = tep_db_fetch_array($categories_products_query);
+    if ($categories_products['total'] > 0) {
       $category_depth = 'products'; // display products
     } else {
       $category_parent_query = tep_db_query("select count(*) as total from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$current_category_id . "'");
@@ -31,51 +31,20 @@
   }
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_DEFAULT);
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if ($category_depth == 'nested') {
     $category_query = tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$current_category_id . "' and cd.categories_id = '" . (int)$current_category_id . "' and cd.language_id = '" . (int)$languages_id . "'");
     $category = tep_db_fetch_array($category_query);
 ?>
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . $category['categories_image'], $category['categories_name'], HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo $category['categories_name']; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
 <?php
     if (isset($cPath) && strpos('_', $cPath)) {
 // check to see if there are deeper categories within the current category
@@ -101,28 +70,26 @@
       $rows++;
       $cPath_new = tep_get_path($categories['categories_id']);
       $width = (int)(100 / MAX_DISPLAY_CATEGORIES_PER_ROW) . '%';
-      echo '                <td align="center" class="smallText" width="' . $width . '" valign="top"><a href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">' . tep_image(DIR_WS_IMAGES . $categories['categories_image'], $categories['categories_name'], SUBCATEGORY_IMAGE_WIDTH, SUBCATEGORY_IMAGE_HEIGHT) . '<br>' . $categories['categories_name'] . '</a></td>' . "\n";
+      echo '        <td align="center" class="smallText" width="' . $width . '" valign="top"><a href="' . tep_href_link(FILENAME_DEFAULT, $cPath_new) . '">' . tep_image(DIR_WS_IMAGES . $categories['categories_image'], $categories['categories_name'], SUBCATEGORY_IMAGE_WIDTH, SUBCATEGORY_IMAGE_HEIGHT) . '<br />' . $categories['categories_name'] . '</a></td>' . "\n";
       if ((($rows / MAX_DISPLAY_CATEGORIES_PER_ROW) == floor($rows / MAX_DISPLAY_CATEGORIES_PER_ROW)) && ($rows != $number_of_categories)) {
-        echo '              </tr>' . "\n";
-        echo '              <tr>' . "\n";
+        echo '      </tr>' . "\n";
+        echo '      <tr>' . "\n";
       }
     }
 
 // needed for the new products module shown below
     $new_products_category_id = $current_category_id;
 ?>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td><?php include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS); ?></td>
-          </tr>
-        </table></td>
       </tr>
-    </table></td>
+    </table>
+
+    <br />
+
+<?php include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS); ?>
+
+  </div>
+</div>
+
 <?php
   } elseif ($category_depth == 'products' || isset($HTTP_GET_VARS['manufacturers_id'])) {
 // create column list
@@ -188,7 +155,7 @@
       }
     }
 
-    if ( (!isset($HTTP_GET_VARS['sort'])) || (!ereg('^[1-8][ad]$', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
+    if ( (!isset($HTTP_GET_VARS['sort'])) || (!preg_match('/^[1-8][ad]$/', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
       for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
         if ($column_list[$i] == 'PRODUCT_LIST_NAME') {
           $HTTP_GET_VARS['sort'] = $i+1 . 'a';
@@ -224,12 +191,23 @@
           break;
       }
     }
+
+    $catname = HEADING_TITLE;
+    if (isset($HTTP_GET_VARS['manufacturers_id'])) {
+      $image = tep_db_query("select manufacturers_image, manufacturers_name as catname from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
+      $image = tep_db_fetch_array($image);
+      $catname = $image['catname'];
+    } elseif ($current_category_id) {
+      $image = tep_db_query("select c.categories_image, cd.categories_name as catname from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$current_category_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'");
+      $image = tep_db_fetch_array($image);
+      $catname = $image['catname'];
+    }
 ?>
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
+
+<h1><?php echo $catname; ?></h1>
+
+<div class="contentContainer">
+
 <?php
 // optional Product List Filter
     if (PRODUCT_LIST_FILTER > 0) {
@@ -240,7 +218,7 @@
       }
       $filterlist_query = tep_db_query($filterlist_sql);
       if (tep_db_num_rows($filterlist_query) > 1) {
-        echo '            <td align="center" class="main">' . tep_draw_form('filter', FILENAME_DEFAULT, 'get') . TEXT_SHOW . '&nbsp;';
+        echo '<div>' . tep_draw_form('filter', FILENAME_DEFAULT, 'get') . '<p align="right">' . TEXT_SHOW . '&nbsp;';
         if (isset($HTTP_GET_VARS['manufacturers_id'])) {
           echo tep_draw_hidden_field('manufacturers_id', $HTTP_GET_VARS['manufacturers_id']);
           $options = array(array('id' => '', 'text' => TEXT_ALL_CATEGORIES));
@@ -253,88 +231,46 @@
           $options[] = array('id' => $filterlist['id'], 'text' => $filterlist['name']);
         }
         echo tep_draw_pull_down_menu('filter_id', $options, (isset($HTTP_GET_VARS['filter_id']) ? $HTTP_GET_VARS['filter_id'] : ''), 'onchange="this.form.submit()"');
-        echo tep_hide_session_id() . '</form></td>' . "\n";
+        echo tep_hide_session_id() . '</p></form></div>' . "\n";
       }
     }
 
-// Get the right image for the top-right
-    $image = DIR_WS_IMAGES . 'table_background_list.gif';
-    if (isset($HTTP_GET_VARS['manufacturers_id'])) {
-      $image = tep_db_query("select manufacturers_image from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
-      $image = tep_db_fetch_array($image);
-      $image = $image['manufacturers_image'];
-    } elseif ($current_category_id) {
-      $image = tep_db_query("select categories_image from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$current_category_id . "'");
-      $image = tep_db_fetch_array($image);
-      $image = $image['categories_image'];
-    }
+    include(DIR_WS_MODULES . FILENAME_PRODUCT_LISTING);
 ?>
-            <td align="right"><?php echo tep_image(DIR_WS_IMAGES . $image, HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><?php include(DIR_WS_MODULES . FILENAME_PRODUCT_LISTING); ?></td>
-      </tr>
-    </table></td>
+
+</div>
+
 <?php
   } else { // default page
 ?>
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_default.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="main"><?php echo tep_customer_greeting(); ?></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td class="main"><?php echo TEXT_MAIN; ?></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td><?php include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS); ?></td>
-          </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo tep_customer_greeting(); ?>
+  </div>
+
+<?php
+    if (tep_not_null(TEXT_MAIN)) {
+?>
+
+  <div class="contentText">
+    <?php echo TEXT_MAIN; ?>
+  </div>
+
 <?php
+    }
+
+    include(DIR_WS_MODULES . FILENAME_NEW_PRODUCTS);
     include(DIR_WS_MODULES . FILENAME_UPCOMING_PRODUCTS);
 ?>
-        </table></td>
-      </tr>
-    </table></td>
+
+</div>
+
 <?php
   }
+
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/info_shopping_cart.php 2.3.1.src/info_shopping_cart.php
--- 2.2rc2a.cp.src/info_shopping_cart.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/info_shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: info_shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,19 +16,19 @@
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_INFO_SHOPPING_CART);
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
 <title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>" />
+<link rel="stylesheet" type="text/css" href="stylesheet.css" />
 </head>
 <body>
-<p class="main"><b><?php echo HEADING_TITLE; ?></b><br><?php echo tep_draw_separator(); ?></p>
-<p class="main"><b><i><?php echo SUB_HEADING_TITLE_1; ?></i></b><br><?php echo SUB_HEADING_TEXT_1; ?></p>
-<p class="main"><b><i><?php echo SUB_HEADING_TITLE_2; ?></i></b><br><?php echo SUB_HEADING_TEXT_2; ?></p>
-<p class="main"><b><i><?php echo SUB_HEADING_TITLE_3; ?></i></b><br><?php echo SUB_HEADING_TEXT_3; ?></p>
+<p class="main"><strong><?php echo HEADING_TITLE; ?></strong><br /><?php echo tep_draw_separator(); ?></p>
+<p class="main"><strong><i><?php echo SUB_HEADING_TITLE_1; ?></i></strong><br /><?php echo SUB_HEADING_TEXT_1; ?></p>
+<p class="main"><strong><i><?php echo SUB_HEADING_TITLE_2; ?></i></strong><br /><?php echo SUB_HEADING_TEXT_2; ?></p>
+<p class="main"><strong><i><?php echo SUB_HEADING_TITLE_3; ?></i></strong><br /><?php echo SUB_HEADING_TEXT_3; ?></p>
 <p align="right" class="main"><a href="javascript:window.close();"><?php echo TEXT_CLOSE_WINDOW; ?></a></p>
 </body>
 </html>
diff -x .svn -aruN 2.2rc2a.cp.src/login.php 2.3.1.src/login.php
--- 2.2rc2a.cp.src/login.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/login.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: login.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,7 +20,7 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_LOGIN);
 
   $error = false;
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process')) {
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $email_address = tep_db_prepare_input($HTTP_POST_VARS['email_address']);
     $password = tep_db_prepare_input($HTTP_POST_VARS['password']);
 
@@ -38,6 +38,11 @@
           tep_session_recreate();
         }
 
+// migrate old hashed password to new phpass password
+        if (tep_password_type($check_customer['customers_password']) != 'phpass') {
+          tep_db_query("update " . TABLE_CUSTOMERS . " set customers_password = '" . tep_encrypt_password($password) . "' where customers_id = '" . (int)$check_customer['customers_id'] . "'");
+        }
+
         $check_country_query = tep_db_query("select entry_country_id, entry_zone_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$check_customer['customers_id'] . "' and address_book_id = '" . (int)$check_customer['customers_default_address_id'] . "'");
         $check_country = tep_db_fetch_array($check_country_query);
 
@@ -54,6 +59,9 @@
 
         tep_db_query("update " . TABLE_CUSTOMERS_INFO . " set customers_info_date_of_last_logon = now(), customers_info_number_of_logons = customers_info_number_of_logons+1 where customers_info_id = '" . (int)$customer_id . "'");
 
+// reset session token
+        $sessiontoken = md5(tep_rand() . tep_rand() . tep_rand() . tep_rand());
+
 // restore cart contents
         $cart->restore_contents();
 
@@ -73,159 +81,57 @@
   }
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_LOGIN, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function session_win() {
-  window.open("<?php echo tep_href_link(FILENAME_INFO_SHOPPING_CART); ?>","info_shopping_cart","height=460,width=430,toolbar=no,statusbar=no,scrollbars=yes").focus();
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('login', tep_href_link(FILENAME_LOGIN, 'action=process', 'SSL')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_login.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('login') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('login'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('login');
   }
-
-  if ($cart->count_contents() > 0) {
 ?>
+
+<div class="contentContainer" style="width: 45%; float: left;">
+  <h2><?php echo HEADING_NEW_CUSTOMER; ?></h2>
+
+  <div class="contentText">
+    <p><?php echo TEXT_NEW_CUSTOMER; ?></p>
+    <p><?php echo TEXT_NEW_CUSTOMER_INTRODUCTION; ?></p>
+
+    <p align="right"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL')); ?></p>
+  </div>
+</div>
+
+<div class="contentContainer" style="width: 45%; float: left; border-left: 1px dashed #ccc; padding-left: 3%; margin-left: 3%;">
+  <h2><?php echo HEADING_RETURNING_CUSTOMER; ?></h2>
+
+  <div class="contentText">
+    <p><?php echo TEXT_RETURNING_CUSTOMER; ?></p>
+
+    <?php echo tep_draw_form('login', tep_href_link(FILENAME_LOGIN, 'action=process', 'SSL'), 'post', '', true); ?>
+
+    <table border="0" cellspacing="0" cellpadding="2" width="100%">
       <tr>
-        <td class="smallText"><?php echo TEXT_VISITORS_CART; ?></td>
+        <td class="fieldKey"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('email_address'); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_PASSWORD; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_password_field('password'); ?></td>
       </tr>
+    </table>
+
+    <p><?php echo '<a href="' . tep_href_link(FILENAME_PASSWORD_FORGOTTEN, '', 'SSL') . '">' . TEXT_PASSWORD_FORGOTTEN . '</a>'; ?></p>
+
+    <p align="right"><?php echo tep_draw_button(IMAGE_BUTTON_LOGIN, 'key', null, 'primary'); ?></p>
+
+    </form>
+  </div>
+</div>
+
 <?php
-  }
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main" width="50%" valign="top"><b><?php echo HEADING_NEW_CUSTOMER; ?></b></td>
-            <td class="main" width="50%" valign="top"><b><?php echo HEADING_RETURNING_CUSTOMER; ?></b></td>
-          </tr>
-          <tr>
-            <td width="50%" height="100%" valign="top"><table border="0" width="100%" height="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" width="100%" height="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main" valign="top"><?php echo TEXT_NEW_CUSTOMER . '<br><br>' . TEXT_NEW_CUSTOMER_INTRODUCTION; ?></td>
-                  </tr>
-                  <tr>
-                    <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL') . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-            <td width="50%" height="100%" valign="top"><table border="0" width="100%" height="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" width="100%" height="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main" colspan="2"><?php echo TEXT_RETURNING_CUSTOMER; ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><b><?php echo ENTRY_EMAIL_ADDRESS; ?></b></td>
-                    <td class="main"><?php echo tep_draw_input_field('email_address'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><b><?php echo ENTRY_PASSWORD; ?></b></td>
-                    <td class="main"><?php echo tep_draw_password_field('password'); ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="smallText" colspan="2"><?php echo '<a href="' . tep_href_link(FILENAME_PASSWORD_FORGOTTEN, '', 'SSL') . '">' . TEXT_PASSWORD_FORGOTTEN . '</a>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-                  </tr>
-                  <tr>
-                    <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td align="right"><?php echo tep_image_submit('button_login.gif', IMAGE_BUTTON_LOGIN); ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/logoff.php 2.3.1.src/logoff.php
--- 2.2rc2a.cp.src/logoff.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/logoff.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: logoff.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -24,79 +24,23 @@
   tep_session_unregister('comments');
 
   $cart->reset();
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_MAIN; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td><?php echo tep_image(DIR_WS_IMAGES . 'table_background_man_on_board.gif', HEADING_TITLE); ?></td>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="pageHeading" align="center"><?php echo HEADING_TITLE; ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo TEXT_MAIN; ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/opensearch.php 2.3.1.src/opensearch.php
--- 2.2rc2a.cp.src/opensearch.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.3.1.src/opensearch.php	2010-11-15 03:42:36.000000000 -0600
@@ -0,0 +1,56 @@
+<?php
+/*
+  $Id$
+
+  osCommerce, Open Source E-Commerce Solutions
+  http://www.oscommerce.com
+
+  Copyright (c) 2010 osCommerce
+
+  Released under the GNU General Public License
+*/
+
+  header('Content-Type: text/xml');
+
+  require('includes/application_top.php');
+
+  if ( !defined('MODULE_HEADER_TAGS_OPENSEARCH_STATUS') || (MODULE_HEADER_TAGS_OPENSEARCH_STATUS != 'True') ) {
+    exit;
+  }
+
+  echo '<?xml version="1.0"?>' . "\n";
+?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">
+  <ShortName><?php echo tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_SHORT_NAME); ?></ShortName>
+  <Description><?php echo tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_DESCRIPTION); ?></Description>
+<?php
+  if (tep_not_null(MODULE_HEADER_TAGS_OPENSEARCH_SITE_CONTACT)) {
+    echo '  <Contact>' . tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_CONTACT) . '</Contact>' . "\n";
+  }
+
+  if (tep_not_null(MODULE_HEADER_TAGS_OPENSEARCH_SITE_TAGS)) {
+    echo '  <Tags>' . tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_TAGS) . '</Tags>' . "\n";
+  }
+
+  if (tep_not_null(MODULE_HEADER_TAGS_OPENSEARCH_SITE_ATTRIBUTION)) {
+    echo '  <Attribution>' . tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_ATTRIBUTION) . '</Attribution>' . "\n";
+  }
+
+  if (MODULE_HEADER_TAGS_OPENSEARCH_SITE_ADULT_CONTENT == 'True') {
+    echo '  <AdultContent>True</AdultContent>' . "\n";
+  }
+
+  if (tep_not_null(MODULE_HEADER_TAGS_OPENSEARCH_SITE_ICON)) {
+    echo '  <Image height="16" width="16" type="image/x-icon">' . tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_ICON) . '</Image>' . "\n";
+  }
+
+  if (tep_not_null(MODULE_HEADER_TAGS_OPENSEARCH_SITE_IMAGE)) {
+    echo '  <Image height="64" width="64" type="image/png">' . tep_output_string(MODULE_HEADER_TAGS_OPENSEARCH_SITE_IMAGE) . '</Image>' . "\n";
+  }
+?>
+  <InputEncoding>UTF-8</InputEncoding>
+  <Url type="text/html" method="get" template="<?php echo tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, 'keywords={searchTerms}', 'NONSSL', false); ?>" />
+</OpenSearchDescription>
+<?php
+  require('includes/application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/password_forgotten.php 2.3.1.src/password_forgotten.php
--- 2.2rc2a.cp.src/password_forgotten.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/password_forgotten.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: password_forgotten.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -14,7 +14,7 @@
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PASSWORD_FORGOTTEN);
 
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process')) {
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $email_address = tep_db_prepare_input($HTTP_POST_VARS['email_address']);
 
     $check_customer_query = tep_db_query("select customers_firstname, customers_lastname, customers_password, customers_id from " . TABLE_CUSTOMERS . " where customers_email_address = '" . tep_db_input($email_address) . "'");
@@ -38,108 +38,42 @@
 
   $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_LOGIN, '', 'SSL'));
   $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_PASSWORD_FORGOTTEN, '', 'SSL'));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('password_forgotten', tep_href_link(FILENAME_PASSWORD_FORGOTTEN, 'action=process', 'SSL')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_password_forgotten.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($messageStack->size('password_forgotten') > 0) {
+    echo $messageStack->output('password_forgotten');
+  }
 ?>
+
+<?php echo tep_draw_form('password_forgotten', tep_href_link(FILENAME_PASSWORD_FORGOTTEN, 'action=process', 'SSL'), 'post', '', true); ?>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <div><?php echo TEXT_MAIN; ?></div>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><?php echo $messageStack->output('password_forgotten'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo ENTRY_EMAIL_ADDRESS; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('email_address'); ?></td>
       </tr>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_LOGIN, '', 'SSL')); ?>
+  </div>
+</div>
+
+</form>
+
 <?php
-  }
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-      <tr>
-        <td><table border="0" width="100%" height="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" height="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="main" colspan="2"><?php echo TEXT_MAIN; ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><?php echo '<b>' . ENTRY_EMAIL_ADDRESS . '</b> ' . tep_draw_input_field('email_address'); ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_LOGIN, '', 'SSL') . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/popup_image.php 2.3.1.src/popup_image.php
--- 2.2rc2a.cp.src/popup_image.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/popup_image.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: popup_image.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -17,13 +17,13 @@
   $products_query = tep_db_query("select pd.products_name, p.products_image from " . TABLE_PRODUCTS . " p left join " . TABLE_PRODUCTS_DESCRIPTION . " pd on p.products_id = pd.products_id where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['pID'] . "' and pd.language_id = '" . (int)$languages_id . "'");
   $products = tep_db_fetch_array($products_query);
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
 <title><?php echo $products['products_name']; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<script language="javascript"><!--
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>" />
+<script type="text/javascript"><!--
 var i=0;
 function resize() {
   if (navigator.appName == 'Netscape') i=40;
diff -x .svn -aruN 2.2rc2a.cp.src/popup_search_help.php 2.3.1.src/popup_search_help.php
--- 2.2rc2a.cp.src/popup_search_help.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/popup_search_help.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: popup_search_help.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
@@ -16,28 +16,31 @@
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ADVANCED_SEARCH);
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html <?php echo HTML_PARAMS; ?>>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
+<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>" />
 <title><?php echo TITLE; ?></title>
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
+<link rel="stylesheet" type="text/css" href="stylesheet.css" />
 </head>
-<body marginwidth="10" marginheight="10" topmargin="10" bottommargin="10" leftmargin="10" rightmargin="10">
-<?php
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => HEADING_SEARCH_HELP);
-
-  new infoBoxHeading($info_box_contents, true, true);
-
-  $info_box_contents = array();
-  $info_box_contents[] = array('text' => TEXT_SEARCH_HELP);
-
-  new infoBox($info_box_contents);
-?>
+<body>
 
-<p class="smallText" align="right"><?php echo '<a href="javascript:window.close()">' . TEXT_CLOSE_WINDOW . '</a>'; ?></p>
+<div id="bodyWrapper">
+  <div id="bodyContent">
+    <h1><?php echo HEADING_SEARCH_HELP; ?></h1>
+
+    <div class="contentContainer">
+      <div class="contentText">
+        <?php echo TEXT_SEARCH_HELP; ?>
+      </div>
+
+      <div style="float: right;">
+        <?php echo '<a href="#" onclick="window.close(); return false;">' . TEXT_CLOSE_WINDOW . '</a>'; ?>
+      </div>
+    </div>
+  </div>
+</div>
 
 </body>
 </html>
diff -x .svn -aruN 2.2rc2a.cp.src/privacy.php 2.3.1.src/privacy.php
--- 2.2rc2a.cp.src/privacy.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/privacy.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: privacy.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,79 +15,23 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRIVACY);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRIVACY));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_INFORMATION; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><?php echo TEXT_INFORMATION; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/product_info.php 2.3.1.src/product_info.php
--- 2.2rc2a.cp.src/product_info.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/product_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: product_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -16,57 +16,22 @@
 
   $product_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
   $product_check = tep_db_fetch_array($product_check_query);
-?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function popupWindow(url) {
-  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params(array('action')) . 'action=add_product')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-<?php
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+
   if ($product_check['total'] < 1) {
 ?>
-      <tr>
-        <td><?php new infoBox(array(array('text' => TEXT_PRODUCT_NOT_FOUND))); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_PRODUCT_NOT_FOUND; ?>
+  </div>
+
+  <div style="float: right;">
+    <?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?>
+  </div>
+</div>
+
 <?php
   } else {
     $product_info_query = tep_db_query("select p.products_id, pd.products_name, pd.products_description, p.products_model, p.products_quantity, p.products_image, pd.products_url, p.products_price, p.products_tax_class_id, p.products_date_added, p.products_date_available, p.manufacturers_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
@@ -75,58 +40,109 @@
     tep_db_query("update " . TABLE_PRODUCTS_DESCRIPTION . " set products_viewed = products_viewed+1 where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
 
     if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
-      $products_price = '<s>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</s> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
+      $products_price = '<del>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</del> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
     } else {
       $products_price = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']));
     }
 
     if (tep_not_null($product_info['products_model'])) {
-      $products_name = $product_info['products_name'] . '<br><span class="smallText">[' . $product_info['products_model'] . ']</span>';
+      $products_name = $product_info['products_name'] . '<br /><span class="smallText">[' . $product_info['products_model'] . ']</span>';
     } else {
       $products_name = $product_info['products_name'];
     }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading" valign="top"><?php echo $products_name; ?></td>
-            <td class="pageHeading" align="right" valign="top"><?php echo $products_price; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main">
+
+<?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params(array('action')) . 'action=add_product')); ?>
+
+<div>
+  <h1 style="float: right;"><?php echo $products_price; ?></h1>
+  <h1><?php echo $products_name; ?></h1>
+</div>
+
+<div class="contentContainer">
+  <div class="contentText">
+
 <?php
     if (tep_not_null($product_info['products_image'])) {
+      $pi_query = tep_db_query("select image, htmlcontent from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_info['products_id'] . "' order by sort_order");
+
+      if (tep_db_num_rows($pi_query) > 0) {
+?>
+
+    <div id="piGal" style="float: right;">
+      <ul>
+
+<?php
+        $pi_counter = 0;
+        while ($pi = tep_db_fetch_array($pi_query)) {
+          $pi_counter++;
+
+          $pi_entry = '        <li><a href="';
+
+          if (tep_not_null($pi['htmlcontent'])) {
+            $pi_entry .= '#piGalimg_' . $pi_counter;
+          } else {
+            $pi_entry .= tep_href_link(DIR_WS_IMAGES . $pi['image']);
+          }
+
+          $pi_entry .= '" target="_blank" rel="fancybox">' . tep_image(DIR_WS_IMAGES . $pi['image']) . '</a>';
+
+          if (tep_not_null($pi['htmlcontent'])) {
+            $pi_entry .= '<div style="display: none;"><div id="piGalimg_' . $pi_counter . '">' . $pi['htmlcontent'] . '</div></div>';
+          }
+
+          $pi_entry .= '</li>';
+
+          echo $pi_entry;
+        }
 ?>
-          <table border="0" cellspacing="0" cellpadding="2" align="right">
-            <tr>
-              <td align="center" class="smallText">
-<script language="javascript"><!--
-document.write('<?php echo '<a href="javascript:popupWindow(\\\'' . tep_href_link(FILENAME_POPUP_IMAGE, 'pID=' . $product_info['products_id']) . '\\\')">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>');
-//--></script>
-<noscript>
-<?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image']) . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], $product_info['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>
-</noscript>
-              </td>
-            </tr>
-          </table>
+
+      </ul>
+    </div>
+
+<script type="text/javascript">
+$('#piGal ul').bxGallery({
+  maxwidth: 300,
+  maxheight: 200,
+  thumbwidth: <?php echo (($pi_counter > 1) ? '75' : '0'); ?>,
+  thumbcontainer: 300,
+  load_image: 'ext/jquery/bxGallery/spinner.gif'
+});
+</script>
+
+<?php
+      } else {
+?>
+
+    <div id="piGal" style="float: right;">
+      <?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image']) . '" target="_blank" rel="fancybox">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), null, null, 'hspace="5" vspace="5"') . '</a>'; ?>
+    </div>
+
+<?php
+      }
+?>
+
+<script type="text/javascript">
+$("#piGal a[rel^='fancybox']").fancybox({
+  cyclic: true
+});
+</script>
+
 <?php
     }
 ?>
-          <p><?php echo stripslashes($product_info['products_description']); ?></p>
+
+<?php echo stripslashes($product_info['products_description']); ?>
+
 <?php
     $products_attributes_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . (int)$HTTP_GET_VARS['products_id'] . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)$languages_id . "'");
     $products_attributes = tep_db_fetch_array($products_attributes_query);
     if ($products_attributes['total'] > 0) {
 ?>
-          <table border="0" cellspacing="0" cellpadding="2">
-            <tr>
-              <td class="main" colspan="2"><?php echo TEXT_PRODUCT_OPTIONS; ?></td>
-            </tr>
+
+    <p><?php echo TEXT_PRODUCT_OPTIONS; ?></p>
+
+    <p>
 <?php
       $products_options_name_query = tep_db_query("select distinct popt.products_options_id, popt.products_options_name from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . (int)$HTTP_GET_VARS['products_id'] . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)$languages_id . "' order by popt.products_options_name");
       while ($products_options_name = tep_db_fetch_array($products_options_name_query)) {
@@ -139,114 +155,62 @@
           }
         }
 
-        if (isset($cart->contents[$HTTP_GET_VARS['products_id']]['attributes'][$products_options_name['products_options_id']])) {
+        if (is_string($HTTP_GET_VARS['products_id']) && isset($cart->contents[$HTTP_GET_VARS['products_id']]['attributes'][$products_options_name['products_options_id']])) {
           $selected_attribute = $cart->contents[$HTTP_GET_VARS['products_id']]['attributes'][$products_options_name['products_options_id']];
         } else {
           $selected_attribute = false;
         }
 ?>
-            <tr>
-              <td class="main"><?php echo $products_options_name['products_options_name'] . ':'; ?></td>
-              <td class="main"><?php echo tep_draw_pull_down_menu('id[' . $products_options_name['products_options_id'] . ']', $products_options_array, $selected_attribute); ?></td>
-            </tr>
+      <strong><?php echo $products_options_name['products_options_name'] . ':'; ?></strong><br /><?php echo tep_draw_pull_down_menu('id[' . $products_options_name['products_options_id'] . ']', $products_options_array, $selected_attribute); ?><br />
 <?php
       }
 ?>
-          </table>
+    </p>
+
 <?php
     }
 ?>
-        </td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
-    $reviews_query = tep_db_query("select count(*) as count from " . TABLE_REVIEWS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'");
-    $reviews = tep_db_fetch_array($reviews_query);
-    if ($reviews['count'] > 0) {
-?>
-      <tr>
-        <td class="main"><?php echo TEXT_CURRENT_REVIEWS . ' ' . $reviews['count']; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
-    }
 
-    if (tep_not_null($product_info['products_url'])) {
-?>
-      <tr>
-        <td class="main"><?php echo sprintf(TEXT_MORE_INFORMATION, tep_href_link(FILENAME_REDIRECT, 'action=url&goto=' . urlencode($product_info['products_url']), 'NONSSL', true, false)); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
-    }
+    <div style="clear: both;"></div>
 
+<?php
     if ($product_info['products_date_available'] > date('Y-m-d H:i:s')) {
 ?>
-      <tr>
-        <td align="center" class="smallText"><?php echo sprintf(TEXT_DATE_AVAILABLE, tep_date_long($product_info['products_date_available'])); ?></td>
-      </tr>
+
+    <p style="text-align: center;"><?php echo sprintf(TEXT_DATE_AVAILABLE, tep_date_long($product_info['products_date_available'])); ?></p>
+
 <?php
-    } else {
+    }
 ?>
-      <tr>
-        <td align="center" class="smallText"><?php echo sprintf(TEXT_DATE_ADDED, tep_date_long($product_info['products_date_added'])); ?></td>
-      </tr>
+
+  </div>
+
 <?php
-    }
+    $reviews_query = tep_db_query("select count(*) as count from " . TABLE_REVIEWS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and reviews_status = 1");
+    $reviews = tep_db_fetch_array($reviews_query);
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params()) . '">' . tep_image_button('button_reviews.gif', IMAGE_BUTTON_REVIEWS) . '</a>'; ?></td>
-                <td class="main" align="right"><?php echo tep_draw_hidden_field('products_id', $product_info['products_id']) . tep_image_submit('button_in_cart.gif', IMAGE_BUTTON_IN_CART); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_hidden_field('products_id', $product_info['products_id']) . tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_REVIEWS . (($reviews['count'] > 0) ? ' (' . $reviews['count'] . ')' : ''), 'comment', tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params())); ?>
+  </div>
+
 <?php
     if ((USE_CACHE == 'true') && empty($SID)) {
       echo tep_cache_also_purchased(3600);
     } else {
       include(DIR_WS_MODULES . FILENAME_ALSO_PURCHASED_PRODUCTS);
     }
+?>
+
+</div>
+
+</form>
+
+<?php
   }
+
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-        </td>
-      </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/product_reviews_info.php 2.3.1.src/product_reviews_info.php
--- 2.2rc2a.cp.src/product_reviews_info.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/product_reviews_info.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: product_reviews_info.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -13,7 +13,7 @@
   require('includes/application_top.php');
 
   if (isset($HTTP_GET_VARS['reviews_id']) && tep_not_null($HTTP_GET_VARS['reviews_id']) && isset($HTTP_GET_VARS['products_id']) && tep_not_null($HTTP_GET_VARS['products_id'])) {
-    $review_check_query = tep_db_query("select count(*) as total from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$HTTP_GET_VARS['reviews_id'] . "' and r.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "'");
+    $review_check_query = tep_db_query("select count(*) as total from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.reviews_id = '" . (int)$HTTP_GET_VARS['reviews_id'] . "' and r.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' and r.reviews_status = 1");
     $review_check = tep_db_fetch_array($review_check_query);
 
     if ($review_check['total'] < 1) {
@@ -29,13 +29,13 @@
   $review = tep_db_fetch_array($review_query);
 
   if ($new_price = tep_get_products_special_price($review['products_id'])) {
-    $products_price = '<s>' . $currencies->display_price($review['products_price'], tep_get_tax_rate($review['products_tax_class_id'])) . '</s> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($review['products_tax_class_id'])) . '</span>';
+    $products_price = '<del>' . $currencies->display_price($review['products_price'], tep_get_tax_rate($review['products_tax_class_id'])) . '</del> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($review['products_tax_class_id'])) . '</span>';
   } else {
     $products_price = $currencies->display_price($review['products_price'], tep_get_tax_rate($review['products_tax_class_id']));
   }
 
   if (tep_not_null($review['products_model'])) {
-    $products_name = $review['products_name'] . '<br><span class="smallText">[' . $review['products_model'] . ']</span>';
+    $products_name = $review['products_name'] . '<br /><span class="smallText">[' . $review['products_model'] . ']</span>';
   } else {
     $products_name = $review['products_name'];
   }
@@ -43,127 +43,50 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCT_REVIEWS_INFO);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params()));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function popupWindow(url) {
-  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading" valign="top"><?php echo $products_name; ?></td>
-            <td class="pageHeading" align="right" valign="top"><?php echo $products_price; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table width="100%" border="0" cellspacing="0" cellpadding="2">
-          <tr>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo '<b>' . sprintf(TEXT_REVIEW_BY, tep_output_string_protected($review['customers_name'])) . '</b>'; ?></td>
-                    <td class="smallText" align="right"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($review['date_added'])); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td valign="top" class="main"><?php echo tep_break_string(nl2br(tep_output_string_protected($review['reviews_text'])), 60, '-<br>') . '<br><br><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $review['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $review['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $review['reviews_rating'])) . '</i>'; ?></td>
-                        <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params(array('reviews_id'))) . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                        <td class="main" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, tep_get_all_get_params(array('reviews_id'))) . '">' . tep_image_button('button_write_review.gif', IMAGE_BUTTON_WRITE_REVIEW) . '</a>'; ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-            <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" align="right" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-              <tr>
-                <td align="center" class="smallText">
+
+<div>
+  <h1 style="float: right;"><?php echo $products_price; ?></h1>
+  <h1><?php echo $products_name; ?></h1>
+</div>
+
+<div class="contentContainer">
+
 <?php
   if (tep_not_null($review['products_image'])) {
 ?>
-<script language="javascript"><!--
-document.write('<?php echo '<a href="javascript:popupWindow(\\\'' . tep_href_link(FILENAME_POPUP_IMAGE, 'pID=' . $review['products_id']) . '\\\')">' . tep_image(DIR_WS_IMAGES . $review['products_image'], addslashes($review['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>');
-//--></script>
-<noscript>
-<?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $review['products_image']) . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $review['products_image'], $review['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>
-</noscript>
+
+  <div style="float: right; width: <?php echo SMALL_IMAGE_WIDTH+20; ?>px; text-align: center;">
+    <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $review['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $review['products_image'], addslashes($review['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '</a>'; ?>
+
+    <p><?php echo tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now')); ?></p>
+  </div>
+
 <?php
   }
+?>
 
-  echo '<p><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now') . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a></p>';
+  <div>
+    <span style="float: right;"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($review['date_added'])); ?></span>
+    <h2><?php echo sprintf(TEXT_REVIEW_BY, tep_output_string_protected($review['customers_name'])); ?></h2>
+  </div>
+
+  <div class="contentText">
+    <?php echo tep_break_string(nl2br(tep_output_string_protected($review['reviews_text'])), 60, '-<br />') . '<br /><br /><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $review['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $review['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $review['reviews_rating'])) . '</i>'; ?>
+  </div>
+
+  <br />
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_WRITE_REVIEW, 'comment', tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, tep_get_all_get_params(array('reviews_id'))), 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params(array('reviews_id')))); ?>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/product_reviews.php 2.3.1.src/product_reviews.php
--- 2.2rc2a.cp.src/product_reviews.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/product_reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,17 +1,21 @@
 <?php
 /*
-  $Id: product_reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
 
+  if (!isset($HTTP_GET_VARS['products_id']) || !is_numeric($HTTP_GET_VARS['products_id'])) {
+    tep_redirect(tep_href_link(FILENAME_REVIEWS));
+  }
+
   $product_info_query = tep_db_query("select p.products_id, p.products_model, p.products_image, p.products_price, p.products_tax_class_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "'");
   if (!tep_db_num_rows($product_info_query)) {
     tep_redirect(tep_href_link(FILENAME_REVIEWS));
@@ -20,13 +24,13 @@
   }
 
   if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
-    $products_price = '<s>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</s> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
+    $products_price = '<del>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</del> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
   } else {
     $products_price = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']));
   }
 
   if (tep_not_null($product_info['products_model'])) {
-    $products_name = $product_info['products_name'] . '<br><span class="smallText">[' . $product_info['products_model'] . ']</span>';
+    $products_name = $product_info['products_name'] . '<br /><span class="smallText">[' . $product_info['products_model'] . ']</span>';
   } else {
     $products_name = $product_info['products_name'];
   }
@@ -34,182 +38,102 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCT_REVIEWS);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params()));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<?php
+  if ($messageStack->size('product_reviews') > 0) {
+    echo $messageStack->output('product_reviews');
+  }
+?>
+
+<div>
+  <h1 style="float: right;"><?php echo $products_price; ?></h1>
+  <h1><?php echo $products_name; ?></h1>
+</div>
+
+<div class="contentContainer">
+
+<?php
+  if (tep_not_null($product_info['products_image'])) {
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
-function popupWindow(url) {
-  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
-}
-//--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading" valign="top"><?php echo $products_name; ?></td>
-            <td class="pageHeading" align="right" valign="top"><?php echo $products_price; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table width="100%" border="0" cellspacing="0" cellpadding="2">
-          <tr>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+  <div style="float: right; width: <?php echo SMALL_IMAGE_WIDTH+20; ?>px; text-align: center;">
+    <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $product_info['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '</a>'; ?>
+
+    <p><?php echo tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now')); ?></p>
+  </div>
+
 <?php
-  $reviews_query_raw = "select r.reviews_id, left(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, r.customers_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.products_id = '" . (int)$product_info['products_id'] . "' and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' order by r.reviews_id desc";
+  }
+
+  $reviews_query_raw = "select r.reviews_id, left(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, r.customers_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.products_id = '" . (int)$product_info['products_id'] . "' and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' and r.reviews_status = 1 order by r.reviews_id desc";
   $reviews_split = new splitPageResults($reviews_query_raw, MAX_DISPLAY_NEW_REVIEWS);
 
   if ($reviews_split->number_of_rows > 0) {
     if ((PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3')) {
 ?>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="smallText"><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></td>
-                    <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <p style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></p>
+
+    <p><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></p>
+  </div>
+
+  <br />
+
 <?php
     }
 
     $reviews_query = tep_db_query($reviews_split->sql_query);
     while ($reviews = tep_db_fetch_array($reviews_query)) {
 ?>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $product_info['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '"><u><b>' . sprintf(TEXT_REVIEW_BY, tep_output_string_protected($reviews['customers_name'])) . '</b></u></a>'; ?></td>
-                    <td class="smallText" align="right"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($reviews['date_added'])); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td valign="top" class="main"><?php echo tep_break_string(tep_output_string_protected($reviews['reviews_text']), 60, '-<br>') . ((strlen($reviews['reviews_text']) >= 100) ? '..' : '') . '<br><br><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])) . '</i>'; ?></td>
-                        <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
+
+  <div>
+    <span style="float: right;"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($reviews['date_added'])); ?></span>
+    <h2><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $product_info['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '">' . sprintf(TEXT_REVIEW_BY, tep_output_string_protected($reviews['customers_name'])) . '</a>'; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <?php echo tep_break_string(tep_output_string_protected($reviews['reviews_text']), 60, '-<br />') . ((strlen($reviews['reviews_text']) >= 100) ? '..' : '') . '<br /><br /><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])) . '</i>'; ?>
+  </div>
+
 <?php
     }
-?>
-<?php
   } else {
 ?>
-              <tr>
-                <td><?php new infoBox(array(array('text' => TEXT_NO_REVIEWS))); ?></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <?php echo TEXT_NO_REVIEWS; ?>
+  </div>
+
 <?php
   }
 
   if (($reviews_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="smallText"><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></td>
-                    <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
+
+  <div class="contentText">
+    <p style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></p>
+
+    <p><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></p>
+  </div>
+
 <?php
   }
 ?>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params()) . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                        <td class="main" align="right"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, tep_get_all_get_params()) . '">' . tep_image_button('button_write_review.gif', IMAGE_BUTTON_WRITE_REVIEW) . '</a>'; ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-            <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" align="right" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-              <tr>
-                <td align="center" class="smallText">
+
+  <br />
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_WRITE_REVIEW, 'comment', tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, tep_get_all_get_params()), 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params())); ?>
+  </div>
+</div>
+
 <?php
-  if (tep_not_null($product_info['products_image'])) {
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<script language="javascript"><!--
-document.write('<?php echo '<a href="javascript:popupWindow(\\\'' . tep_href_link(FILENAME_POPUP_IMAGE, 'pID=' . $product_info['products_id']) . '\\\')">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>');
-//--></script>
-<noscript>
-<?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image']) . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], $product_info['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>
-</noscript>
-<?php
-  }
-
-  echo '<p><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now') . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a></p>';
-?>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/product_reviews_write.php 2.3.1.src/product_reviews_write.php
--- 2.2rc2a.cp.src/product_reviews_write.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/product_reviews_write.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,17 +1,19 @@
 <?php
 /*
-  $Id: product_reviews_write.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
   require('includes/application_top.php');
 
+  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCT_REVIEWS_WRITE);
+
   if (!tep_session_is_registered('customer_id')) {
     $navigation->set_snapshot();
     tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
@@ -27,7 +29,7 @@
   $customer_query = tep_db_query("select customers_firstname, customers_lastname from " . TABLE_CUSTOMERS . " where customers_id = '" . (int)$customer_id . "'");
   $customer = tep_db_fetch_array($customer_query);
 
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process')) {
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $rating = tep_db_prepare_input($HTTP_POST_VARS['rating']);
     $review = tep_db_prepare_input($HTTP_POST_VARS['review']);
 
@@ -50,34 +52,29 @@
 
       tep_db_query("insert into " . TABLE_REVIEWS_DESCRIPTION . " (reviews_id, languages_id, reviews_text) values ('" . (int)$insert_id . "', '" . (int)$languages_id . "', '" . tep_db_input($review) . "')");
 
+      $messageStack->add_session('product_reviews', TEXT_REVIEW_RECEIVED, 'success');
       tep_redirect(tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params(array('action'))));
     }
   }
 
   if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
-    $products_price = '<s>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</s> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
+    $products_price = '<del>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</del> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
   } else {
     $products_price = $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id']));
   }
 
   if (tep_not_null($product_info['products_model'])) {
-    $products_name = $product_info['products_name'] . '<br><span class="smallText">[' . $product_info['products_model'] . ']</span>';
+    $products_name = $product_info['products_name'] . '<br /><span class="smallText">[' . $product_info['products_model'] . ']</span>';
   } else {
     $products_name = $product_info['products_name'];
   }
 
-  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCT_REVIEWS_WRITE);
-
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params()));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-<script language="javascript"><!--
+
+<script type="text/javascript"><!--
 function checkForm() {
   var error = 0;
   var error_message = "<?php echo JS_ERROR; ?>";
@@ -102,133 +99,64 @@
     return true;
   }
 }
-
-function popupWindow(url) {
-  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=100,height=100,screenX=150,screenY=150,top=150,left=150')
-}
 //--></script>
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('product_reviews_write', tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'action=process&products_id=' . $HTTP_GET_VARS['products_id']), 'post', 'onSubmit="return checkForm();"'); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading" valign="top"><?php echo $products_name; ?></td>
-            <td class="pageHeading" align="right" valign="top"><?php echo $products_price; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<div>
+  <h1 style="float: right;"><?php echo $products_price; ?></h1>
+  <h1><?php echo $products_name; ?></h1>
+</div>
+
 <?php
   if ($messageStack->size('review') > 0) {
-?>
-      <tr>
-        <td><?php echo $messageStack->output('review'); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-<?php
+    echo $messageStack->output('review');
   }
 ?>
-      <tr>
-        <td><table width="100%" border="0" cellspacing="0" cellpadding="2">
-          <tr>
-            <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo '<b>' . SUB_TITLE_FROM . '</b> ' . tep_output_string_protected($customer['customers_firstname'] . ' ' . $customer['customers_lastname']); ?></td>
-              </tr>
-              <tr>
-                <td class="main"><b><?php echo SUB_TITLE_REVIEW; ?></b></td>
-              </tr>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="2" cellpadding="2">
-                      <tr>
-                        <td class="main"><?php echo tep_draw_textarea_field('review', 'soft', 60, 15); ?></td>
-                      </tr>
-                      <tr>
-                        <td class="smallText" align="right"><?php echo TEXT_NO_HTML; ?></td>
-                      </tr>
-                      <tr>
-                        <td class="main"><?php echo '<b>' . SUB_TITLE_RATING . '</b> ' . TEXT_BAD . ' ' . tep_draw_radio_field('rating', '1') . ' ' . tep_draw_radio_field('rating', '2') . ' ' . tep_draw_radio_field('rating', '3') . ' ' . tep_draw_radio_field('rating', '4') . ' ' . tep_draw_radio_field('rating', '5') . ' ' . TEXT_GOOD; ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-              <tr>
-                <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-              </tr>
-              <tr>
-                <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-                  <tr class="infoBoxContents">
-                    <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                      <tr>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                        <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params(array('reviews_id', 'action'))) . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                        <td class="main" align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                        <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                      </tr>
-                    </table></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-            <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" align="right" valign="top"><table border="0" cellspacing="0" cellpadding="2">
-              <tr>
-                <td align="center" class="smallText">
+
+<?php echo tep_draw_form('product_reviews_write', tep_href_link(FILENAME_PRODUCT_REVIEWS_WRITE, 'action=process&products_id=' . $HTTP_GET_VARS['products_id']), 'post', 'onsubmit="return checkForm();"', true); ?>
+
+<div class="contentContainer">
+
 <?php
   if (tep_not_null($product_info['products_image'])) {
 ?>
-<script language="javascript"><!--
-document.write('<?php echo '<a href="javascript:popupWindow(\\\'' . tep_href_link(FILENAME_POPUP_IMAGE, 'pID=' . $product_info['products_id']) . '\\\')">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>');
-//--></script>
-<noscript>
-<?php echo '<a href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image']) . '" target="_blank">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], $product_info['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '<br>' . TEXT_CLICK_TO_ENLARGE . '</a>'; ?>
-</noscript>
+
+  <div style="float: right; width: <?php echo SMALL_IMAGE_WIDTH+20; ?>px; text-align: center;">
+    <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $product_info['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'hspace="5" vspace="5"') . '</a>'; ?>
+
+    <p><?php echo tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now')); ?></p>
+  </div>
+
 <?php
   }
-
-  echo '<p><a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now') . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a></p>';
 ?>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </table></td>
+
+  <div class="contentText">
+    <table border="0" cellspacing="0" cellpadding="2">
+      <tr>
+        <td class="fieldKey"><?php echo SUB_TITLE_FROM; ?></td>
+        <td class="fieldValue"><?php echo tep_output_string_protected($customer['customers_firstname'] . ' ' . $customer['customers_lastname']); ?></td>
       </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+      <tr>
+        <td class="fieldKey" valign="top"><?php echo SUB_TITLE_REVIEW; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_textarea_field('review', 'soft', 60, 15) . '<br /><span style="float: right;">' . TEXT_NO_HTML . '</span>'; ?></td>
+      </tr>
+      <tr>
+        <td class="fieldKey"><?php echo SUB_TITLE_RATING; ?></td>
+        <td class="fieldValue"><?php echo TEXT_BAD . ' ' . tep_draw_radio_field('rating', '1') . ' ' . tep_draw_radio_field('rating', '2') . ' ' . tep_draw_radio_field('rating', '3') . ' ' . tep_draw_radio_field('rating', '4') . ' ' . tep_draw_radio_field('rating', '5') . ' ' . TEXT_GOOD; ?></td>
+      </tr>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params(array('reviews_id', 'action')))); ?>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/products_new.php 2.3.1.src/products_new.php
--- 2.2rc2a.cp.src/products_new.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/products_new.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: products_new.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,41 +15,15 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCTS_NEW);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCTS_NEW));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_products_new.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+
 <?php
   $products_new_array = array();
 
@@ -58,84 +32,75 @@
 
   if (($products_new_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText"><?php echo $products_new_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?></td>
-            <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $products_new_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $products_new_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $products_new_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?></span>
+    </div>
+
+    <br />
+
 <?php
   }
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
 <?php
   if ($products_new_split->number_of_rows > 0) {
+?>
+
+    <table border="0" width="100%" cellspacing="2" cellpadding="2">
+
+<?php
     $products_new_query = tep_db_query($products_new_split->sql_query);
     while ($products_new = tep_db_fetch_array($products_new_query)) {
       if ($new_price = tep_get_products_special_price($products_new['products_id'])) {
-        $products_price = '<s>' . $currencies->display_price($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id'])) . '</s> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($products_new['products_tax_class_id'])) . '</span>';
+        $products_price = '<del>' . $currencies->display_price($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id'])) . '</del> <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($products_new['products_tax_class_id'])) . '</span>';
       } else {
         $products_price = $currencies->display_price($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id']));
       }
 ?>
-          <tr>
-            <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $products_new['products_image'], $products_new['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td>
-            <td valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '"><b><u>' . $products_new['products_name'] . '</u></b></a><br>' . TEXT_DATE_ADDED . ' ' . tep_date_long($products_new['products_date_added']) . '<br>' . TEXT_MANUFACTURER . ' ' . $products_new['manufacturers_name'] . '<br><br>' . TEXT_PRICE . ' ' . $products_price; ?></td>
-            <td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_NEW, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $products_new['products_id']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td>
-          </tr>
-          <tr>
-            <td colspan="3"><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+      <tr>
+        <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $products_new['products_image'], $products_new['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td>
+        <td valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '"><strong><u>' . $products_new['products_name'] . '</u></strong></a><br />' . TEXT_DATE_ADDED . ' ' . tep_date_long($products_new['products_date_added']) . '<br />' . TEXT_MANUFACTURER . ' ' . $products_new['manufacturers_name'] . '<br /><br />' . TEXT_PRICE . ' ' . $products_price; ?></td>
+        <td align="right" valign="middle" class="smallText"><?php echo tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', tep_href_link(FILENAME_PRODUCTS_NEW, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $products_new['products_id'])); ?></td>
+      </tr>
 <?php
     }
-  } else {
 ?>
-          <tr>
-            <td class="main"><?php echo TEXT_NO_NEW_PRODUCTS; ?></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+    </table>
+
 <?php
-  }
+  } else {
 ?>
-        </table></td>
-      </tr>
+
+    <div>
+      <?php echo TEXT_NO_NEW_PRODUCTS; ?>
+    </div>
+
 <?php
+  }
+
   if (($products_new_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText"><?php echo $products_new_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?></td>
-            <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $products_new_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-          </tr>
-        </table></td>
-      </tr>
+
+    <br />
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $products_new_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $products_new_split->display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?></span>
+    </div>
+
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/redirect.php 2.3.1.src/redirect.php
--- 2.2rc2a.cp.src/redirect.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/redirect.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,6 +1,6 @@
 <?php
 /*
-  $Id: redirect.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
diff -x .svn -aruN 2.2rc2a.cp.src/reviews.php 2.3.1.src/reviews.php
--- 2.2rc2a.cp.src/reviews.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/reviews.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: reviews.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,140 +15,81 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_REVIEWS);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_REVIEWS));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_reviews_new.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+
 <?php
-  $reviews_query_raw = "select r.reviews_id, left(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, p.products_id, pd.products_name, p.products_image, r.customers_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = r.products_id and r.reviews_id = rd.reviews_id and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and rd.languages_id = '" . (int)$languages_id . "' order by r.reviews_id DESC";
+  $reviews_query_raw = "select r.reviews_id, left(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, p.products_id, pd.products_name, p.products_image, r.customers_name from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = r.products_id and r.reviews_id = rd.reviews_id and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and rd.languages_id = '" . (int)$languages_id . "' and reviews_status = 1 order by r.reviews_id DESC";
   $reviews_split = new splitPageResults($reviews_query_raw, MAX_DISPLAY_NEW_REVIEWS);
 
   if ($reviews_split->number_of_rows > 0) {
     if ((PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3')) {
 ?>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="smallText"><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></td>
-                <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+  <div class="contentText">
+    <p style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></p>
+
+    <p><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></p>
+  </div>
+
+  <br />
+
 <?php
     }
 
     $reviews_query = tep_db_query($reviews_split->sql_query);
     while ($reviews = tep_db_fetch_array($reviews_query)) {
 ?>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $reviews['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '"><u><b>' . $reviews['products_name'] . '</b></u></a> <span class="smallText">' . sprintf(TEXT_REVIEW_BY, tep_output_string_protected($reviews['customers_name'])) . '</span>'; ?></td>
-                <td class="smallText" align="right"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($reviews['date_added'])); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                    <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" align="center" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $reviews['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '">' . tep_image(DIR_WS_IMAGES . $reviews['products_image'], $reviews['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td>
-                    <td valign="top" class="main"><?php echo tep_break_string(tep_output_string_protected($reviews['reviews_text']), 60, '-<br>') . ((strlen($reviews['reviews_text']) >= 100) ? '..' : '') . '<br><br><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])) . '</i>'; ?></td>
-                    <td width="10" align="right"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+  <div>
+    <span style="float: right;"><?php echo sprintf(TEXT_REVIEW_DATE_ADDED, tep_date_long($reviews['date_added'])); ?></span>
+    <h2><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $reviews['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '">' . $reviews['products_name'] . '</a> <span class="smallText">' . sprintf(TEXT_REVIEW_BY, tep_output_string_protected($reviews['customers_name'])) . '</span>'; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
+      <tr>
+        <td width="<?php echo SMALL_IMAGE_WIDTH + 10; ?>" align="center" valign="top" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_REVIEWS_INFO, 'products_id=' . $reviews['products_id'] . '&reviews_id=' . $reviews['reviews_id']) . '">' . tep_image(DIR_WS_IMAGES . $reviews['products_image'], $reviews['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a>'; ?></td>
+        <td valign="top"><?php echo tep_break_string(tep_output_string_protected($reviews['reviews_text']), 60, '-<br />') . ((strlen($reviews['reviews_text']) >= 100) ? '..' : '') . '<br /><br /><i>' . sprintf(TEXT_REVIEW_RATING, tep_image(DIR_WS_IMAGES . 'stars_' . $reviews['reviews_rating'] . '.gif', sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])), sprintf(TEXT_OF_5_STARS, $reviews['reviews_rating'])) . '</i>'; ?></td>
+      </tr>
+    </table>
+  </div>
+
 <?php
     }
-?>
-<?php
   } else {
 ?>
-          <tr>
-            <td><?php new infoBox(array(array('text' => TEXT_NO_REVIEWS))); ?></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+  <div class="contentText">
+    <?php echo TEXT_NO_REVIEWS; ?>
+  </div>
+
 <?php
   }
 
   if (($reviews_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="smallText"><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></td>
-                <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
+
+  <br />
+
+  <div class="contentText">
+    <p style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $reviews_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info'))); ?></p>
+
+    <p><?php echo $reviews_split->display_count(TEXT_DISPLAY_NUMBER_OF_REVIEWS); ?></p>
+  </div>
+
 <?php
   }
 ?>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/shipping.php 2.3.1.src/shipping.php
--- 2.2rc2a.cp.src/shipping.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/shipping.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: shipping.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,79 +15,23 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_SHIPPING);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_SHIPPING));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_INFORMATION; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="main"><?php echo TEXT_INFORMATION; ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/shopping_cart.php 2.3.1.src/shopping_cart.php
--- 2.2rc2a.cp.src/shopping_cart.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/shopping_cart.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2007 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -20,63 +20,24 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_SHOPPING_CART);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_SHOPPING_CART));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_SHOPPING_CART, 'action=update_product')); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_cart.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
 <?php
   if ($cart->count_contents() > 0) {
 ?>
-      <tr>
-        <td>
-<?php
-    $info_box_contents = array();
-    $info_box_contents[0][] = array('align' => 'center',
-                                    'params' => 'class="productListing-heading"',
-                                    'text' => TABLE_HEADING_REMOVE);
-
-    $info_box_contents[0][] = array('params' => 'class="productListing-heading"',
-                                    'text' => TABLE_HEADING_PRODUCTS);
-
-    $info_box_contents[0][] = array('align' => 'center',
-                                    'params' => 'class="productListing-heading"',
-                                    'text' => TABLE_HEADING_QUANTITY);
-
-    $info_box_contents[0][] = array('align' => 'right',
-                                    'params' => 'class="productListing-heading"',
-                                    'text' => TABLE_HEADING_TOTAL);
 
+<?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_SHOPPING_CART, 'action=update_product')); ?>
+
+<div class="contentContainer">
+  <h2><?php echo TABLE_HEADING_PRODUCTS; ?></h2>
+
+  <div class="contentText">
+
+<?php
     $any_out_of_stock = 0;
     $products = $cart->get_products();
     for ($i=0, $n=sizeof($products); $i<$n; $i++) {
@@ -103,24 +64,19 @@
         }
       }
     }
+?>
 
-    for ($i=0, $n=sizeof($products); $i<$n; $i++) {
-      if (($i/2) == floor($i/2)) {
-        $info_box_contents[] = array('params' => 'class="productListing-even"');
-      } else {
-        $info_box_contents[] = array('params' => 'class="productListing-odd"');
-      }
+    <table border="0" width="100%" cellspacing="0" cellpadding="0">
 
-      $cur_row = sizeof($info_box_contents) - 1;
+<?php
 
-      $info_box_contents[$cur_row][] = array('align' => 'center',
-                                             'params' => 'class="productListing-data" valign="top"',
-                                             'text' => tep_draw_checkbox_field('cart_delete[]', $products[$i]['id']));
+    for ($i=0, $n=sizeof($products); $i<$n; $i++) {
+      echo '      <tr>';
 
       $products_name = '<table border="0" cellspacing="2" cellpadding="2">' .
                        '  <tr>' .
-                       '    <td class="productListing-data" align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '">' . tep_image(DIR_WS_IMAGES . $products[$i]['image'], $products[$i]['name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></td>' .
-                       '    <td class="productListing-data" valign="top"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '"><b>' . $products[$i]['name'] . '</b></a>';
+                       '    <td align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '">' . tep_image(DIR_WS_IMAGES . $products[$i]['image'], $products[$i]['name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></td>' .
+                       '    <td valign="top"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '"><strong>' . $products[$i]['name'] . '</strong></a>';
 
       if (STOCK_CHECK == 'true') {
         $stock_check = tep_check_stock($products[$i]['id'], $products[$i]['quantity']);
@@ -134,141 +90,89 @@
       if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) {
         reset($products[$i]['attributes']);
         while (list($option, $value) = each($products[$i]['attributes'])) {
-          $products_name .= '<br><small><i> - ' . $products[$i][$option]['products_options_name'] . ' ' . $products[$i][$option]['products_options_values_name'] . '</i></small>';
+          $products_name .= '<br /><small><i> - ' . $products[$i][$option]['products_options_name'] . ' ' . $products[$i][$option]['products_options_values_name'] . '</i></small>';
         }
       }
 
+      $products_name .= '<br /><br />' . tep_draw_input_field('cart_quantity[]', $products[$i]['quantity'], 'size="4"') . tep_draw_hidden_field('products_id[]', $products[$i]['id']) . tep_draw_button(IMAGE_BUTTON_UPDATE, 'refresh') . '&nbsp;&nbsp;&nbsp;or <a href="' . tep_href_link(FILENAME_SHOPPING_CART, 'products_id=' . $products[$i]['id'] . '&action=remove_product') . '">remove</a>';
+
       $products_name .= '    </td>' .
                         '  </tr>' .
                         '</table>';
 
-      $info_box_contents[$cur_row][] = array('params' => 'class="productListing-data"',
-                                             'text' => $products_name);
-
-      $info_box_contents[$cur_row][] = array('align' => 'center',
-                                             'params' => 'class="productListing-data" valign="top"',
-                                             'text' => tep_draw_input_field('cart_quantity[]', $products[$i]['quantity'], 'size="4"') . tep_draw_hidden_field('products_id[]', $products[$i]['id']));
-
-      $info_box_contents[$cur_row][] = array('align' => 'right',
-                                             'params' => 'class="productListing-data" valign="top"',
-                                             'text' => '<b>' . $currencies->display_price($products[$i]['final_price'], tep_get_tax_rate($products[$i]['tax_class_id']), $products[$i]['quantity']) . '</b>');
+      echo '        <td valign="top">' . $products_name . '</td>' .
+           '        <td align="right" valign="top"><strong>' . $currencies->display_price($products[$i]['final_price'], tep_get_tax_rate($products[$i]['tax_class_id']), $products[$i]['quantity']) . '</strong></td>' .
+           '      </tr>';
     }
-
-    new productListingBox($info_box_contents);
 ?>
-        </td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td align="right" class="main"><b><?php echo SUB_TITLE_SUB_TOTAL; ?> <?php echo $currencies->format($cart->show_total()); ?></b></td>
-      </tr>
+
+    </table>
+
+    <p align="right"><strong><?php echo SUB_TITLE_SUB_TOTAL; ?> <?php echo $currencies->format($cart->show_total()); ?></strong></p>
+
 <?php
     if ($any_out_of_stock == 1) {
       if (STOCK_ALLOW_CHECKOUT == 'true') {
 ?>
-      <tr>
-        <td class="stockWarning" align="center"><br><?php echo OUT_OF_STOCK_CAN_CHECKOUT; ?></td>
-      </tr>
+
+    <p class="stockWarning" align="center"><?php echo OUT_OF_STOCK_CAN_CHECKOUT; ?></p>
+
 <?php
       } else {
 ?>
-      <tr>
-        <td class="stockWarning" align="center"><br><?php echo OUT_OF_STOCK_CANT_CHECKOUT; ?></td>
-      </tr>
+
+    <p class="stockWarning" align="center"><?php echo OUT_OF_STOCK_CANT_CHECKOUT; ?></p>
+
 <?php
       }
     }
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td class="main"><?php echo tep_image_submit('button_update_cart.gif', IMAGE_BUTTON_UPDATE_CART); ?></td>
-<?php
-    $back = sizeof($navigation->path)-2;
-    if (isset($navigation->path[$back])) {
-?>
-                <td class="main"><?php echo '<a href="' . tep_href_link($navigation->path[$back]['page'], tep_array_to_string($navigation->path[$back]['get'], array('action')), $navigation->path[$back]['mode']) . '">' . tep_image_button('button_continue_shopping.gif', IMAGE_BUTTON_CONTINUE_SHOPPING) . '</a>'; ?></td>
-<?php
-    }
-?>
-                <td align="right" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL') . '">' . tep_image_button('button_checkout.gif', IMAGE_BUTTON_CHECKOUT) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CHECKOUT, 'triangle-1-e', tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'), 'primary'); ?></span>
+  </div>
+
 <?php
     $initialize_checkout_methods = $payment_modules->checkout_initialization_method();
 
     if (!empty($initialize_checkout_methods)) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td align="right" class="main" style="padding-right: 50px;"><?php echo TEXT_ALTERNATIVE_CHECKOUT_METHODS; ?></td>
-      </tr>
+
+  <p align="right" style="clear: both; padding: 15px 50px 0 0;"><?php echo TEXT_ALTERNATIVE_CHECKOUT_METHODS; ?></p>
+
 <?php
       reset($initialize_checkout_methods);
       while (list(, $value) = each($initialize_checkout_methods)) {
 ?>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td align="right" class="main"><?php echo $value; ?></td>
-      </tr>
+
+  <p align="right"><?php echo $value; ?></p>
+
 <?php
       }
     }
+?>
+
+</div>
+
+</form>
+
+<?php
   } else {
 ?>
-      <tr>
-        <td align="center" class="main"><?php new infoBox(array(array('text' => TEXT_CART_EMPTY))); ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td align="right" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_DEFAULT) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
-      </tr>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <?php echo TEXT_CART_EMPTY; ?>
+
+    <p align="right"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?></p>
+  </div>
+</div>
+
 <?php
   }
+
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/specials.php 2.3.1.src/specials.php
--- 2.2rc2a.cp.src/specials.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/specials.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: specials.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,115 +15,75 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_SPECIALS);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_SPECIALS));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+
 <?php
   $specials_query_raw = "select p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_image, s.specials_new_products_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_SPECIALS . " s where p.products_status = '1' and s.products_id = p.products_id and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and s.status = '1' order by s.specials_date_added DESC";
   $specials_split = new splitPageResults($specials_query_raw, MAX_DISPLAY_SPECIAL_PRODUCTS);
 
   if (($specials_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText"><?php echo $specials_split->display_count(TEXT_DISPLAY_NUMBER_OF_SPECIALS); ?></td>
-            <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $specials_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $specials_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $specials_split->display_count(TEXT_DISPLAY_NUMBER_OF_SPECIALS); ?></span>
+    </div>
+
+    <br />
+
 <?php
   }
 ?>
+
+    <table border="0" width="100%" cellspacing="0" cellpadding="2">
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
 <?php
     $row = 0;
     $specials_query = tep_db_query($specials_split->sql_query);
     while ($specials = tep_db_fetch_array($specials_query)) {
       $row++;
 
-      echo '            <td align="center" width="33%" class="smallText"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $specials['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $specials['products_image'], $specials['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $specials['products_id']) . '">' . $specials['products_name'] . '</a><br><s>' . $currencies->display_price($specials['products_price'], tep_get_tax_rate($specials['products_tax_class_id'])) . '</s><br><span class="productSpecialPrice">' . $currencies->display_price($specials['specials_new_products_price'], tep_get_tax_rate($specials['products_tax_class_id'])) . '</span></td>' . "\n";
+      echo '        <td align="center" width="33%"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $specials['products_id']) . '">' . tep_image(DIR_WS_IMAGES . $specials['products_image'], $specials['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a><br /><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $specials['products_id']) . '">' . $specials['products_name'] . '</a><br /><del>' . $currencies->display_price($specials['products_price'], tep_get_tax_rate($specials['products_tax_class_id'])) . '</del><br /><span class="productSpecialPrice">' . $currencies->display_price($specials['specials_new_products_price'], tep_get_tax_rate($specials['products_tax_class_id'])) . '</span></td>' . "\n";
 
       if ((($row / 3) == floor($row / 3))) {
 ?>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
+      </tr>
+      <tr>
 <?php
       }
     }
 ?>
-          </tr>
-        </table></td>
       </tr>
+    </table>
+
 <?php
   if (($specials_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) {
 ?>
-      <tr>
-        <td><br><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td class="smallText"><?php echo $specials_split->display_count(TEXT_DISPLAY_NUMBER_OF_SPECIALS); ?></td>
-            <td align="right" class="smallText"><?php echo TEXT_RESULT_PAGE . ' ' . $specials_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></td>
-          </tr>
-        </table></td>
-      </tr>
+
+    <br />
+
+    <div>
+      <span style="float: right;"><?php echo TEXT_RESULT_PAGE . ' ' . $specials_split->display_links(MAX_DISPLAY_PAGE_LINKS, tep_get_all_get_params(array('page', 'info', 'x', 'y'))); ?></span>
+
+      <span><?php echo $specials_split->display_count(TEXT_DISPLAY_NUMBER_OF_SPECIALS); ?></span>
+    </div>
+
 <?php
   }
 ?>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
diff -x .svn -aruN 2.2rc2a.cp.src/ssl_check.php 2.3.1.src/ssl_check.php
--- 2.2rc2a.cp.src/ssl_check.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/ssl_check.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: ssl_check.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -15,72 +15,31 @@
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_SSL_CHECK);
 
   $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_SSL_CHECK));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
+?>
+
+<h1><?php echo HEADING_TITLE; ?></h1>
+
+<div class="contentContainer">
+  <div class="contentText">
+    <div class="ui-widget infoBoxContainer" style=" width: 40%; float: right; padding: 0 0 10px 10px;">
+      <div class="ui-widget-header infoBoxHeading"><?php echo BOX_INFORMATION_HEADING; ?></div>
+
+      <div class="ui-widget-content infoBoxContents">
+        <?php echo BOX_INFORMATION; ?>
+      </div>
+    </div>
+
+    <?php echo TEXT_INFORMATION; ?>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_LOGIN)); ?></span>
+  </div>
+</div>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo HEADING_TITLE; ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_specials.gif', HEADING_TITLE, HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td class="main"><table border="0" width="40%" cellspacing="0" cellpadding="0" align="right">
-          <tr>
-            <td><?php new InfoBoxHeading(array(array('text' => BOX_INFORMATION_HEADING))); ?></td>
-          </tr>
-          <tr>
-            <td><?php new infoBox(array(array('text' => BOX_INFORMATION))); ?></td>
-          </tr>
-        </table><?php echo TEXT_INFORMATION; ?></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
-      <tr>
-        <td align="right" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_LOGIN) . '">' . tep_image_button('button_continue.gif', IMAGE_BUTTON_CONTINUE) . '</a>'; ?></td>
-      </tr>
-    </table></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
diff -x .svn -aruN 2.2rc2a.cp.src/stylesheet.css 2.3.1.src/stylesheet.css
--- 2.2rc2a.cp.src/stylesheet.css	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/stylesheet.css	2010-11-15 03:42:36.000000000 -0600
@@ -1,33 +1,156 @@
 /*
-  $Id: stylesheet.css 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2003 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
 
+.ui-widget {
+  font-family: Lucida Grande, Lucida Sans, Verdana, Arial, sans-serif;
+  font-size: 11px;
+}
+
+body {
+  background: #fff;
+  color: #000;
+  margin: 0px;
+  font-size: 11px;
+  font-family: Lucida Grande, Lucida Sans, Verdana, Arial, sans-serif;
+}
+
+#bodyWrapper {
+}
+
+#bodyContent {
+}
+
+#header {
+  height: 60px;
+}
+
+#storeLogo {
+  float: left;
+  margin-top: 5px;
+}
+
+#headerShortcuts {
+  float: right;
+  margin-top: 15px;
+}
+
+#columnLeft {
+  padding-top: 5px;
+}
+
+#columnRight {
+  padding-top: 5px;
+}
+
+.infoBoxContainer { }
+
+.infoBoxHeading {
+  padding: 2px;
+  font-size: 11px;
+}
+
+.infoBoxContents {
+  padding: 5px;
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+.contentContainer {
+  padding-bottom: 10px;
+}
+
+.contentContainer h2 {
+  font-size: 16px;
+  text-decoration: underline;
+  font-weight: normal;
+  margin-bottom: 0;
+  padding-bottom: 5px;
+}
+
+.contentText, .contentText table {
+  padding: 5px 0 5px 0;
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+.productListTable {
+  padding: 5px;
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+.productListTable tr.alt td {
+  background-color: #ecf6fc;
+}
+
+.fieldKey {
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 1.5;
+  width: 150px;
+}
+
+.fieldValue {
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+h1 {
+  font-size: 20px;
+  margin-bottom: 0;
+  padding-bottom: 5px;
+}
+
+img {
+  border: 0;
+}
+
+table, p {
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+#piGal ul {
+  list-style-type: none;
+}
+
+#piGal img {
+  -webkit-box-shadow: 0px 0px 1px #000;
+  -moz-box-shadow: 0px 0px 1px #000;
+}
+
+#piGal .outer {
+  margin-left: -30px;
+}
+
+.buttonSet {
+  clear: both;
+}
+
+.buttonAction {
+  float: right;
+}
+
 .boxText { font-family: Verdana, Arial, sans-serif; font-size: 10px; }
 .errorBox { font-family : Verdana, Arial, sans-serif; font-size : 10px; background: #ffb3b5; font-weight: bold; }
 .stockWarning { font-family : Verdana, Arial, sans-serif; font-size : 10px; color: #cc0033; }
 .productsNotifications { background: #f2fff7; }
 .orderEdit { font-family : Verdana, Arial, sans-serif; font-size : 10px; color: #70d250; text-decoration: underline; }
 
-BODY {
-  background: #ffffff;
-  color: #000000;
-  margin: 0px;
-}
-
 A {
   color: #000000;
   text-decoration: none;
 }
 
 A:hover {
-  color: #AABBDD;
   text-decoration: underline;
 }
 
@@ -101,12 +224,6 @@
   background: #b6b7cb;
 }
 
-.infoBoxContents {
-  background: #f8f8f9;
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 10px;
-}
-
 .infoBoxNotice {
   background: #FF8E90;
 }
@@ -145,17 +262,18 @@
   border-spacing: 1px;
 }
 
-.productListing-heading {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 10px;
-  background: #b6b7cb;
+.productListingHeader {
+  table-layout: fixed;
   color: #FFFFFF;
   font-weight: bold;
 }
 
-TD.productListing-data {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 10px;
+.productListingHeader A:hover {
+  color: #FFFFFF;
+}
+
+.productListingData {
+  table-layout: fixed;
 }
 
 A.pageResults {
@@ -201,17 +319,6 @@
   color: #aabbdd;
 }
 
-TD.fieldKey {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 12px;
-  font-weight: bold;
-}
-
-TD.fieldValue {
-  font-family: Verdana, Arial, sans-serif;
-  font-size: 12px;
-}
-
 TD.tableHeading {
   font-family: Verdana, Arial, sans-serif;
   font-size: 12px;
@@ -288,3 +395,22 @@
 /* input requirement */
 
 .inputRequirement { font-family: Verdana, Arial, sans-serif; font-size: 10px; color: #ff0000; }
+
+/* buttons */
+
+.tdbLink a { }
+
+.tdbLink button { }
+
+/* account link list */
+
+.accountLinkList {
+  list-style-type: none;
+  margin: 2px 2px 2px 10px;
+  padding: 5px;
+}
+
+.accountLinkListEntry {
+  float: left;
+  margin-right: 5px;
+}
diff -x .svn -aruN 2.2rc2a.cp.src/tell_a_friend.php 2.3.1.src/tell_a_friend.php
--- 2.2rc2a.cp.src/tell_a_friend.php	2008-01-31 16:34:17.000000000 -0600
+++ 2.3.1.src/tell_a_friend.php	2010-11-15 03:42:36.000000000 -0600
@@ -1,11 +1,11 @@
 <?php
 /*
-  $Id: tell_a_friend.php 1739 2007-12-20 00:52:16Z hpdl $
+  $Id$
 
   osCommerce, Open Source E-Commerce Solutions
   http://www.oscommerce.com
 
-  Copyright (c) 2006 osCommerce
+  Copyright (c) 2010 osCommerce
 
   Released under the GNU General Public License
 */
@@ -28,12 +28,12 @@
   }
 
   if ($valid_product == false) {
-    tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']));
+    tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . (int)$HTTP_GET_VARS['products_id']));
   }
 
   require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_TELL_A_FRIEND);
 
-  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process')) {
+  if (isset($HTTP_GET_VARS['action']) && ($HTTP_GET_VARS['action'] == 'process') && isset($HTTP_POST_VARS['formid']) && ($HTTP_POST_VARS['formid'] == $sessiontoken)) {
     $error = false;
 
     $to_email_address = tep_db_prepare_input($HTTP_POST_VARS['to_email_address']);
@@ -66,6 +66,15 @@
       $messageStack->add('friend', ERROR_TO_ADDRESS);
     }
 
+    $actionRecorder = new actionRecorder('ar_tell_a_friend', (tep_session_is_registered('customer_id') ? $customer_id : null), $from_name);
+    if (!$actionRecorder->canPerform()) {
+      $error = true;
+
+      $actionRecorder->record(false);
+
+      $messageStack->add('friend', sprintf(ERROR_ACTION_RECORDER, (defined('MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES') ? (int)MODULE_ACTION_RECORDER_TELL_A_FRIEND_EMAIL_MINUTES : 15)));
+    }
+
     if ($error == false) {
       $email_subject = sprintf(TEXT_EMAIL_SUBJECT, $from_name, STORE_NAME);
       $email_body = sprintf(TEXT_EMAIL_INTRO, $to_name, $from_name, $product_info['products_name'], STORE_NAME) . "\n\n";
@@ -74,14 +83,16 @@
         $email_body .= $message . "\n\n";
       }
 
-      $email_body .= sprintf(TEXT_EMAIL_LINK, tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id'], 'NONSSL', false)) . "\n\n" .
+      $email_body .= sprintf(TEXT_EMAIL_LINK, tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . (int)$HTTP_GET_VARS['products_id'], 'NONSSL', false)) . "\n\n" .
                      sprintf(TEXT_EMAIL_SIGNATURE, STORE_NAME . "\n" . HTTP_SERVER . DIR_WS_CATALOG . "\n");
 
       tep_mail($to_name, $to_email_address, $email_subject, $email_body, $from_name, $from_email_address);
 
+      $actionRecorder->record();
+
       $messageStack->add_session('header', sprintf(TEXT_EMAIL_SUCCESSFUL_SENT, $product_info['products_name'], tep_output_string_protected($to_name)), 'success');
 
-      tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']));
+      tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . (int)$HTTP_GET_VARS['products_id']));
     }
   } elseif (tep_session_is_registered('customer_id')) {
     $account_query = tep_db_query("select customers_firstname, customers_lastname, customers_email_address from " . TABLE_CUSTOMERS . " where customers_id = '" . (int)$customer_id . "'");
@@ -91,149 +102,75 @@
     $from_email_address = $account['customers_email_address'];
   }
 
-  $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_TELL_A_FRIEND, 'products_id=' . $HTTP_GET_VARS['products_id']));
+  $breadcrumb->add(NAVBAR_TITLE, tep_href_link(FILENAME_TELL_A_FRIEND, 'products_id=' . (int)$HTTP_GET_VARS['products_id']));
+
+  require(DIR_WS_INCLUDES . 'template_top.php');
 ?>
-<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html <?php echo HTML_PARAMS; ?>>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
-<title><?php echo TITLE; ?></title>
-<base href="<?php echo (($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER) . DIR_WS_CATALOG; ?>">
-<link rel="stylesheet" type="text/css" href="stylesheet.css">
-</head>
-<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0">
-<!-- header //-->
-<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
-<!-- header_eof //-->
-
-<!-- body //-->
-<table border="0" width="100%" cellspacing="3" cellpadding="3">
-  <tr>
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- left_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>
-<!-- left_navigation_eof //-->
-    </table></td>
-<!-- body_text //-->
-    <td width="100%" valign="top"><?php echo tep_draw_form('email_friend', tep_href_link(FILENAME_TELL_A_FRIEND, 'action=process&products_id=' . $HTTP_GET_VARS['products_id'])); ?><table border="0" width="100%" cellspacing="0" cellpadding="0">
-      <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
-          <tr>
-            <td class="pageHeading"><?php echo sprintf(HEADING_TITLE, $product_info['products_name']); ?></td>
-            <td class="pageHeading" align="right"><?php echo tep_image(DIR_WS_IMAGES . 'table_background_contact_us.gif', sprintf(HEADING_TITLE, $product_info['products_name']), HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td>
-          </tr>
-        </table></td>
-      </tr>
-      <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-      </tr>
+
+<h1><?php echo sprintf(HEADING_TITLE, $product_info['products_name']); ?></h1>
+
 <?php
   if ($messageStack->size('friend') > 0) {
+    echo $messageStack->output('friend');
+  }
 ?>
+
+<?php echo tep_draw_form('email_friend', tep_href_link(FILENAME_TELL_A_FRIEND, 'action=process&products_id=' . (int)$HTTP_GET_VARS['products_id']), 'post', '', true); ?>
+
+<div class="contentContainer">
+  <div>
+    <span class="inputRequirement" style="float: right;"><?php echo FORM_REQUIRED_INFORMATION; ?></span>
+    <h2><?php echo FORM_TITLE_CUSTOMER_DETAILS; ?></h2>
+  </div>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
       <tr>
-        <td><?php echo $messageStack->output('friend'); ?></td>
+        <td class="fieldKey"><?php echo FORM_FIELD_CUSTOMER_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('from_name'); ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo FORM_FIELD_CUSTOMER_EMAIL; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('from_email_address'); ?></td>
       </tr>
-<?php
-  }
-?>
+    </table>
+  </div>
+
+  <h2><?php echo FORM_TITLE_FRIEND_DETAILS; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
       <tr>
-        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-          <tr>
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td class="main"><b><?php echo FORM_TITLE_CUSTOMER_DETAILS; ?></b></td>
-                <td class="inputRequirement" align="right"><?php echo FORM_REQUIRED_INFORMATION; ?></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo FORM_FIELD_CUSTOMER_NAME; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('from_name'); ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo FORM_FIELD_CUSTOMER_EMAIL; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('from_email_address'); ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td class="main"><b><?php echo FORM_TITLE_FRIEND_DETAILS; ?></b></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><table border="0" cellspacing="0" cellpadding="2">
-                  <tr>
-                    <td class="main"><?php echo FORM_FIELD_FRIEND_NAME; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('to_name') . '&nbsp;<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>'; ?></td>
-                  </tr>
-                  <tr>
-                    <td class="main"><?php echo FORM_FIELD_FRIEND_EMAIL; ?></td>
-                    <td class="main"><?php echo tep_draw_input_field('to_email_address') . '&nbsp;<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>'; ?></td>
-                  </tr>
-                </table></td>
-              </tr>
-            </table></td>
-          </tr>
-          <tr>
-            <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
-          </tr>
-          <tr>
-            <td class="main"><b><?php echo FORM_TITLE_FRIEND_MESSAGE; ?></b></td>
-          </tr>
-          <tr>
-            <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-              <tr class="infoBoxContents">
-                <td><?php echo tep_draw_textarea_field('message', 'soft', 40, 8); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldKey"><?php echo FORM_FIELD_FRIEND_NAME; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('to_name') . '&nbsp;<span class="inputRequirement">' . ENTRY_FIRST_NAME_TEXT . '</span>'; ?></td>
       </tr>
       <tr>
-        <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>
+        <td class="fieldKey"><?php echo FORM_FIELD_FRIEND_EMAIL; ?></td>
+        <td class="fieldValue"><?php echo tep_draw_input_field('to_email_address') . '&nbsp;<span class="inputRequirement">' . ENTRY_EMAIL_ADDRESS_TEXT . '</span>'; ?></td>
       </tr>
+    </table>
+  </div>
+
+  <h2><?php echo FORM_TITLE_FRIEND_MESSAGE; ?></h2>
+
+  <div class="contentText">
+    <table border="0" cellspacing="2" cellpadding="2" width="100%">
       <tr>
-        <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">
-          <tr class="infoBoxContents">
-            <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
-              <tr>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-                <td><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']) . '">' . tep_image_button('button_back.gif', IMAGE_BUTTON_BACK) . '</a>'; ?></td>
-                <td align="right"><?php echo tep_image_submit('button_continue.gif', IMAGE_BUTTON_CONTINUE); ?></td>
-                <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
-              </tr>
-            </table></td>
-          </tr>
-        </table></td>
+        <td class="fieldValue"><?php echo tep_draw_textarea_field('message', 'soft', 40, 8); ?></td>
       </tr>
-    </table></form></td>
-<!-- body_text_eof //-->
-    <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">
-<!-- right_navigation //-->
-<?php require(DIR_WS_INCLUDES . 'column_right.php'); ?>
-<!-- right_navigation_eof //-->
-    </table></td>
-  </tr>
-</table>
-<!-- body_eof //-->
-
-<!-- footer //-->
-<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>
-<!-- footer_eof //-->
-<br>
-</body>
-</html>
-<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
+    </table>
+  </div>
+
+  <div class="buttonSet">
+    <span class="buttonAction"><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', null, 'primary'); ?></span>
+
+    <?php echo tep_draw_button(IMAGE_BUTTON_BACK, 'triangle-1-w', tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . (int)$HTTP_GET_VARS['products_id'])); ?>
+  </div>
+</div>
+
+</form>
+
+<?php
+  require(DIR_WS_INCLUDES . 'template_bottom.php');
+  require(DIR_WS_INCLUDES . 'application_bottom.php');
+?>
