Git
  Threads by month 
                
            - ----- 2025 -----
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2024 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2023 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2022 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2021 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2020 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2019 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2018 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2017 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2016 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2015 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2014 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2013 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2012 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2011 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2010 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 
September 2010
- 5 participants
 - 126 discussions
 
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] Planet phpMyAdmin branch, master, updated. 9e1b690719088cf93e038ddb4f64407f2e36cacf
                        
                        
by Michal Čihař 14 Sep '10
                    by Michal Čihař 14 Sep '10
14 Sep '10
                    
                        The branch, master has been updated
       via  9e1b690719088cf93e038ddb4f64407f2e36cacf (commit)
      from  028d3dccec71a8d249cb8d53c00da6b13cb371e4 (commit)
- Log -----------------------------------------------------------------
commit 9e1b690719088cf93e038ddb4f64407f2e36cacf
Author: Michal Čihař <mcihar(a)novell.com>
Date:   Mon Aug 23 15:38:24 2010 +0200
    Include all phpmyadmin related tweets.
-----------------------------------------------------------------------
Summary of changes:
 theme/index.html.tmpl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/theme/index.html.tmpl b/theme/index.html.tmpl
index 8afdecd..b8858c4 100644
--- a/theme/index.html.tmpl
+++ b/theme/index.html.tmpl
@@ -125,7 +125,7 @@ http://www.imblog.info
 new TWTR.Widget({
   version: 2,
   type: 'search',
-  search: 'pma-gsoc',
+  search: 'phpMyAdmin',
   interval: 6000,
   title: 'Developers at phpMyAdmin',
   subject: 'PMA GSOC',
hooks/post-receive
-- 
Planet phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10113-g9187f5a
                        
                        
by Marc Delisle 13 Sep '10
                    by Marc Delisle 13 Sep '10
13 Sep '10
                    
                        The branch, master has been updated
       via  9187f5abe2dec8161ad420f165b307988dceab6a (commit)
      from  13b7e75428c88e9c0b43ec613445243124d81662 (commit)
- Log -----------------------------------------------------------------
commit 9187f5abe2dec8161ad420f165b307988dceab6a
Author: Marc Delisle <marc(a)infomarc.info>
Date:   Mon Sep 13 13:03:45 2010 -0400
    jquery components should be under js/jquery
-----------------------------------------------------------------------
Summary of changes:
 js/{ => jquery}/jquery.qtip-1.0.0.min.js |    0
 libraries/header_scripts.inc.php         |    2 +-
 2 files changed, 1 insertions(+), 1 deletions(-)
 rename js/{ => jquery}/jquery.qtip-1.0.0.min.js (100%)
diff --git a/js/jquery.qtip-1.0.0.min.js b/js/jquery/jquery.qtip-1.0.0.min.js
similarity index 100%
rename from js/jquery.qtip-1.0.0.min.js
rename to js/jquery/jquery.qtip-1.0.0.min.js
diff --git a/libraries/header_scripts.inc.php b/libraries/header_scripts.inc.php
index 8126dd3..76b0852 100644
--- a/libraries/header_scripts.inc.php
+++ b/libraries/header_scripts.inc.php
@@ -31,7 +31,7 @@ $title = PMA_expandUserString(
 $is_superuser    = function_exists('PMA_isSuperuser') && PMA_isSuperuser();
 
 $GLOBALS['js_include'][] = 'functions.js';
-$GLOBALS['js_include'][] = 'jquery.qtip-1.0.0.min.js';
+$GLOBALS['js_include'][] = 'jquery/jquery.qtip-1.0.0.min.js';
 $params = array('lang' => $GLOBALS['lang']);
 if (isset($GLOBALS['db'])) {
     $params['db'] = $GLOBALS['db'];
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10112-g13b7e75
                        
                        
by Marc Delisle 13 Sep '10
                    by Marc Delisle 13 Sep '10
13 Sep '10
                    
                        The branch, master has been updated
       via  13b7e75428c88e9c0b43ec613445243124d81662 (commit)
      from  a4bb5d3e32f24396e7c1e7f6df1125e7c0423bfc (commit)
- Log -----------------------------------------------------------------
commit 13b7e75428c88e9c0b43ec613445243124d81662
Author: Marc Delisle <marc(a)infomarc.info>
Date:   Mon Sep 13 12:48:05 2010 -0400
    bug #3064963 tabindex wrong for generated inserted rows
-----------------------------------------------------------------------
Summary of changes:
 js/tbl_change.js |   14 ++++++++++++++
 tbl_change.php   |    8 ++++----
 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/js/tbl_change.js b/js/tbl_change.js
index 52d8432..f9c2d43 100644
--- a/js/tbl_change.js
+++ b/js/tbl_change.js
@@ -424,6 +424,20 @@ $(document).ready(function() {
                 }
                 curr_rows++;
             }
+        // recompute tabindex for text fields and other controls at footer;
+        // IMO it's not really important to handle the tabindex for
+        // function and Null
+        var tabindex = 0;
+        $('.textfield') 
+        .each(function() {
+                tabindex++;
+                $(this).attr('tabindex', tabindex);
+            });
+        $('.control_at_footer')
+        .each(function() {
+                tabindex++;
+                $(this).attr('tabindex', tabindex);
+            });
         }
         else if( curr_rows > target_rows) {
             while(curr_rows > target_rows) {
diff --git a/tbl_change.php b/tbl_change.php
index 3e4d814..54e0d7f 100644
--- a/tbl_change.php
+++ b/tbl_change.php
@@ -497,7 +497,7 @@ foreach ($rows as $row_id => $vrow) {
         }
 
         $idindex  = ($o_rows * $fields_cnt) + $i + 1;
-        $tabindex = (($idindex - 1) * 3) + 1;
+        $tabindex = $idindex;
 
         // The function column
         // -------------------
@@ -1019,7 +1019,7 @@ $(function() {
     <table border="0" cellpadding="5" cellspacing="0">
     <tr>
         <td valign="middle" nowrap="nowrap">
-            <select name="submit_type" tabindex="<?php echo ($tabindex + $tabindex_for_value + 1); ?>">
+            <select name="submit_type" class="control_at_footer" tabindex="<?php echo ($tabindex + $tabindex_for_value + 1); ?>">
 <?php
 if (isset($where_clause)) {
     ?>
@@ -1071,8 +1071,8 @@ if (isset($where_clause)) {
 <?php echo PMA_showHint(__('Use TAB key to move from value to value, or CTRL+arrows to move anywhere')); ?>
         </td>
         <td colspan="3" align="right" valign="middle">
-            <input type="submit" value="<?php echo __('Go'); ?>" tabindex="<?php echo ($tabindex + $tabindex_for_value + 6); ?>" id="buttonYes" />
-            <input type="reset" value="<?php echo __('Reset'); ?>" tabindex="<?php echo ($tabindex + $tabindex_for_value + 7); ?>" />
+            <input type="submit" class="control_at_footer" value="<?php echo __('Go'); ?>" tabindex="<?php echo ($tabindex + $tabindex_for_value + 6); ?>" id="buttonYes" />
+            <input type="reset" class="control_at_footer" value="<?php echo __('Reset'); ?>" tabindex="<?php echo ($tabindex + $tabindex_for_value + 7); ?>" />
         </td>
     </tr>
     </table>
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10111-ga4bb5d3
                        
                        
by Michal Čihař 13 Sep '10
                    by Michal Čihař 13 Sep '10
13 Sep '10
                    
                        The branch, master has been updated
       via  a4bb5d3e32f24396e7c1e7f6df1125e7c0423bfc (commit)
      from  cbc35644b267ec6c6a086187ee978358fca3f6ef (commit)
- Log -----------------------------------------------------------------
commit a4bb5d3e32f24396e7c1e7f6df1125e7c0423bfc
Author: Michal Čihař <mcihar(a)novell.com>
Date:   Mon Sep 13 14:13:01 2010 +0200
    Czech translation update.
-----------------------------------------------------------------------
Summary of changes:
 po/cs.po |   52 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/po/cs.po b/po/cs.po
index fc8ad1a..6a9e283 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgstr ""
 "Project-Id-Version: phpMyAdmin 3.4.0-dev\n"
 "Report-Msgid-Bugs-To: phpmyadmin-devel(a)lists.sourceforge.net\n"
 "POT-Creation-Date: 2010-09-10 12:46-0400\n"
-"PO-Revision-Date: 2010-09-07 10:55+0200\n"
+"PO-Revision-Date: 2010-09-13 14:12+0200\n"
 "Last-Translator: Michal Čihař <michal(a)cihar.com>\n"
 "Language-Team: czech <cs(a)li.org>\n"
 "MIME-Version: 1.0\n"
@@ -646,8 +646,8 @@ msgstr "Sledování není zapnuté."
 #: db_structure.php:404 libraries/display_tbl.lib.php:1945
 #, php-format
 msgid ""
-"This view has at least this number of rows. Please refer to %sdocumentation%"
-"s."
+"This view has at least this number of rows. Please refer to %sdocumentation"
+"%s."
 msgstr ""
 "Tento pohled má alespoň tolik řádek. Podrobnosti naleznete v %sdokumentaci%s."
 
@@ -854,8 +854,8 @@ msgstr "Výpis byl uložen do souboru %s."
 #: import.php:58
 #, php-format
 msgid ""
-"You probably tried to upload too large file. Please refer to %sdocumentation%"
-"s for ways to workaround this limit."
+"You probably tried to upload too large file. Please refer to %sdocumentation"
+"%s for ways to workaround this limit."
 msgstr ""
 "Pravděpodobně jste se pokusili nahrát příliš velký soubor. Přečtěte si "
 "prosím %sdokumentaci%s, jak toto omezení obejít."
@@ -1637,8 +1637,8 @@ msgstr "Vítejte v %s"
 #: libraries/auth/config.auth.lib.php:106
 #, php-format
 msgid ""
-"You probably did not create a configuration file. You might want to use the %"
-"1$ssetup script%2$s to create one."
+"You probably did not create a configuration file. You might want to use the "
+"%1$ssetup script%2$s to create one."
 msgstr ""
 "Pravděpodobná příčina je, že nemáte vytvořený konfigurační soubor. Pro jeho "
 "vytvoření by se vám mohl hodit %1$snastavovací skript%2$s."
@@ -4499,8 +4499,8 @@ msgstr ", @TABLE@ bude nahrazen jménem tabulky"
 #, php-format
 msgid ""
 "This value is interpreted using %1$sstrftime%2$s, so you can use time "
-"formatting strings. Additionally the following transformations will happen: %"
-"3$s. Other text will be kept as is. See the %4$sFAQ%5$s for details."
+"formatting strings. Additionally the following transformations will happen: "
+"%3$s. Other text will be kept as is. See the %4$sFAQ%5$s for details."
 msgstr ""
 "Tato hodnota je interpretována pomocí %1$sstrftime%2$s, takže můžete použít "
 "libovolné řetězce pro formátování data a času. Dále budou provedena "
@@ -5340,6 +5340,7 @@ msgid ""
 "Include a timestamp of when databases were created, last updated, and last "
 "checked"
 msgstr ""
+"Vložit čas vytvoření, poslední aktualizace a poslední kontroly databáze"
 
 #: libraries/export/sql.php:65
 msgid ""
@@ -5381,11 +5382,11 @@ msgstr "příkazy <code>INSERT IGNORE</code>"
 
 #: libraries/export/sql.php:147
 msgid "Function to use when dumping data:"
-msgstr ""
+msgstr "Jakou funkci použít pro vypisování dat:"
 
 #: libraries/export/sql.php:151
 msgid "Syntax to use when inserting data:"
-msgstr ""
+msgstr "Jakou syntaxi použít pro vkládání dat:"
 
 #: libraries/export/sql.php:154
 msgid ""
@@ -5560,6 +5561,8 @@ msgid ""
 "Invalid column (%s) specified! Ensure that columns names are spelled "
 "correctly, separated by commas, and not enclosed in quotes."
 msgstr ""
+"Zadán chybný název pole (%s)! Ujistěte se, že jsou jména polí zapsána "
+"správně, oddělena čárkami a nejsou uzavřena v uvozovkách."
 
 #: libraries/import/csv.php:179 libraries/import/csv.php:426
 #, php-format
@@ -6416,8 +6419,8 @@ msgid ""
 "For a list of available transformation options and their MIME type "
 "transformations, click on %stransformation descriptions%s"
 msgstr ""
-"Pro seznam dostupných parametrů transformací a jejich MIME typů klikněte na %"
-"spopisy transformací%s"
+"Pro seznam dostupných parametrů transformací a jejich MIME typů klikněte na "
+"%spopisy transformací%s"
 
 #: libraries/tbl_properties.inc.php:143
 msgid "Transformation options"
@@ -6458,8 +6461,8 @@ msgid ""
 "No description is available for this transformation.<br />Please ask the "
 "author what %s does."
 msgstr ""
-"Pro tuto transformaci není dostupný žádný popis.<br />Zeptejte se autora co %"
-"s dělá."
+"Pro tuto transformaci není dostupný žádný popis.<br />Zeptejte se autora co "
+"%s dělá."
 
 #: libraries/tbl_properties.inc.php:729 server_engines.php:56
 #: tbl_operations.php:352
@@ -6984,8 +6987,8 @@ msgid ""
 "You can set more settings by modifying config.inc.php, eg. by using %sSetup "
 "script%s."
 msgstr ""
-"Více věcí můžete nastavit úpravou config.inc.php, např. použitím %"
-"sNastavovacího skriptu%s."
+"Více věcí můžete nastavit úpravou config.inc.php, např. použitím "
+"%sNastavovacího skriptu%s."
 
 #: prefs_manage.php:302
 msgid "Save to browser's storage"
@@ -7454,8 +7457,8 @@ msgstr "Odstranit databáze se stejnými jmény jako uživatelé."
 msgid ""
 "Note: phpMyAdmin gets the users' privileges directly from MySQL's privilege "
 "tables. The content of these tables may differ from the privileges the "
-"server uses, if they have been changed manually. In this case, you should %"
-"sreload the privileges%s before you continue."
+"server uses, if they have been changed manually. In this case, you should "
+"%sreload the privileges%s before you continue."
 msgstr ""
 "Poznámka: phpMyAdmin získává oprávnění přímo z tabulek MySQL. Obsah těchto "
 "tabulek se může lišit od oprávnění, která server právě používá, pokud byly "
@@ -8939,8 +8942,9 @@ msgstr ""
 "Nastavil jste typ přihlašování [kbd]config[/kbd] a zadal jste uživatelské "
 "jméno a heslo pro automatické přihlášení, což není doporučená volba pro "
 "produkční servery. Kdokoli kdo zná URL phpMyAdminu může přímo přistoupit k "
-"Vašemu phpMyAdmin panelu. Nastavte [a@?page=servers&mode=edit&id=%1"
-"$d#tab_Server]typ přihlašování[/a] na [kbd]cookie[/kbd] nebo [kbd]http[/kbd]."
+"Vašemu phpMyAdmin panelu. Nastavte [a@?page=servers&mode=edit&id="
+"%1$d#tab_Server]typ přihlašování[/a] na [kbd]cookie[/kbd] nebo [kbd]http[/"
+"kbd]."
 
 #: setup/lib/index.lib.php:259
 #, php-format
@@ -9076,10 +9080,10 @@ msgstr ""
 "směry"
 
 #: tbl_change.php:1106
-#, fuzzy, php-format
+#, php-format
 #| msgid "Restart insertion with %s rows"
 msgid "Continue insertion with %s rows"
-msgstr "Začít znovu vkládání s %s řádky"
+msgstr "Pokračovat ve vkládání s %s řádky"
 
 #: tbl_chart.php:56
 msgid "Chart generated successfully."
@@ -9158,6 +9162,8 @@ msgid ""
 "For compatibility reasons the chart image is segmented by default, select "
 "this to draw the whole chart in one image."
 msgstr ""
+"Z důvodů kompatibility, je obrázek s grafem rozdělen do několika částí. "
+"Zvolte tento přepínač pro jeho vykreslení v jediném obrázku."
 
 #: tbl_chart.php:166
 msgid ""
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10110-gcbc3564
                        
                        
by Michal Čihař 13 Sep '10
                    by Michal Čihař 13 Sep '10
13 Sep '10
                    
                        The branch, master has been updated
       via  cbc35644b267ec6c6a086187ee978358fca3f6ef (commit)
       via  4e3f255433d67edf4194e272605100d006f737ef (commit)
       via  7da0c80608a6596247664c5ec261f94f2e993216 (commit)
       via  c2236819babc1d41f5d9a29691d0b9b9ab612d0c (commit)
       via  fab347c3265f14daa29235f3363d5410395c8987 (commit)
       via  9aa2cbd50584c50f847cb2d3d5fe87a7a0548ab3 (commit)
       via  0cdb3ee3977afb56a1bfde38422f73d5ab1c9b0c (commit)
       via  cac1b6cf5199691eb6f30c18eed4007e2954b0f1 (commit)
       via  702aabad5d7ecce3a867b94c7f27e13ce8b3a304 (commit)
       via  ff2ad83bd35e5870875bd064533420cec3c78b98 (commit)
       via  f60079e46c3e2a6c21ff63e0836732ccd94e6457 (commit)
       via  74a098f779a2e98b0229e10ad80fe3c1663ae2ba (commit)
       via  49307409f972901abc2e08aa6435ce23cf27bf84 (commit)
       via  b8ed9f004ad22c3ed124c4000a03d532c8afe6a5 (commit)
       via  962e4a2bc1a192044c1fabbd374aff016edaf270 (commit)
       via  c02fa5a0d48d3edf6bf99a6851d0e84d67935c4e (commit)
       via  624a1778ded50c90b52b96e16a1723f9317f1a79 (commit)
      from  8c5f758e4ad5c2708eabdeae4f1dd81efaddf591 (commit)
- Log -----------------------------------------------------------------
commit cbc35644b267ec6c6a086187ee978358fca3f6ef
Merge: 4e3f255433d67edf4194e272605100d006f737ef 8c5f758e4ad5c2708eabdeae4f1dd81efaddf591
Author: Pootle server <pootle(a)cihar.com>
Date:   Mon Sep 13 02:40:32 2010 +0200
    Merge remote branch 'origin/master'
commit 4e3f255433d67edf4194e272605100d006f737ef
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 16:04:58 2010 +0200
    Translation update done using Pootle.
commit 7da0c80608a6596247664c5ec261f94f2e993216
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 16:04:09 2010 +0200
    Translation update done using Pootle.
commit c2236819babc1d41f5d9a29691d0b9b9ab612d0c
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 16:04:01 2010 +0200
    Translation update done using Pootle.
commit fab347c3265f14daa29235f3363d5410395c8987
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 16:03:24 2010 +0200
    Translation update done using Pootle.
commit 9aa2cbd50584c50f847cb2d3d5fe87a7a0548ab3
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 16:02:48 2010 +0200
    Translation update done using Pootle.
commit 0cdb3ee3977afb56a1bfde38422f73d5ab1c9b0c
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sun Sep 12 15:38:49 2010 +0200
    Translation update done using Pootle.
commit cac1b6cf5199691eb6f30c18eed4007e2954b0f1
Author: Robert Readman <robert_readman(a)hotmail.com>
Date:   Sun Sep 12 03:14:22 2010 +0200
    Translation update done using Pootle.
commit 702aabad5d7ecce3a867b94c7f27e13ce8b3a304
Merge: ff2ad83bd35e5870875bd064533420cec3c78b98 ae04356ed298c86901fb4948596b8c0c7fe1f449
Author: Pootle server <pootle(a)cihar.com>
Date:   Sat Sep 11 18:40:11 2010 +0200
    Merge remote branch 'origin/master'
commit ff2ad83bd35e5870875bd064533420cec3c78b98
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:50:53 2010 +0200
    Translation update done using Pootle.
commit f60079e46c3e2a6c21ff63e0836732ccd94e6457
Merge: 74a098f779a2e98b0229e10ad80fe3c1663ae2ba e539a03ef938fb5df7950603bc196d2506c2c9b4
Author: Pootle server <pootle(a)cihar.com>
Date:   Sat Sep 11 12:40:25 2010 +0200
    Merge remote branch 'origin/master'
commit 74a098f779a2e98b0229e10ad80fe3c1663ae2ba
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 12:36:29 2010 +0200
    Translation update done using Pootle.
commit 49307409f972901abc2e08aa6435ce23cf27bf84
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 12:13:53 2010 +0200
    Translation update done using Pootle.
commit b8ed9f004ad22c3ed124c4000a03d532c8afe6a5
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 12:07:10 2010 +0200
    Translation update done using Pootle.
commit 962e4a2bc1a192044c1fabbd374aff016edaf270
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 11:40:25 2010 +0200
    Translation update done using Pootle.
commit c02fa5a0d48d3edf6bf99a6851d0e84d67935c4e
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 11:38:40 2010 +0200
    Translation update done using Pootle.
commit 624a1778ded50c90b52b96e16a1723f9317f1a79
Author: Burak Yavuz <hitowerdigit(a)hotmail.com>
Date:   Sat Sep 11 10:59:23 2010 +0200
    Translation update done using Pootle.
-----------------------------------------------------------------------
Summary of changes:
 po/en_GB.po |    8 ++++----
 po/sl.po    |   12 ++++++------
 po/tr.po    |   29 +++++++++++++++--------------
 3 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/po/en_GB.po b/po/en_GB.po
index 0c6da42..83ade51 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -4,13 +4,13 @@ msgstr ""
 "Project-Id-Version: phpMyAdmin 3.4.0-dev\n"
 "Report-Msgid-Bugs-To: phpmyadmin-devel(a)lists.sourceforge.net\n"
 "POT-Creation-Date: 2010-09-10 12:46-0400\n"
-"PO-Revision-Date: 2010-09-07 19:46+0200\n"
+"PO-Revision-Date: 2010-09-12 03:14+0200\n"
 "Last-Translator: Robert Readman <robert_readman(a)hotmail.com>\n"
 "Language-Team: english-gb <en_GB(a)li.org>\n"
+"Language: en_GB\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: en_GB\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.5\n"
 
@@ -9103,10 +9103,10 @@ msgstr ""
 "Use TAB key to move from value to value, or CTRL+arrows to move anywhere"
 
 #: tbl_change.php:1106
-#, fuzzy, php-format
+#, php-format
 #| msgid "Restart insertion with %s rows"
 msgid "Continue insertion with %s rows"
-msgstr "Restart insertion with %s rows"
+msgstr "Continue insertion with %s rows"
 
 #: tbl_chart.php:56
 msgid "Chart generated successfully."
diff --git a/po/sl.po b/po/sl.po
index c435087..76a7432 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -4,15 +4,15 @@ msgstr ""
 "Project-Id-Version: phpMyAdmin 3.4.0-dev\n"
 "Report-Msgid-Bugs-To: phpmyadmin-devel(a)lists.sourceforge.net\n"
 "POT-Creation-Date: 2010-09-10 12:46-0400\n"
-"PO-Revision-Date: 2010-09-07 18:44+0200\n"
+"PO-Revision-Date: 2010-09-11 15:50+0200\n"
 "Last-Translator: Domen <dbc334(a)gmail.com>\n"
 "Language-Team: slovenian <sl(a)li.org>\n"
+"Language: sl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: sl\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
-"%100==4 ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3);\n"
 "X-Generator: Pootle 2.0.5\n"
 
 #: browse_foreigners.php:36 browse_foreigners.php:57
@@ -9163,10 +9163,10 @@ msgstr ""
 "premik kamor koli"
 
 #: tbl_change.php:1106
-#, fuzzy, php-format
+#, php-format
 #| msgid "Restart insertion with %s rows"
 msgid "Continue insertion with %s rows"
-msgstr "Ponovno začni vstavljanje z %s vrsticami"
+msgstr "Nadaljuj vstavljanje z %s vrsticami"
 
 #: tbl_chart.php:56
 msgid "Chart generated successfully."
diff --git a/po/tr.po b/po/tr.po
index 4cd20df..e07dba6 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -4,13 +4,13 @@ msgstr ""
 "Project-Id-Version: phpMyAdmin 3.4.0-dev\n"
 "Report-Msgid-Bugs-To: phpmyadmin-devel(a)lists.sourceforge.net\n"
 "POT-Creation-Date: 2010-09-10 12:46-0400\n"
-"PO-Revision-Date: 2010-09-08 22:43+0200\n"
+"PO-Revision-Date: 2010-09-12 16:04+0200\n"
 "Last-Translator: Burak Yavuz <hitowerdigit(a)hotmail.com>\n"
 "Language-Team: turkish <tr(a)li.org>\n"
+"Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: tr\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Pootle 2.0.5\n"
 
@@ -943,7 +943,7 @@ msgstr "\"DROP DATABASE\" ifadesi etkisizleştirildi."
 
 #: js/messages.php:30 libraries/mult_submits.inc.php:256 sql.php:254
 msgid "Do you really want to "
-msgstr "Bunu uygulamak istiyor musunuz: "
+msgstr "Şu komut uygulansın "
 
 #: js/messages.php:31 libraries/mult_submits.inc.php:256 sql.php:239
 msgid "You are about to DESTROY a complete database!"
@@ -4409,7 +4409,7 @@ msgstr "Yeniden gir"
 
 #: libraries/display_change_password.lib.php:51
 msgid "Password Hashing"
-msgstr "Parola Hesaplanıyor"
+msgstr "Parola Adreslemesi"
 
 #: libraries/display_change_password.lib.php:65
 msgid "MySQL 4.0 compatible"
@@ -5925,7 +5925,7 @@ msgstr "Etkin"
 
 #: libraries/relation.lib.php:105
 msgid "Display Features"
-msgstr "Özellikleri Göster"
+msgstr "Özellikleri göster"
 
 #: libraries/relation.lib.php:111
 msgid "Creation of PDFs"
@@ -5956,16 +5956,16 @@ msgstr "Kullanıcı tercihleri"
 
 #: libraries/relation.lib.php:145
 msgid "Quick steps to setup advanced features:"
-msgstr "Gelişmiş özellikleri kurmak için hızlı adımlar:"
+msgstr "Gelişmiş özellikleri ayarlamak için hızlı adımlar:"
 
 #: libraries/relation.lib.php:147
 msgid ""
 "Create the needed tables with the <code>script/create_tables.sql</code>."
-msgstr "Gerekli tabloları <code>script/create_tables.sql</code> ile oluştur."
+msgstr "Gerekli tabloları <code>script/create_tables.sql</code> ile oluşturun."
 
 #: libraries/relation.lib.php:148
 msgid "Create a pma user and give access to these tables."
-msgstr "Pma kullanıcısı oluştur ve bu tablolara erişim ver."
+msgstr "Pma kullanıcısı oluştur ve bu tablolara erişim verin."
 
 #: libraries/relation.lib.php:149
 msgid ""
@@ -5973,7 +5973,8 @@ msgid ""
 "code>), for example by starting from <code>config.sample.inc.php</code>."
 msgstr ""
 "(<code>config.inc.php</code>) yapılandırma dosyasında gelişmiş özellikler "
-"etkin, örneğin <code>config.sample.inc.php</code> dosyasından başlayarak."
+"etkinleştirin, örneğin <code>config.sample.inc.php</code> dosyasından "
+"başlayarak."
 
 #: libraries/relation.lib.php:150
 msgid "Re-login to phpMyAdmin to load the updated configuration file."
@@ -8744,7 +8745,7 @@ msgid ""
 "database will remain unchanged."
 msgstr ""
 "Hedef veritabanı kaynak veritabanı ile tamamen eşitlenecektir. Kaynak "
-"veritabanı değitirelemeyecektir."
+"veritabanı değiştirilmeden aynen kalacaktır."
 
 #: server_variables.php:34
 msgid "Server variables and settings"
@@ -9171,10 +9172,10 @@ msgstr ""
 "CTRL+OK TUŞLARI'nı kullanın"
 
 #: tbl_change.php:1106
-#, fuzzy, php-format
+#, php-format
 #| msgid "Restart insertion with %s rows"
 msgid "Continue insertion with %s rows"
-msgstr "%s satırlı eklemeyi yeniden başlat"
+msgstr "%s satırla eklemeye devam et"
 
 #: tbl_chart.php:56
 msgid "Chart generated successfully."
@@ -9586,7 +9587,7 @@ msgstr "Tablonun Başına"
 #: tbl_structure.php:645
 #, php-format
 msgid "After %s"
-msgstr "%s tablosundan sonra"
+msgstr "%s sonrasına"
 
 #: tbl_structure.php:684
 #, php-format
@@ -9716,7 +9717,7 @@ msgstr "Hemen aktif et"
 #: tbl_tracking.php:662
 #, php-format
 msgid "Create version %s of %s.%s"
-msgstr "%s.%s için %s sürümü oluştur"
+msgstr "%s sürümünü, %s.%s için oluştur"
 
 #: tbl_tracking.php:666
 msgid "Track these data definition statements:"
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin localized documentation branch, master, updated. 233bbeda8f86355455d70eb9170731f83ef45165
                        
                        
by Michal Čihař 13 Sep '10
                    by Michal Čihař 13 Sep '10
13 Sep '10
                    
                        The branch, master has been updated
       via  233bbeda8f86355455d70eb9170731f83ef45165 (commit)
       via  fbc6e3beae2e43a6950719015cbe5144b0c39c4f (commit)
       via  ddcb3ba24b5e5ca6709d8375bb7aa60da6ba5e79 (commit)
       via  72890f37fad1ff9b86c0cf1eeb41225c06c25f1f (commit)
       via  0bc24887d034743330662e4799d03b7370542039 (commit)
       via  a65c7ef84547f9ef7d2be2c485c5905be76ca42b (commit)
       via  6e8bde34ebc8f7c2833dd1a1c7b815e94db29c77 (commit)
       via  39639646a53e974a0ae965dd0724a639d0a38f7c (commit)
       via  b9d57f166d093776b1b9a1cd3cd8f98998a6e3ad (commit)
       via  ea70e04959765956c0099aaba720099cbaef2dea (commit)
       via  d0322b6a01ba3258938d47096fbfdadfe1e12ed5 (commit)
       via  ca921b3795653e58da9550238c839dc404364584 (commit)
       via  4f0005bdfa3417406f80af1d0b90de39ecd2d967 (commit)
       via  43c5fa0383ae7d0a6d297ec340fc89bec98689fd (commit)
       via  998d4af46be17d9ac4cbd8334baaca6e54f10107 (commit)
       via  72c19cbf0f81f94f8406a703995f1bfa3fb7cac9 (commit)
       via  b1c9e2d035ea09f4f0593d69103d7be48a5819be (commit)
       via  8591c025ab1c80922bc8d9fe58679b0d113e4999 (commit)
       via  3029aa954e654ed268e104e7f33a899f6bc23ee8 (commit)
       via  f8d79443f3330db91eb15a71aa870f8be54de666 (commit)
       via  3542699cb1eddd87b5236724b038ee8637b15591 (commit)
       via  e9b1e133300fe0d4fbee8b56ef03d9d46160d977 (commit)
       via  795d19d6ebb027abbcaa14a72b5a69bf4acefc9c (commit)
       via  0fe8f663934db85ce7a47f8000039724caf77af3 (commit)
       via  6f7a26a1275cee7ce2e091f60a2ea74859b72197 (commit)
       via  1b720a9512aa59beb224c10f30a92089bce9e891 (commit)
       via  614fbc11828575d2195d56198a6697d8591e0d50 (commit)
       via  9974ac2823e19e3bb4b9afb876e3cb49278eebbd (commit)
       via  faa3c2908e67f56442aa9c4bede0610e1e4d8d2e (commit)
       via  a2e1dbb563c29f50681366bd1a0301961331196a (commit)
       via  61696a86b593569612dc5b746ecd67b3226fd8ca (commit)
       via  3c863b7fb4aa66d91b5a82e91053db81efcf79ec (commit)
       via  ae76643ab40a8a6fd48f07abb8b4aaab1bc8d7ec (commit)
       via  ecddfbd616319434b517e38d38309daaf6206560 (commit)
      from  2f9c367a74b99ad6a77af141f523a973e473b600 (commit)
- Log -----------------------------------------------------------------
commit 233bbeda8f86355455d70eb9170731f83ef45165
Author: Michal Čihař <mcihar(a)novell.com>
Date:   Mon Sep 13 14:05:49 2010 +0200
    Regenerate translated docs.
commit fbc6e3beae2e43a6950719015cbe5144b0c39c4f
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:21:10 2010 +0200
    Translation update done using Pootle.
commit ddcb3ba24b5e5ca6709d8375bb7aa60da6ba5e79
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:20:52 2010 +0200
    Translation update done using Pootle.
commit 72890f37fad1ff9b86c0cf1eeb41225c06c25f1f
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:20:04 2010 +0200
    Translation update done using Pootle.
commit 0bc24887d034743330662e4799d03b7370542039
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:17:11 2010 +0200
    Translation update done using Pootle.
commit a65c7ef84547f9ef7d2be2c485c5905be76ca42b
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:15:19 2010 +0200
    Translation update done using Pootle.
commit 6e8bde34ebc8f7c2833dd1a1c7b815e94db29c77
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:15:07 2010 +0200
    Translation update done using Pootle.
commit 39639646a53e974a0ae965dd0724a639d0a38f7c
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:14:51 2010 +0200
    Translation update done using Pootle.
commit b9d57f166d093776b1b9a1cd3cd8f98998a6e3ad
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:14:27 2010 +0200
    Translation update done using Pootle.
commit ea70e04959765956c0099aaba720099cbaef2dea
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:14:17 2010 +0200
    Translation update done using Pootle.
commit d0322b6a01ba3258938d47096fbfdadfe1e12ed5
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:14:07 2010 +0200
    Translation update done using Pootle.
commit ca921b3795653e58da9550238c839dc404364584
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:51 2010 +0200
    Translation update done using Pootle.
commit 4f0005bdfa3417406f80af1d0b90de39ecd2d967
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:44 2010 +0200
    Translation update done using Pootle.
commit 43c5fa0383ae7d0a6d297ec340fc89bec98689fd
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:38 2010 +0200
    Translation update done using Pootle.
commit 998d4af46be17d9ac4cbd8334baaca6e54f10107
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:32 2010 +0200
    Translation update done using Pootle.
commit 72c19cbf0f81f94f8406a703995f1bfa3fb7cac9
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:09 2010 +0200
    Translation update done using Pootle.
commit b1c9e2d035ea09f4f0593d69103d7be48a5819be
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:13:01 2010 +0200
    Translation update done using Pootle.
commit 8591c025ab1c80922bc8d9fe58679b0d113e4999
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:12:52 2010 +0200
    Translation update done using Pootle.
commit 3029aa954e654ed268e104e7f33a899f6bc23ee8
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:12:42 2010 +0200
    Translation update done using Pootle.
commit f8d79443f3330db91eb15a71aa870f8be54de666
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:08:35 2010 +0200
    Translation update done using Pootle.
commit 3542699cb1eddd87b5236724b038ee8637b15591
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:08:06 2010 +0200
    Translation update done using Pootle.
commit e9b1e133300fe0d4fbee8b56ef03d9d46160d977
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:07:54 2010 +0200
    Translation update done using Pootle.
commit 795d19d6ebb027abbcaa14a72b5a69bf4acefc9c
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:05:05 2010 +0200
    Translation update done using Pootle.
commit 0fe8f663934db85ce7a47f8000039724caf77af3
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:03:05 2010 +0200
    Translation update done using Pootle.
commit 6f7a26a1275cee7ce2e091f60a2ea74859b72197
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:01:53 2010 +0200
    Translation update done using Pootle.
commit 1b720a9512aa59beb224c10f30a92089bce9e891
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:01:26 2010 +0200
    Translation update done using Pootle.
commit 614fbc11828575d2195d56198a6697d8591e0d50
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:00:50 2010 +0200
    Translation update done using Pootle.
commit 9974ac2823e19e3bb4b9afb876e3cb49278eebbd
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:00:37 2010 +0200
    Translation update done using Pootle.
commit faa3c2908e67f56442aa9c4bede0610e1e4d8d2e
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 16:00:29 2010 +0200
    Translation update done using Pootle.
commit a2e1dbb563c29f50681366bd1a0301961331196a
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:58:41 2010 +0200
    Translation update done using Pootle.
commit 61696a86b593569612dc5b746ecd67b3226fd8ca
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:58:05 2010 +0200
    Translation update done using Pootle.
commit 3c863b7fb4aa66d91b5a82e91053db81efcf79ec
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:55:54 2010 +0200
    Translation update done using Pootle.
commit ae76643ab40a8a6fd48f07abb8b4aaab1bc8d7ec
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:55:11 2010 +0200
    Translation update done using Pootle.
commit ecddfbd616319434b517e38d38309daaf6206560
Author: Domen <dbc334(a)gmail.com>
Date:   Sat Sep 11 15:53:22 2010 +0200
    Translation update done using Pootle.
-----------------------------------------------------------------------
Summary of changes:
 output/{en_GB => sl}/INSTALL |    4 +-
 output/{en_GB => sl}/README  |   54 +++++++++++-----------
 output/{it => sl}/TODO       |    4 +-
 output/sl/index.html         |    3 +
 po/sl.po                     |  100 +++++++++++++++++++++++++++---------------
 5 files changed, 98 insertions(+), 67 deletions(-)
 copy output/{en_GB => sl}/INSTALL (60%)
 copy output/{en_GB => sl}/README (64%)
 copy output/{it => sl}/TODO (73%)
diff --git a/output/en_GB/INSTALL b/output/sl/INSTALL
similarity index 60%
copy from output/en_GB/INSTALL
copy to output/sl/INSTALL
index 56c8948..fbc6613 100644
--- a/output/en_GB/INSTALL
+++ b/output/sl/INSTALL
@@ -1,5 +1,5 @@
-phpMyAdmin - Installation
--------------------------
+phpMyAdmin - Namestitev
+-----------------------
 
 	Please have a look to the Documentation.txt or 
 	Documentation.html files.
diff --git a/output/en_GB/README b/output/sl/README
similarity index 64%
copy from output/en_GB/README
copy to output/sl/README
index 62569da..a9bcaab 100644
--- a/output/en_GB/README
+++ b/output/sl/README
@@ -1,5 +1,5 @@
-phpMyAdmin - Readme
-===================
+phpMyAdmin - Beri me
+====================
 
 A set of PHP-scripts to manage MySQL over the web.
 
@@ -34,46 +34,46 @@ You should have received a copy of the GNU General Public License along with
 this program; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
-Requirements
-~~~~~~~~~~~~
+Zahteve
+~~~~~~~
 
-* PHP 5.2 or later
-* MySQL 5.0 or later
-* a web-browser (doh!)
+* PHP 5.2 ali novejši
+* MySQL 5.0 ali novejši
+* spletni brskalnik (očitno!)
 
-Summary
-~~~~~~~
+Povzetek
+~~~~~~~~
 
 phpMyAdmin is intended to handle the administration of MySQL over the web.
 For a summary of features, please see the Documentation.txt/.html file.
 
-Download
-~~~~~~~~
+Prenesi
+~~~~~~~
 
-You can get the newest version at http://www.phpmyadmin.net/.
+Najnovejšo različico lahko dobite na http://www.phpmyadmin.net/.
 
-More Information
-~~~~~~~~~~~~~~~~
+Več informacij
+~~~~~~~~~~~~~~~
 
-Please see the Documentation.txt/.html file.
+Prosimo, oglejte si datoteko Documentation.txt/.html.
 
-Support
+Podpora
 ~~~~~~~
 
-See reference about support forums under http://www.phpmyadmin.net/
+Oglejte si sklice o podpornih forumih na http://www.phpmyadmin.net/
 
 
-Enjoy!
-~~~~~~
+Uživajte!
+~~~~~~~~~~
 
-The phpMyAdmin Devel team
+Skupina razvijalcev phpMyAdmin
 
 
-PS: 
-    Please, don't send us e-mails with question like "How do I compile
-    PHP with MySQL-support". We just don't have the time to be your
-    free helpdesk.
-    Please send your questions to the appropriate mailing-lists / forums.
-    Before contacting us, please read the Documentation.html (esp. the
-    FAQ part).
+Pripis: 
+    Prosimo, ne pošiljajte nam e-pošt z vprašanji, kot je "Kako prevedem
+    PHP s podporo MySQL". Preprosto nimamo časa, da bi bili vaša
+    brezplačna pomoč uporabnikom.
+    Prosimo, naslovite vaša vprašanja na primerne poštne sezname / forume.
+    Preden stopite v stik z nami, prosimo, preberite Documentation.html
+    (še posebej del FAQ).
 
diff --git a/output/it/TODO b/output/sl/TODO
similarity index 73%
copy from output/it/TODO
copy to output/sl/TODO
index 7e96527..81f156b 100644
--- a/output/it/TODO
+++ b/output/sl/TODO
@@ -1,5 +1,5 @@
-phpMyAdmin - Todo
-=================
+phpMyAdmin - Seznam opravil
+===========================
 
 We are currently using the Sourceforge Tracker as Todo list:
 
diff --git a/output/sl/index.html b/output/sl/index.html
index d711032..690dbf9 100644
--- a/output/sl/index.html
+++ b/output/sl/index.html
@@ -10,6 +10,9 @@
 <h1>phpMyAdmin Slovenian Documentation</h1>
 <p>Documents translated to Slovenian:</p>
 <ul>
+<li><a href="INSTALL">INSTALL</a></li>
+<li><a href="README">README</a></li>
+<li><a href="TODO">TODO</a></li>
 <li><a href="translators.html">Prevajalci</a></li>
 </ul>
 </body>
diff --git a/po/sl.po b/po/sl.po
index 0b26b9a..cd1dfba 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,15 +8,15 @@ msgstr ""
 "Project-Id-Version: phpMyAdmin documentation VERSION\n"
 "Report-Msgid-Bugs-To: phpmyadmin-devel(a)lists.sourceforge.net\n"
 "POT-Creation-Date: 2010-09-08 13:44+0300\n"
-"PO-Revision-Date: 2010-08-29 12:09+0200\n"
+"PO-Revision-Date: 2010-09-11 16:21+0200\n"
 "Last-Translator: Domen <dbc334(a)gmail.com>\n"
 "Language-Team: LANGUAGE <LL(a)li.org>\n"
 "Language: sl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
-"%100==4 ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3);\n"
 "X-Generator: Pootle 2.0.5\n"
 
 #. type: Content of: <html><head><title>
@@ -180,6 +180,8 @@ msgid ""
 "You need GD2 support in PHP to display inline thumbnails of JPEGs (""
 "image/jpeg: inline") with their original aspect ratio"
 msgstr ""
+"Za prikaz sličic JPEG v vrstici ("image/jpeg: inline") z njihovim "
+"izvirnim razmerjem potrebujete v PHP podporo GD2."
 
 #. type: Content of: <html><body><div><ul><li><ul><li>
 #: ../phpmyadmin/Documentation.html:74
@@ -190,6 +192,11 @@ msgid ""
 "<b>required</b> for 64–bit machines. Not using mcrypt will cause "
 "phpMyAdmin to load pages significantly slower."
 msgstr ""
+"Ko uporabljate <a href=\"#authentication_modes\">način overitve</a> "
+""cookie", je razširitev <a "
+"href=\"http://www.php.net/mcrypt\"><tt>mcrypt</tt></a> močno proporočljiva za "
+"večino uporabnikov in <b>potrebna</b> za 64–bitne naprave. Brez "
+"uporabe mcrypt bo phpMyAdmin nalagal strani občutno počasneje."
 
 #. type: Content of: <html><body><div><ul><li><ul><li>
 #: ../phpmyadmin/Documentation.html:81
@@ -197,6 +204,8 @@ msgid ""
 "To support upload progress bars, see <a href=\"#faq2_9\"> <abbr title="
 "\"Frequently Asked Questions\">FAQ</abbr> 2.9</a>."
 msgstr ""
+"Za podporo vrstice napredka pri nalaganju si oglejte <a href=\"#faq2_9\"> "
+"<abbr title=\"Frequently Asked Questions\">FAQ</abbr> 2.9</a>."
 
 #. type: Content of: <html><body><div><ul><li><ul><li>
 #: ../phpmyadmin/Documentation.html:83
@@ -230,6 +239,11 @@ msgid ""
 "MySQL user who can read/write only the desired database. It's up to you to "
 "look up the appropriate part in the MySQL manual."
 msgstr ""
+"phpMyAdmin lahko upravlja s celotnim strežnikom MySQL (potrebuje super-"
+"uporabnika), kakor tudi s posamezno zbirko podatkov. Za izvedbo slednjega "
+"potrebujete ustrezno nastavljenega uporabnika MySQL, ki lahko bere/piše samo "
+"v želeno zbirko podatkov. Na vas je, da poiščete ustrezni del v priročniku "
+"MySQL."
 
 #. type: Content of: <html><body><div><h3>
 #: ../phpmyadmin/Documentation.html:101
@@ -391,7 +405,7 @@ msgstr ""
 #. type: Content of: <html><body><div><h4>
 #: ../phpmyadmin/Documentation.html:149
 msgid "A word about users:"
-msgstr ""
+msgstr "Beseda o uporabnikih:"
 
 #. type: Content of: <html><body><div><p>
 #: ../phpmyadmin/Documentation.html:150
@@ -412,36 +426,41 @@ msgid ""
 "support (<tt>--with-bz2</tt>). Proper support may also need changes in "
 "<tt>php.ini</tt>."
 msgstr ""
+"<sup>1)</sup> phpMyAdmin lahko stisne (v formate Zip, GZip -RFC 1952- ali "
+"Bzip2) izpise in izvoze <abbr title=\"comma separated values\">CSV</abbr>, če "
+"uporabljate PHP s podporo Zlib (<tt>--with-zlib</tt>) in/ali podporo Bzip2 "
+"(<tt>--with-bz2</tt>). Primerna podpora morda zahteva tudi spremembe v "
+"<tt>php.ini</tt>."
 
 #. type: Content of: <html><body><div><h2>
 #: ../phpmyadmin/Documentation.html:165
 msgid "Installation"
-msgstr ""
+msgstr "Namestitev"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:167
 msgid "<a href=\"#quick_install\">Quick Install</a>"
-msgstr ""
+msgstr "<a href=\"#quick_install\">Hitra namestitev</a>"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:168
 msgid "<a href=\"#setup_script\">Setup script usage</a>"
-msgstr ""
+msgstr "<a href=\"#setup_script\">Uporaba namestitvenega skripta</a>"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:169
 msgid "<a href=\"#linked-tables\">phpMyAdmin configuration storage</a>"
-msgstr ""
+msgstr "<a href=\"#linked-tables\">Hramba konfiguracije phpMyAdmin</a>"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:170
 msgid "<a href=\"#upgrading\">Upgrading from an older version</a>"
-msgstr ""
+msgstr "<a href=\"#upgrading\">Nadgrajevanje starejše različice</a>"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:171
 msgid "<a href=\"#authentication_modes\">Using authentication modes</a>"
-msgstr ""
+msgstr "<a href=\"#authentication_modes\">Uporaba načinov overitve</a>"
 
 #. type: Content of: <html><body><div><p>
 #: ../phpmyadmin/Documentation.html:175
@@ -451,11 +470,15 @@ msgid ""
 "the MySQL databases properly. phpMyAdmin's "Privileges" page can "
 "be used for this."
 msgstr ""
+"phpMyAdmin ne uporablja posebnih varnostnih metod na strežniku zbirke "
+"podatkov MySQL. Še vedno ostaja delo sistemskega administratorja, da "
+"pravilno dodeli dovoljenja zbirkam podatkov MySQL. Za to se lahko uporabi "
+"tudi stran "Privilegiji" v phpMyAdminu."
 
 #. type: Content of: <html><body><div><p>
 #: ../phpmyadmin/Documentation.html:182
 msgid "Warning for <acronym title=\"Apple Macintosh\">Mac</acronym> users:"
-msgstr ""
+msgstr "Opozorilo za uporabnike <acronym title=\"Apple Macintosh\">Mac</acronym>:"
 
 #. type: Content of: <html><body><div><p>
 #: ../phpmyadmin/Documentation.html:183
@@ -478,7 +501,7 @@ msgstr ""
 #. type: Content of: <html><body><div><h3>
 #: ../phpmyadmin/Documentation.html:192
 msgid "Quick Install"
-msgstr ""
+msgstr "Hitra namestitev"
 
 #. type: Content of: <html><body><div><ol><li>
 #: ../phpmyadmin/Documentation.html:193
@@ -11564,9 +11587,9 @@ msgstr "-->"
 
 #. type: Title -
 #: ../phpmyadmin/INSTALL:2
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "phpMyAdmin - Installation\n"
-msgstr "Dokumentacija phpMyAdmin"
+msgstr "phpMyAdmin - Namestitev\n"
 
 #. type: Plain text
 #: ../phpmyadmin/INSTALL:6
@@ -11578,9 +11601,9 @@ msgstr ""
 
 #. type: Title =
 #: ../phpmyadmin/TODO:2
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "phpMyAdmin - Todo\n"
-msgstr "Domača stran phpMyAdmin"
+msgstr "phpMyAdmin - Seznam opravil\n"
 
 #. type: Plain text
 #: ../phpmyadmin/TODO:5
@@ -11600,9 +11623,9 @@ msgstr ""
 
 #. type: Title =
 #: ../phpmyadmin/README:2
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "phpMyAdmin - Readme\n"
-msgstr "Domača stran phpMyAdmin"
+msgstr "phpMyAdmin - Beri me\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:5
@@ -11640,31 +11663,30 @@ msgstr ""
 
 #. type: Title ~
 #: ../phpmyadmin/README:38
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "Requirements\n"
-msgstr "Zahteve"
+msgstr "Zahteve\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:41
 msgid "PHP 5.2 or later"
-msgstr ""
+msgstr "PHP 5.2 ali novejši"
 
 #. type: Plain text
 #: ../phpmyadmin/README:42
-#, fuzzy
 msgid "MySQL 5.0 or later"
-msgstr "Združljivo z MySQL 4.0"
+msgstr "MySQL 5.0 ali novejši"
 
 #. type: Plain text
 #: ../phpmyadmin/README:43
 msgid "a web-browser (doh!)"
-msgstr ""
+msgstr "spletni brskalnik (očitno!)"
 
 #. type: Title ~
 #: ../phpmyadmin/README:45
 #, no-wrap
 msgid "Summary\n"
-msgstr ""
+msgstr "Povzetek\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:49
@@ -11675,48 +11697,47 @@ msgstr ""
 
 #. type: Title ~
 #: ../phpmyadmin/README:51
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "Download\n"
-msgstr "Prenesi"
+msgstr "Prenesi\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:54
 msgid "You can get the newest version at http://www.phpmyadmin.net/."
-msgstr ""
+msgstr "Najnovejšo različico lahko dobite na http://www.phpmyadmin.net/."
 
 #. type: Title ~
 #: ../phpmyadmin/README:56
-#, fuzzy, no-wrap
+#, no-wrap
 msgid "More Information\n"
-msgstr "Podatki"
+msgstr "Več informacij\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:59
 msgid "Please see the Documentation.txt/.html file."
-msgstr ""
+msgstr "Prosimo, oglejte si datoteko Documentation.txt/.html."
 
 #. type: Title ~
 #: ../phpmyadmin/README:61
 #, no-wrap
 msgid "Support\n"
-msgstr ""
+msgstr "Podpora\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:64
 msgid "See reference about support forums under http://www.phpmyadmin.net/"
-msgstr ""
+msgstr "Oglejte si sklice o podpornih forumih na http://www.phpmyadmin.net/"
 
 #. type: Title ~
 #: ../phpmyadmin/README:67
 #, no-wrap
 msgid "Enjoy!\n"
-msgstr ""
+msgstr "Uživajte!\n"
 
 #. type: Plain text
 #: ../phpmyadmin/README:70
-#, fuzzy
 msgid "The phpMyAdmin Devel team"
-msgstr "Nastavitve za razvijalce phpMyAdmin"
+msgstr "Skupina razvijalcev phpMyAdmin"
 
 #. type: Plain text
 #: ../phpmyadmin/README:79
@@ -11730,6 +11751,13 @@ msgid ""
 "    Before contacting us, please read the Documentation.html (esp. the\n"
 "    FAQ part).\n"
 msgstr ""
+"Pripis: \n"
+"    Prosimo, ne pošiljajte nam e-pošt z vprašanji, kot je \"Kako prevedem\n"
+"    PHP s podporo MySQL\". Preprosto nimamo časa, da bi bili vaša\n"
+"    brezplačna pomoč uporabnikom.\n"
+"    Prosimo, naslovite vaša vprašanja na primerne poštne sezname / forume.\n"
+"    Preden stopite v stik z nami, prosimo, preberite Documentation.html\n"
+"    (še posebej del FAQ).\n"
 
 #~ msgid "Documentation version:"
 #~ msgstr "Različica dokumentacije:"
hooks/post-receive
-- 
phpMyAdmin localized documentation
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10093-g8c5f758
                        
                        
by Marc Delisle 12 Sep '10
                    by Marc Delisle 12 Sep '10
12 Sep '10
                    
                        The branch, master has been updated
       via  8c5f758e4ad5c2708eabdeae4f1dd81efaddf591 (commit)
      from  ae04356ed298c86901fb4948596b8c0c7fe1f449 (commit)
- Log -----------------------------------------------------------------
commit 8c5f758e4ad5c2708eabdeae4f1dd81efaddf591
Author: Marc Delisle <marc(a)infomarc.info>
Date:   Sun Sep 12 18:58:38 2010 -0400
    bug #3057481 Unchecking ignore does not work for duplicated insert rows
-----------------------------------------------------------------------
Summary of changes:
 js/tbl_change.js |   47 ++++++++++++++++++++++++++++++++++++++++++-----
 tbl_change.php   |   29 ++++++++++++++++-------------
 2 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/js/tbl_change.js b/js/tbl_change.js
index 4a4e444..52d8432 100644
--- a/js/tbl_change.js
+++ b/js/tbl_change.js
@@ -222,8 +222,6 @@ function Validator(urlField, multi_edit,theType){
             }
         }
     }
-
-    dt.className="";
  }
  /* End of datetime validation*/
 
@@ -261,6 +259,20 @@ function unNullify(urlField, multi_edit)
 $(document).ready(function() {
 
     /**
+     * Handles all current checkboxes for Null 
+     * 
+     */
+    $('.checkbox_null').bind('click', function(e) {
+            nullify(
+                // use hidden fields populated by tbl_change.php
+                $(this).siblings('.nullify_code').val(),
+                $(this).closest('tr').find('input:hidden').first().val(), 
+                $(this).siblings('.hashed_field').val(),
+                $(this).siblings('.multi_edit').val()
+            );
+    });
+
+    /**
      * Submission of data to be inserted into table
      * 
      * @uses    PMA_ajaxShowMessage()
@@ -302,7 +314,7 @@ $(document).ready(function() {
     }) // end submission of data to be inserted into table
 
     /**
-     * Restart Insertion form
+     * Continue Insertion form
      */
     $("#insert_rows").live('change', function(event) {
         event.preventDefault();
@@ -352,8 +364,33 @@ $(document).ready(function() {
                     /** generate the new name i.e. funcs[multi_edit][11][foobarbaz] */
                     var new_name = name_parts[0] + '[' + new_row_index + ']' + name_parts[1];
 
+                    var hashed_field = name_parts[1].match(/\[(.+)\]/)[1];
                     $(this).attr('name', new_name);
-                    $(this).attr('value', '');
+
+                    $(this).filter('.textfield')
+                        .attr('value', '')
+                        .unbind('change')
+                        .attr('onchange', null)
+                        .bind('change', function(e) {
+                            Validator(
+                                hashed_field, 
+                                new_row_index, 
+                                $(this).closest('tr').find('span.column_type').html()
+                                );
+                        })
+                        .end();
+
+                    $(this).filter('.checkbox_null')
+                        .bind('click', function(e) {
+                                nullify(
+                                    $(this).siblings('.nullify_code').val(),
+                                    $(this).closest('tr').find('input:hidden').first().val(), 
+                                    hashed_field, 
+                                    '[multi_edit][' + new_row_index + ']'
+                                    );
+                        }) 
+                        .end();
+
                 });
 
                 //Insert/Clone the ignore checkboxes
@@ -378,7 +415,7 @@ $(document).ready(function() {
 
                     $(last_checkbox)
                     .clone()
-                    .attr({'id':new_name, 'name': new_name})
+                    .attr({'id':new_name, 'name': new_name, 'checked': true})
                     .add('label[for^=insert_ignore]:last')
                     .clone()
                     .attr('for', new_name)
diff --git a/tbl_change.php b/tbl_change.php
index 6d2e957..3e4d814 100644
--- a/tbl_change.php
+++ b/tbl_change.php
@@ -431,8 +431,8 @@ foreach ($rows as $row_id => $vrow) {
                 <input type="hidden" name="fields_name<?php echo $field_name_appendix; ?>" value="<?php echo $field['Field_html']; ?>"/>
             </td>
 <?php if ($cfg['ShowFieldTypesInDataEditView']) { ?>
-             <td align="center"<?php echo $field['wrap']; ?>>
-                 <?php echo $field['pma_type']; ?>
+             <td align="center"<?php echo $field['wrap']; ?>><span class="column_type">
+                 <?php echo $field['pma_type']; ?></span>
              </td>
 
          <?php } //End if
@@ -614,32 +614,35 @@ foreach ($rows as $row_id => $vrow) {
             }
             echo ' />' . "\n";
 
-            echo '            <input type="checkbox" tabindex="' . ($tabindex + $tabindex_for_null) . '"'
+            echo '            <input type="checkbox" class="checkbox_null" tabindex="' . ($tabindex + $tabindex_for_null) . '"'
                  . ' name="fields_null' . $field_name_appendix . '"';
             if ($real_null_value && !$field['first_timestamp']) {
                 echo ' checked="checked"';
             }
-            echo ' id="field_' . ($idindex) . '_2"';
-            $onclick         = ' onclick="if (this.checked) {nullify(';
+            echo ' id="field_' . ($idindex) . '_2" />';
+            
+            // nullify_code is needed by the js nullify() function
             if (strstr($field['True_Type'], 'enum')) {
                 if (strlen($field['Type']) > 20) {
-                    $onclick .= '1, ';
+                    $nullify_code = '1';
                 } else {
-                    $onclick .= '2, ';
+                    $nullify_code = '2';
                 }
             } elseif (strstr($field['True_Type'], 'set')) {
-                $onclick     .= '3, ';
+                $nullify_code = '3';
             } elseif ($foreigners && isset($foreigners[$field['Field']]) && $foreignData['foreign_link'] == false) {
                 // foreign key in a drop-down
-                $onclick     .= '4, ';
+                $nullify_code = '4';
             } elseif ($foreigners && isset($foreigners[$field['Field']]) && $foreignData['foreign_link'] == true) {
                 // foreign key with a browsing icon
-                $onclick     .= '6, ';
+                $nullify_code = '6';
             } else {
-                $onclick     .= '5, ';
+                $nullify_code = '5';
             }
-            $onclick         .= '\'' . PMA_escapeJsString($field['Field_html']) . '\', \'' . $field['Field_md5'] . '\', \'' . PMA_escapeJsString($vkey) . '\'); this.checked = true}; return true" />' . "\n";
-            echo $onclick;
+            // to be able to generate calls to nullify() in jQuery 
+            echo '<input type="hidden" class="nullify_code" name="nullify_code' . $field_name_appendix . '" value="' . $nullify_code . '" />';
+            echo '<input type="hidden" class="hashed_field" name="hashed_field' . $field_name_appendix . '" value="' .  $field['Field_md5'] . '" />';
+            echo '<input type="hidden" class="multi_edit" name="multi_edit' . $field_name_appendix . '" value="' . PMA_escapeJsString($vkey) . '" />';
         }
         echo '        </td>' . "\n";
 
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10092-gae04356
                        
                        
by Dieter Adriaenssens 11 Sep '10
                    by Dieter Adriaenssens 11 Sep '10
11 Sep '10
                    
                        The branch, master has been updated
       via  ae04356ed298c86901fb4948596b8c0c7fe1f449 (commit)
       via  adaa35a87feeaf079d4178bb471073e0e19a75b6 (commit)
      from  e539a03ef938fb5df7950603bc196d2506c2c9b4 (commit)
- Log -----------------------------------------------------------------
commit ae04356ed298c86901fb4948596b8c0c7fe1f449
Merge: e539a03ef938fb5df7950603bc196d2506c2c9b4 adaa35a87feeaf079d4178bb471073e0e19a75b6
Author: Dieter Adriaenssens <ruleant(a)users.sourceforge.net>
Date:   Sat Sep 11 16:34:16 2010 +0200
    Merge branch 'QA_3_3'
-----------------------------------------------------------------------
Summary of changes:
 ChangeLog                                          |    1 +
 libraries/PHPExcel/PHPExcel.php                    |    4 +-
 libraries/PHPExcel/PHPExcel/Autoloader.php         |    2 +-
 .../PHPExcel/PHPExcel/CachedObjectStorage/APC.php  |   45 +++-
 .../PHPExcel/CachedObjectStorage/CacheBase.php     |   35 ++-
 .../PHPExcel/CachedObjectStorage/DiscISAM.php      |   28 ++-
 .../PHPExcel/CachedObjectStorage/ICache.php        |    9 +-
 .../PHPExcel/CachedObjectStorage/Memcache.php      |   53 +++-
 .../PHPExcel/CachedObjectStorage/Memory.php        |    2 +-
 .../PHPExcel/CachedObjectStorage/MemoryGZip.php    |    2 +-
 .../CachedObjectStorage/MemorySerialized.php       |    2 +-
 .../PHPExcel/CachedObjectStorage/PHPTemp.php       |   26 ++-
 .../PHPExcel/CachedObjectStorage/Wincache.php      |   58 +++-
 libraries/PHPExcel/PHPExcel/Calculation.php        |  105 +++++--
 .../PHPExcel/PHPExcel/Calculation/Exception.php    |    2 +-
 .../PHPExcel/Calculation/ExceptionHandler.php      |    2 +-
 .../PHPExcel/Calculation/FormulaParser.php         |    2 +-
 .../PHPExcel/PHPExcel/Calculation/FormulaToken.php |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Function.php     |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Functions.php    |  175 ++++++-------
 libraries/PHPExcel/PHPExcel/Cell.php               |  296 ++++++++++----------
 .../PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/DataType.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DataValidation.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DefaultValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Comment.php            |    2 +-
 libraries/PHPExcel/PHPExcel/DocumentProperties.php |   93 ++++---
 libraries/PHPExcel/PHPExcel/DocumentSecurity.php   |    2 +-
 libraries/PHPExcel/PHPExcel/HashTable.php          |    2 +-
 libraries/PHPExcel/PHPExcel/IComparable.php        |    2 +-
 libraries/PHPExcel/PHPExcel/IOFactory.php          |    2 +-
 libraries/PHPExcel/PHPExcel/NamedRange.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/CSV.php         |    2 +-
 .../PHPExcel/PHPExcel/Reader/DefaultReadFilter.php |    2 +-
 .../PHPExcel/PHPExcel/Reader/Excel2003XML.php      |    7 +-
 libraries/PHPExcel/PHPExcel/Reader/Excel2007.php   |   55 +++-
 libraries/PHPExcel/PHPExcel/Reader/Excel5.php      |   77 +++---
 .../PHPExcel/PHPExcel/Reader/Excel5/Escher.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReader.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/OOCalc.php      |   15 +-
 libraries/PHPExcel/PHPExcel/Reader/SYLK.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/Serialized.php  |    2 +-
 libraries/PHPExcel/PHPExcel/ReferenceHelper.php    |  161 ++++++++---
 libraries/PHPExcel/PHPExcel/RichText.php           |    2 +-
 .../PHPExcel/PHPExcel/RichText/ITextElement.php    |    2 +-
 libraries/PHPExcel/PHPExcel/RichText/Run.php       |    2 +-
 .../PHPExcel/PHPExcel/RichText/TextElement.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Settings.php           |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/CodePage.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Date.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Drawing.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Escher.php      |    2 +-
 .../PHPExcel/Shared/Escher/DgContainer.php         |    2 +-
 .../Shared/Escher/DgContainer/SpgrContainer.php    |    2 +-
 .../DgContainer/SpgrContainer/SpContainer.php      |    2 +-
 .../PHPExcel/Shared/Escher/DggContainer.php        |   28 ++-
 .../Shared/Escher/DggContainer/BstoreContainer.php |    2 +-
 .../Escher/DggContainer/BstoreContainer/BSE.php    |    2 +-
 .../DggContainer/BstoreContainer/BSE/Blip.php      |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Excel5.php      |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/File.php        |   21 +-
 libraries/PHPExcel/PHPExcel/Shared/Font.php        |    2 +-
 .../PHPExcel/Shared/OLE/ChainedBlockStream.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/OLERead.php     |    2 +-
 .../PHPExcel/PHPExcel/Shared/PasswordHasher.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/String.php      |    4 +-
 libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php   |   11 +-
 .../PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php  |    2 +-
 .../PHPExcel/Shared/trend/bestFitClass.php         |    2 +-
 .../Shared/trend/exponentialBestFitClass.php       |    2 +-
 .../PHPExcel/Shared/trend/linearBestFitClass.php   |    2 +-
 .../Shared/trend/logarithmicBestFitClass.php       |    2 +-
 .../Shared/trend/polynomialBestFitClass.php        |    2 +-
 .../PHPExcel/Shared/trend/powerBestFitClass.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Style.php              |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Alignment.php    |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Border.php       |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Borders.php      |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Color.php        |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Conditional.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Style/Fill.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Font.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/NumberFormat.php |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Protection.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet.php          |   15 +-
 .../PHPExcel/PHPExcel/Worksheet/BaseDrawing.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/CellIterator.php   |    2 +-
 .../PHPExcel/Worksheet/ColumnDimension.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/HeaderFooter.php   |    2 +-
 .../PHPExcel/Worksheet/HeaderFooterDrawing.php     |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageMargins.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageSetup.php      |  213 ++++++++++++---
 .../PHPExcel/PHPExcel/Worksheet/Protection.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Row.php      |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowDimension.php   |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowIterator.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/SheetView.php      |    2 +-
 libraries/PHPExcel/PHPExcel/WorksheetIterator.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/CSV.php         |    5 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel2007.php   |    5 +-
 .../PHPExcel/Writer/Excel2007/Comments.php         |    2 +-
 .../PHPExcel/Writer/Excel2007/ContentTypes.php     |    2 +-
 .../PHPExcel/Writer/Excel2007/DocProps.php         |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Rels.php    |    2 +-
 .../PHPExcel/Writer/Excel2007/StringTable.php      |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Style.php   |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Theme.php   |    2 +-
 .../PHPExcel/Writer/Excel2007/Workbook.php         |    2 +-
 .../PHPExcel/Writer/Excel2007/Worksheet.php        |   15 +-
 .../PHPExcel/Writer/Excel2007/WriterPart.php       |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel5.php      |  285 ++++++++++++++++++-
 .../PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Escher.php     |    9 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Parser.php     |   20 ++-
 .../PHPExcel/PHPExcel/Writer/Excel5/Workbook.php   |  172 +++---------
 .../PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php  |  211 ++++++---------
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/HTML.php        |   11 +-
 libraries/PHPExcel/PHPExcel/Writer/IWriter.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/PDF.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/Serialized.php  |    6 +-
 129 files changed, 1563 insertions(+), 917 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d15366e..f31420a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -115,6 +115,7 @@
 
 3.3.8.0 (not yet released)
 - bug #3059311 [import] BIGINT field type added to table analysis
+- [core] Update library PHPExcel to version 1.7.4
 
 3.3.7.0 (2010-09-07)
 - patch #3050492 [PDF scratchboard] Cannot drag table box to the edge after
diff --git a/libraries/PHPExcel/PHPExcel.php b/libraries/PHPExcel/PHPExcel.php
index 8b9c71f..c54d421 100644
--- a/libraries/PHPExcel/PHPExcel.php
+++ b/libraries/PHPExcel/PHPExcel.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -434,7 +434,7 @@ class PHPExcel
 
 		// update the cellXfs
 		foreach ($pSheet->getCellCollection(false) as $cellID) {
-			$cell = $sheet->getCell($cellID);
+			$cell = $pSheet->getCell($cellID);
 			$cell->setXfIndex( $cell->getXfIndex() + $countCellXfs );
 		}
 
diff --git a/libraries/PHPExcel/PHPExcel/Autoloader.php b/libraries/PHPExcel/PHPExcel/Autoloader.php
index 3821d74..e66ce60 100644
--- a/libraries/PHPExcel/PHPExcel/Autoloader.php
+++ b/libraries/PHPExcel/PHPExcel/Autoloader.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 class PHPExcel_Autoloader
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
index 62e3a14..dae46c2 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -45,7 +45,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 
 		if (!apc_store($this->_cachePrefix.$this->_currentObjectID.'.cache',serialize($this->_currentObject),$this->_cacheTime)) {
 			$this->__destruct();
-			throw new Exception('Failed to store cell in APC');
+			throw new Exception('Failed to store cell '.$cellID.' in APC');
 		}
 		$this->_currentObjectID = $this->_currentObject = null;
 	}	//	function _storeData()
@@ -90,7 +90,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 			if ($success === false) {
 				//	Entry no longer exists in APC, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in APC');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
 			}
 			return true;
 		}
@@ -117,7 +117,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 			if ($obj === false) {
 				//	Entry no longer exists in APC, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in APC');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -150,6 +150,35 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$obj = apc_fetch($this->_cachePrefix.$cellID.'.cache');
+				if ($obj === false) {
+					//	Entry no longer exists in APC, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
+				}
+				if (!apc_store($newCachePrefix.$cellID.'.cache',$obj,$this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in APC');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -170,12 +199,8 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 		$cacheTime	= (isset($arguments['cacheTime']))	? $arguments['cacheTime']	: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 			$this->_cacheTime = $cacheTime;
 
 			parent::__construct($parent);
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
index 9871d90..208ed02 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -116,7 +116,7 @@ class PHPExcel_CachedObjectStorage_CacheBase {
 			$this->_currentObjectID = $this->_currentObject = null;
 		}
 
-		if (isset($this->_cellCache[$pCoord])) {
+		if (is_object($this->_cellCache[$pCoord])) {
 			$this->_cellCache[$pCoord]->detach();
 			unset($this->_cellCache[$pCoord]);
 		}
@@ -141,13 +141,34 @@ class PHPExcel_CachedObjectStorage_CacheBase {
 	public function getSortedCellList() {
 		$sortKeys = array();
 		foreach ($this->_cellCache as $coord => $value) {
-			preg_match('/^(\w+)(\d+)$/U',$coord,$matches);
-			list(,$colNum,$rowNum) = $matches;
-			$sortKeys[$coord] =  str_pad($rowNum . str_pad($colNum,3,'@',STR_PAD_LEFT),12,'0',STR_PAD_LEFT);
+			list($colNum,$rowNum) = sscanf($coord,'%[A-Z]%d');
+			$sortKeys[sprintf('%09d%3s',$rowNum,$colNum)] = $coord;
 		}
-		asort($sortKeys);
+		ksort($sortKeys);
 
-		return array_keys($sortKeys);
+		return array_values($sortKeys);
 	}	//	function sortCellList()
 
+
+	protected function _getUniqueID() {
+		if (function_exists('posix_getpid')) {
+			$baseUnique = posix_getpid();
+		} else {
+			$baseUnique = mt_rand();
+		}
+		return uniqid($baseUnique,true);
+	}
+
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		$this->_parent = $parent;
+		if ((!is_null($this->_currentObject)) && (is_object($this->_currentObject))) {
+			$this->_currentObject->attach($parent);
+		}
+	}	//	function copyCellCollection()
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
index e685607..dff52fa 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -103,6 +103,24 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage
 	}	//	function getCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newFileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache';
+		//	Copy the existing cell cache file
+		copy ($this->_fileName,$newFileName);
+		$this->_fileName = $newFileName;
+		//	Open the copied cell cache file
+		$this->_fileHandle = fopen($this->_fileName,'a+');
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -121,12 +139,8 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage
 	public function __construct(PHPExcel_Worksheet $parent) {
 		parent::__construct($parent);
 		if (is_null($this->_fileHandle)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_fileName = sys_get_temp_dir().'/PHPExcel.'.uniqid($baseUnique,true).'.cache';
+			$baseUnique = $this->_getUniqueID();
+			$this->_fileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache';
 			$this->_fileHandle = fopen($this->_fileName,'a+');
 		}
 	}	//	function __construct()
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
index f3282aa..4731b8e 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -94,4 +94,11 @@ interface PHPExcel_CachedObjectStorage_ICache
 	 */
 	public function getSortedCellList();
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent);
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
index f1fc43c..74df8e8 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -49,7 +49,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 		if (!$this->_memcache->replace($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) {
 			if (!$this->_memcache->add($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) {
 				$this->__destruct();
-				throw new Exception('Failed to store cell in Memcache');
+				throw new Exception('Failed to store cell '.$cellID.' in MemCache');
 			}
 		}
 		$this->_currentObjectID = $this->_currentObject = null;
@@ -90,12 +90,12 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 			if ($this->_currentObjectID == $pCoord) {
 				return true;
 			}
-			//	Check if the requested entry still exists in apc
+			//	Check if the requested entry still exists in Memcache
 			$success = $this->_memcache->get($this->_cachePrefix.$pCoord.'.cache');
 			if ($success === false) {
 				//	Entry no longer exists in Memcache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Memcache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
 			}
 			return true;
 		}
@@ -122,7 +122,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 			if ($obj === false) {
 				//	Entry no longer exists in Memcache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Memcache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -155,6 +155,35 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$obj = $this->_memcache->get($this->_cachePrefix.$cellID.'.cache');
+				if ($obj === false) {
+					//	Entry no longer exists in Memcache, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
+				}
+				if (!$this->_memcache->add($newCachePrefix.$cellID.'.cache',$obj,NULL,$this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in MemCache');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -177,17 +206,13 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 		$cacheTime		= (isset($arguments['cacheTime']))		? $arguments['cacheTime']		: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 
 			//	Set a new Memcache object and connect to the Memcache server
 			$this->_memcache = new Memcache();
-			if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback')) {
-				throw new Exception('Could not connect to Memcache server at '.$memcacheServer.':'.$memcachePort);
+			if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) {
+				throw new Exception('Could not connect to MemCache server at '.$memcacheServer.':'.$memcachePort);
 			}
 			$this->_cacheTime = $cacheTime;
 
@@ -197,7 +222,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 
 
 	public function failureCallback($host, $port) {
-		throw new Exception('memcache '.$host.':'.$port' failed');
+		throw new Exception('memcache '.$host.':'.$port.' failed');
 	}
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
index be0fade..4b59b91 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
index c281389..394faf2 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
index 9c29ea2..0b5b997 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
index 98cd952..54810d8 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -38,6 +38,8 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 	private $_fileHandle = null;
 
 
+	private $_memoryCacheSize = null;
+
 	private function _storeData() {
 		$this->_currentObject->detach();
 
@@ -102,6 +104,24 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 	}	//	function getCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Open a new stream for the cell cache data
+		$newFileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+');
+		//	Copy the existing cell cache data to the new stream
+		fseek($this->_fileHandle,0);
+		while (!feof($this->_fileHandle)) {
+			fwrite($newFileHandle,fread($this->_fileHandle, 1024));
+		}
+		$this->_fileHandle = $newFileHandle;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -118,11 +138,11 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 
 
 	public function __construct(PHPExcel_Worksheet $parent, $memoryCacheSize = '1MB') {
-		$memoryCacheSize	= (isset($arguments['memoryCacheSize']))	? $arguments['memoryCacheSize']	: '1MB';
+		$this->_memoryCacheSize	= (isset($arguments['memoryCacheSize']))	? $arguments['memoryCacheSize']	: '1MB';
 
 		parent::__construct($parent);
 		if (is_null($this->_fileHandle)) {
-			$this->_fileHandle = fopen('php://temp/maxmemory:'.$memoryCacheSize,'a+');
+			$this->_fileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+');
 		}
 	}	//	function __construct()
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
index d759d7c..aa075be 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -45,9 +45,15 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 
 		$obj = serialize($this->_currentObject);
 		if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
-			wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime);
+			if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
+				$this->__destruct();
+				throw new Exception('Failed to store cell '.$cellID.' in WinCache');
+			}
 		} else {
-			wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime);
+			if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
+				$this->__destruct();
+				throw new Exception('Failed to store cell '.$cellID.' in WinCache');
+			}
 		}
 
 		$this->_currentObjectID = $this->_currentObject = null;
@@ -93,7 +99,7 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 			if ($success === false) {
 				//	Entry no longer exists in Wincache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Wincache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache');
 			}
 			return true;
 		}
@@ -120,9 +126,9 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 			$success = false;
 			$obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
 			if ($success === false) {
-				//	Entry no longer exists in Wincache, so clear it from the cache array
+				//	Entry no longer exists in WinCache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Wincache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -155,13 +161,43 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$success = false;
+				$obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
+				if ($success === false) {
+					//	Entry no longer exists in WinCache, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in Wincache');
+				}
+				if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in Wincache');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
 			$this->_currentObject = $this->_currentObjectID = null;
 		}
 
-		//	Flush the Wincache cache
+		//	Flush the WinCache cache
 		$this->__destruct();
 
 		$this->_cellCache = array();
@@ -175,12 +211,8 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 		$cacheTime	= (isset($arguments['cacheTime']))	? $arguments['cacheTime']	: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 			$this->_cacheTime = $cacheTime;
 
 			parent::__construct($parent);
diff --git a/libraries/PHPExcel/PHPExcel/Calculation.php b/libraries/PHPExcel/PHPExcel/Calculation.php
index 6e8499e..e32891a 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -2248,7 +2248,7 @@ class PHPExcel_Calculation {
 		}
 		$this->debugLogStack[] = $wsTitle.'!'.$cellID;
 		//	Parse the formula onto the token stack and calculate the value
-		$cellValue = $this->_processTokenStack($this->_parseFormula($formula), $cellID, $pCell);
+		$cellValue = $this->_processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell);
 		array_pop($this->debugLogStack);
 
 		// Save to calculation cache
@@ -2462,31 +2462,24 @@ class PHPExcel_Calculation {
 			$value = array_pop($testArray);
 		}
 
-		switch (gettype($value)) {
-			case 'double'	:
-			case 'float'	:
-				$typeString = 'a floating point number';
-				break;
-			case 'integer'	:
-				$typeString = 'an integer number';
-				break;
-			case 'boolean'	:
-				$typeString = 'a boolean';
-				break;
-			case 'array'	:
-				$typeString = 'a matrix';
-				break;
-			case 'string'	:
-				if ($value == '') {
-					return 'an empty string';
-				} elseif ($value{0} == '#') {
-					return 'a '.$value.' error';
-				} else {
-					$typeString = 'a string';
-				}
-				break;
-			case 'NULL'	:
-				return 'a null value';
+		if (is_null($value)) {
+			return 'a null value';
+		} elseif (is_float($value)) {
+			$typeString = 'a floating point number';
+		} elseif(is_int($value)) {
+			$typeString = 'an integer number';
+		} elseif(is_bool($value)) {
+			$typeString = 'a boolean';
+		} elseif(is_array($value)) {
+			$typeString = 'a matrix';
+		} else {
+			if ($value == '') {
+				return 'an empty string';
+			} elseif ($value{0} == '#') {
+				return 'a '.$value.' error';
+			} else {
+				$typeString = 'a string';
+			}
 		}
 		return $typeString.' with a value of '.self::_showValue($value);
 	}	//	function _showTypeDetails()
@@ -2548,11 +2541,15 @@ class PHPExcel_Calculation {
 
 
 	// Convert infix to postfix notation
-	private function _parseFormula($formula) {
+	private function _parseFormula($formula, PHPExcel_Cell $pCell = null) {
 		if (($formula = self::_convertMatrixReferences(trim($formula))) === false) {
 			return false;
 		}
 
+		//	If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet),
+		//		so we store the parent worksheet so that we can re-attach it when necessary
+		$pCellParent = (!is_null($pCell)) ? $pCell->getParent() : null;
+
 		//	Binary Operators
 		//	These operators always work on two values
 		//	Array key is the operator, the value indicates whether this is a left or right associative operator
@@ -2774,12 +2771,56 @@ class PHPExcel_Calculation {
 //					echo 'Element '.$val.' is a Cell reference<br />';
 //					Watch for this case-change when modifying to allow cell references in different worksheets...
 //						Should only be applied to the actual cell column, not the worksheet name
+
+					//	If the last entry on the stack was a : operator, then we have a cell range reference
+					$testPrevOp = $stack->last(1);
+					if ($testPrevOp['value'] == ':') {
+						//	If we have a worksheet reference, then we're playing with a 3D reference
+						if ($matches[2] == '') {
+							//	Otherwise, we 'inherit' the worksheet reference from the start cell reference
+							//	The start of the cell range reference should be the last entry in $output
+							$startCellRef = $output[count($output)-1]['value'];
+							preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches);
+							if ($startMatches[2] > '') {
+								$val = $startMatches[2].'!'.$val;
+							}
+						}
+					}
 					$cellRef = strtoupper($val);
-//					$output[] = $cellRef;
+
 					$output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $cellRef);
 //					$expectingOperator = false;
 				} else {	// it's a variable, constant, string, number or boolean
 //					echo 'Element is a Variable, Constant, String, Number or Boolean<br />';
+					//	If the last entry on the stack was a : operator, then we may have a row or column range reference
+					$testPrevOp = $stack->last(1);
+					if ($testPrevOp['value'] == ':') {
+						$startRowColRef = $output[count($output)-1]['value'];
+						$rangeWS1 = '';
+						if (strpos('!',$startRowColRef) !== false) {
+							list($rangeWS1,$startRowColRef) = explode('!',$startRowColRef);
+						}
+						if ($rangeWS1 != '') $rangeWS1 .= '!';
+						$rangeWS2 = $rangeWS1;
+						if (strpos('!',$val) !== false) {
+							list($rangeWS2,$val) = explode('!',$val);
+						}
+						if ($rangeWS2 != '') $rangeWS2 .= '!';
+						if ((is_integer($startRowColRef)) && (ctype_digit($val)) &&
+							($startRowColRef <= 1048576) && ($val <= 1048576)) {
+							//	Row range
+							$endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestColumn() : 'XFD';	//	Max 16,384 columns for Excel2007
+							$output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef;
+							$val = $rangeWS2.$endRowColRef.$val;
+						} elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) &&
+							(strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) {
+							//	Column range
+							$endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestRow() : 1048576;		//	Max 1,048,576 rows for Excel2007
+							$output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1';
+							$val = $rangeWS2.$val.$endRowColRef;
+						}
+					}
+
 					$localeConstant = false;
 					if ($opCharacter == '"') {
 //						echo 'Element is a String<br />';
@@ -2808,6 +2849,8 @@ class PHPExcel_Calculation {
 				}
 				$index += $length;
 
+			} elseif ($opCharacter == '$') {	// absolute row or column range
+				$index++;
 			} elseif ($opCharacter == ')') {	// miscellaneous error checking
 				if ($expectingOperand) {
 					$output[] = array('type' => 'Null Value', 'value' => self::$_ExcelConstants['NULL'], 'reference' => NULL);
@@ -3067,7 +3110,7 @@ class PHPExcel_Calculation {
 								return $this->_raiseFormulaError('Unable to access Cell Reference');
 							}
 							$this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
-							$cellRef = $matches[2].'!'.$cellRef;
+//							$cellRef = $matches[2].'!'.$cellRef;
 						} else {
 //							echo '$cellRef='.$cellRef.' in current worksheet<br />';
 							$this->_writeDebug('Evaluating Cell Range '.$cellRef.' in current worksheet');
@@ -3101,7 +3144,7 @@ class PHPExcel_Calculation {
 								return $this->_raiseFormulaError('Unable to access Cell Reference');
 							}
 							$this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
-							$cellRef = $matches[2].'!'.$cellRef;
+//							$cellRef = $matches[2].'!'.$cellRef;
 						} else {
 //							echo '$cellRef='.$cellRef.' in current worksheet<br />';
 							$this->_writeDebug('Evaluating Cell '.$cellRef.' in current worksheet');
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
index 8e77b9d..b94f3f4 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
index 9956167..7050260 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
index 8fcde41..271aa75 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
index 69d7f42..8c1396e 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Function.php b/libraries/PHPExcel/PHPExcel/Calculation/Function.php
index 783e533..81dfc99 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Function.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Function.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
index 8ce3cfd..805f483 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Calculation
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
@@ -1885,7 +1885,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -1937,7 +1937,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -1984,7 +1984,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -2036,7 +2036,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -5691,7 +5691,7 @@ class PHPExcel_Calculation_Functions {
 	 *	@return	string	Version information
 	 */
 	public static function VERSION() {
-		return 'PHPExcel 1.7.3c, 2010-06-01';
+		return 'PHPExcel 1.7.4, 2010-08-26';
 	}	//	function VERSION()
 
 
@@ -11139,112 +11139,101 @@ class PHPExcel_Calculation_Functions {
 	 *	@return	integer			The relative position of the found item
 	 */
 	public static function MATCH($lookup_value, $lookup_array, $match_type=1) {
-
-		// flatten the lookup_array
 		$lookup_array = self::flattenArray($lookup_array);
-
-		// flatten lookup_value since it may be a cell reference to a value or the value itself
 		$lookup_value = self::flattenSingleValue($lookup_value);
-
-		// MATCH is not case sensitive
+		$match_type	= (is_null($match_type)) ? 1 : (int) self::flattenSingleValue($match_type);
+		//	MATCH is not case sensitive
 		$lookup_value = strtolower($lookup_value);
 
-		/*
-		echo "--------------------<br>looking for $lookup_value in <br>";
-		print_r($lookup_array);
-		echo "<br>";
-		//return 1;
-		/**/
-
-		// **
-		// check inputs
-		// **
-		// lookup_value type has to be number, text, or logical values
-		if (!is_numeric($lookup_value) && !is_string($lookup_value) && !is_bool($lookup_value)){
-			// error: lookup_array should contain only number, text, or logical values
-			//echo "error: lookup_array should contain only number, text, or logical values<br>";
+		//	lookup_value type has to be number, text, or logical values
+		if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) {
 			return self::$_errorCodes['na'];
 		}
 
-		// match_type is 0, 1 or -1
-		if ($match_type!==0 && $match_type!==-1 && $match_type!==1){
-			// error: wrong value for match_type
-			//echo "error: wrong value for match_type<br>";
+		//	match_type is 0, 1 or -1
+		if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) {
 			return self::$_errorCodes['na'];
 		}
 
-		// lookup_array should not be empty
-		if (sizeof($lookup_array)<=0){
-			// error: empty range
-			//echo "error: empty range ".sizeof($lookup_array)."<br>";
+		//	lookup_array should not be empty
+		$lookupArraySize = count($lookup_array);
+		if ($lookupArraySize <= 0) {
 			return self::$_errorCodes['na'];
 		}
 
-		// lookup_array should contain only number, text, or logical values
-		for ($i=0;$i<sizeof($lookup_array);++$i){
-			// check the type of the value
-			if (!is_numeric($lookup_array[$i]) && !is_string($lookup_array[$i]) && !is_bool($lookup_array[$i])){
-				// error: lookup_array should contain only number, text, or logical values
-				//echo "error: lookup_array should contain only number, text, or logical values<br>";
+		//	lookup_array should contain only number, text, or logical values, or empty (null) cells
+		foreach($lookup_array as $i => $lookupArrayValue) {
+			//	check the type of the value
+			if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) &&
+				(!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) {
 				return self::$_errorCodes['na'];
 			}
-			// convert tpo lowercase
-			if (is_string($lookup_array[$i]))
-				$lookup_array[$i] = strtolower($lookup_array[$i]);
+			//	convert strings to lowercase for case-insensitive testing
+			if (is_string($lookupArrayValue)) {
+				$lookup_array[$i] = strtolower($lookupArrayValue);
+			}
+			if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) {
+				$lookup_array = array_slice($lookup_array,0,$i-1);
+			}
 		}
 
 		// if match_type is 1 or -1, the list has to be ordered
-		if($match_type==1 || $match_type==-1){
-			// **
-			// iniitialization
-			// store the last value
-			$iLastValue=$lookup_array[0];
-			// **
-			// loop on the cells
-			for ($i=0;$i<sizeof($lookup_array);++$i){
-				// check ascending order
-				if(($match_type==1 && $lookup_array[$i]<$iLastValue)
-					// OR check descending order
-					|| ($match_type==-1 && $lookup_array[$i]>$iLastValue)){
-					// error: list is not ordered correctly
-					//echo "error: list is not ordered correctly<br>";
-					return self::$_errorCodes['na'];
-				}
-			}
+		if ($match_type == 1) {
+			asort($lookup_array);
+			$keySet = array_keys($lookup_array);
+		} elseif($match_type == -1) {
+			arsort($lookup_array);
+			$keySet = array_keys($lookup_array);
 		}
+
 		// **
 		// find the match
 		// **
 		// loop on the cells
-		for ($i=0; $i < sizeof($lookup_array); ++$i){
-			// if match_type is 0 <=> find the first value that is exactly equal to lookup_value
-			if ($match_type==0 && $lookup_array[$i]==$lookup_value){
-				// this is the exact match
-				return $i+1;
-			}
-			// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value
-			if ($match_type==-1 && $lookup_array[$i] < $lookup_value){
-				if ($i<1){
+//		var_dump($lookup_array);
+//		echo '<br />';
+		foreach($lookup_array as $i => $lookupArrayValue) {
+			if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) {
+				//	exact match
+				return ++$i;
+			} elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) {
+//				echo '$i = '.$i.' => ';
+//				var_dump($lookupArrayValue);
+//				echo '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value
+				if ($i < 1){
 					// 1st cell was allready smaller than the lookup_value
 					break;
-				}
-				else
+				} else {
 					// the previous cell was the match
-					return $i;
-			}
-			// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value
-			if ($match_type==1 && $lookup_array[$i] > $lookup_value){
-				if ($i<1){
+					return $keySet[$i-1]+1;
+				}
+			} elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) {
+//				echo '$i = '.$i.' => ';
+//				var_dump($lookupArrayValue);
+//				echo '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value
+				if ($i < 1){
 					// 1st cell was allready bigger than the lookup_value
 					break;
-				}
-				else
+				} else {
 					// the previous cell was the match
-					return $i;
+					return $keySet[$i-1]+1;
+				}
 			}
 		}
-		// unsuccessful in finding a match, return #N/A error value
-		//echo "unsuccessful in finding a match<br>";
+
+		//	unsuccessful in finding a match, return #N/A error value
 		return self::$_errorCodes['na'];
 	}	//	function MATCH()
 
@@ -11378,25 +11367,19 @@ class PHPExcel_Calculation_Functions {
 		}
 		$value	= self::flattenSingleValue($value);
 
-		switch (gettype($value)) {
-			case 'double'	:
-			case 'float'	:
-			case 'integer'	:
+		if ((is_float($value)) || (is_int($value))) {
 				return 1;
-				break;
-			case 'boolean'	:
+		} elseif(is_bool($value)) {
 				return 4;
-				break;
-			case 'array'	:
+		} elseif(is_array($value)) {
 				return 64;
 				break;
-			case 'string'	:
-				//	Errors
-				if ((strlen($value) > 0) && ($value{0} == '#')) {
-					return 16;
-				}
-				return 2;
-				break;
+		} elseif(is_string($value)) {
+			//	Errors
+			if ((strlen($value) > 0) && ($value{0} == '#')) {
+				return 16;
+			}
+			return 2;
 		}
 		return 0;
 	}	//	function TYPE()
diff --git a/libraries/PHPExcel/PHPExcel/Cell.php b/libraries/PHPExcel/PHPExcel/Cell.php
index f8ebf86..b805b8d 100644
--- a/libraries/PHPExcel/PHPExcel/Cell.php
+++ b/libraries/PHPExcel/PHPExcel/Cell.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Cell
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
@@ -91,6 +91,13 @@ class PHPExcel_Cell
 	 */
 	private $_xfIndex;
 
+	/**
+	 * Attributes of the formula
+	 *
+	 *
+	 */
+	private $_formulaAttributes;
+
 
 	/**
 	 * Send notification to the cache controller
@@ -98,6 +105,7 @@ class PHPExcel_Cell
 	 **/
 	public function notifyCacheController() {
 		$this->_parent->getCellCacheController()->updateCacheData($this);
+		return $this;
 	}
 
 	public function detach() {
@@ -112,11 +120,11 @@ class PHPExcel_Cell
 	/**
 	 * Create a new Cell
 	 *
-	 * @param 	string 				$pColumn
-	 * @param 	int 				$pRow
-	 * @param 	mixed 				$pValue
-	 * @param 	string 				$pDataType
-	 * @param 	PHPExcel_Worksheet	$pSheet
+	 * @param	string				$pColumn
+	 * @param	int				$pRow
+	 * @param	mixed				$pValue
+	 * @param	string				$pDataType
+	 * @param	PHPExcel_Worksheet	$pSheet
 	 * @throws	Exception
 	 */
 	public function __construct($pColumn = 'A', $pRow = 1, $pValue = null, $pDataType = null, PHPExcel_Worksheet $pSheet = null)
@@ -189,7 +197,7 @@ class PHPExcel_Cell
 	 *
 	 * This clears the cell formula.
 	 *
-	 * @param mixed 	$pValue					Value
+	 * @param mixed	$pValue					Value
 	 * @return PHPExcel_Cell
 	 */
 	public function setValue($pValue = null)
@@ -203,7 +211,7 @@ class PHPExcel_Cell
 	/**
 	 * Set cell value (with explicit data type given)
 	 *
-	 * @param mixed 	$pValue			Value
+	 * @param mixed	$pValue			Value
 	 * @param string	$pDataType		Explicit data type
 	 * @return PHPExcel_Cell
 	 * @throws Exception
@@ -242,8 +250,7 @@ class PHPExcel_Cell
 		// set the datatype
 		$this->_dataType = $pDataType;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -254,7 +261,7 @@ class PHPExcel_Cell
 	public function getCalculatedValue($resetLog=true)
 	{
 //		echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'<br />';
-		if (!is_null($this->_calculatedValue) && $this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
+		if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
 			try {
 //				echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value<br />';
 				$result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
@@ -262,28 +269,23 @@ class PHPExcel_Cell
 			} catch ( Exception $ex ) {
 //				echo 'Calculation Exception: '.$ex->getMessage().'<br />';
 				$result = '#N/A';
-				throw(new Exception($ex->getMessage()));
+				throw(new Exception($this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()));
 			}
 
-			if ((is_string($result)) && ($result == '#Not Yet Implemented')) {
+			if ($result === '#Not Yet Implemented') {
 //				echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />';
 				return $this->_calculatedValue; // Fallback if calculation engine does not support the formula.
-			} else {
-//				echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
-				return $result;
 			}
+//			echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
+			return $result;
 		}
 
 		if (is_null($this->_value)) {
 //			echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise<br />';
 			return null;
-		} else if ($this->_dataType != PHPExcel_Cell_DataType::TYPE_FORMULA) {
-//			echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
-			return $this->_value;
-		} else {
-//			echo 'Cell value is a formula: Calculating value<br />';
-			return PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
 		}
+//		echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
+		return $this->_value;
 	}
 
 	/**
@@ -298,8 +300,7 @@ class PHPExcel_Cell
 			$this->_calculatedValue = $pValue;
 		}
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -332,8 +333,7 @@ class PHPExcel_Cell
 	{
 		$this->_dataType = $pDataType;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -361,15 +361,14 @@ class PHPExcel_Cell
 			throw new Exception('Cannot get data validation for cell that is not bound to a worksheet');
 		}
 
-		$dataValidation = $this->_parent->getDataValidation($this->getCoordinate());
-		return $dataValidation;
+		return $this->_parent->getDataValidation($this->getCoordinate());
 	}
 
 	/**
 	 * Set Data validation
 	 *
-	 * @param 	PHPExcel_Cell_DataValidation	$pDataValidation
-	 * @throws 	Exception
+	 * @param	PHPExcel_Cell_DataValidation	$pDataValidation
+	 * @throws	Exception
 	 * @return PHPExcel_Cell
 	 */
 	public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = null)
@@ -380,45 +379,43 @@ class PHPExcel_Cell
 
 		$this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation);
 
-		$this->notifyCacheController();
-    	return $this;
+		return $this->notifyCacheController();
 	}
 
-    /**
-     * Has Hyperlink
-     *
-     * @return boolean
-     */
-    public function hasHyperlink()
-    {
+	/**
+	 * Has Hyperlink
+	 *
+	 * @return boolean
+	 */
+	public function hasHyperlink()
+	{
 		if (!isset($this->_parent)) {
 			throw new Exception('Cannot check for hyperlink when cell is not bound to a worksheet');
 		}
 
 		return $this->_parent->hyperlinkExists($this->getCoordinate());
-    }
-
-    /**
-     * Get Hyperlink
-     *
-     * @throws Exception
-     * @return PHPExcel_Cell_Hyperlink
-     */
-    public function getHyperlink()
-    {
+	}
+
+	/**
+	 * Get Hyperlink
+	 *
+	 * @throws Exception
+	 * @return PHPExcel_Cell_Hyperlink
+	 */
+	public function getHyperlink()
+	{
 		if (!isset($this->_parent)) {
 			throw new Exception('Cannot get hyperlink for cell that is not bound to a worksheet');
 		}
 
-		$hyperlink = $this->_parent->getHyperlink($this->getCoordinate());
-		return $hyperlink;
-    }
+		return $this->_parent->getHyperlink($this->getCoordinate());
+	}
 
 	/**
 	 * Set Hyperlink
 	 *
-	 * @param 	PHPExcel_Cell_Hyperlink	$pHyperlink
-	 * @throws 	Exception
+	 * @param	PHPExcel_Cell_Hyperlink	$pHyperlink
+	 * @throws	Exception
 	 * @return PHPExcel_Cell
 	 */
 	public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = null)
@@ -429,9 +426,8 @@ class PHPExcel_Cell
 
 		$this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink);
 
-		$this->notifyCacheController();
-    	return $this;
-    }
+		return $this->notifyCacheController();
+	}
 
 	/**
 	 * Get parent
@@ -451,94 +447,63 @@ class PHPExcel_Cell
 	public function rebindParent(PHPExcel_Worksheet $parent) {
 		$this->_parent = $parent;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
 	 * Is cell in a specific range?
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	boolean
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	boolean
 	 */
 	public function isInRange($pRange = 'A1:A1')
 	{
-		// Uppercase coordinate
-		$pRange = strtoupper($pRange);
-
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
-
-   		// Calculate range outer borders
-   		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
-   		$rangeEnd 	= PHPExcel_Cell::coordinateFromString($rangeB);
+		list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
 
-   		// Translate column into index
-   		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1;
-   		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1;
-
-   		// Translate properties
-		$myColumn		= PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1;
-		$myRow			= $this->getRow();
+		// Translate properties
+		$myColumn	= PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1;
+		$myRow		= $this->getRow();
 
 		// Verify if cell is in range
-		return (
-				($rangeStart[0] <= $myColumn && $rangeEnd[0] >= $myColumn) &&
-				($rangeStart[1] <= $myRow && $rangeEnd[1] >= $myRow)
-		);
+		return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) &&
+				($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow)
+			   );
 	}
 
 	/**
 	 * Coordinate from string
 	 *
-	 * @param 	string 	$pCoordinateString
-	 * @return 	array 	Array containing column and row (indexes 0 and 1)
+	 * @param	string	$pCoordinateString
+	 * @return	array	Array containing column and row (indexes 0 and 1)
 	 * @throws	Exception
 	 */
 	public static function coordinateFromString($pCoordinateString = 'A1')
 	{
 		if (strpos($pCoordinateString,':') !== false) {
 			throw new Exception('Cell coordinate string can not be a range of cells.');
-
 		} else if ($pCoordinateString == '') {
 			throw new Exception('Cell coordinate can not be zero-length string.');
-
 		} else if (preg_match("/([$]?[A-Z]+)([$]?\d+)/", $pCoordinateString, $matches)) {
 			list(, $column, $row) = $matches;
 			return array($column, $row);
-
 		} else {
 			throw new Exception('Invalid cell coordinate.');
-
 		}
 	}
 
 	/**
 	 * Make string coordinate absolute
 	 *
-	 * @param 	string 	$pCoordinateString
-	 * @return 	string	Absolute coordinate
+	 * @param	string	$pCoordinateString
+	 * @return	string	Absolute coordinate
 	 * @throws	Exception
 	 */
 	public static function absoluteCoordinate($pCoordinateString = 'A1')
 	{
 		if (strpos($pCoordinateString,':') === false && strpos($pCoordinateString,',') === false) {
-			// Return value
-			$returnValue = '';
-
 			// Create absolute coordinate
 			list($column, $row) = PHPExcel_Cell::coordinateFromString($pCoordinateString);
-			$returnValue = '$' . $column . '$' . $row;
-
-			// Return
-			return $returnValue;
+			return '$' . $column . '$' . $row;
 		} else {
 			throw new Exception("Coordinate string should not be a cell range.");
 		}
@@ -547,8 +512,8 @@ class PHPExcel_Cell
 	/**
 	 * Split range into coordinate strings
 	 *
-	 * @param 	string 	$pRange
-	 * @return 	array	Array containg one or more arrays containing one or two coordinate strings
+	 * @param	string	$pRange
+	 * @return	array	Array containg one or more arrays containing one or two coordinate strings
 	 */
 	public static function splitRange($pRange = 'A1:A1')
 	{
@@ -562,7 +527,7 @@ class PHPExcel_Cell
 	/**
 	 * Build range from coordinate strings
 	 *
-	 * @param 	array	$pRange	Array containg one or more arrays containing one or two coordinate strings
+	 * @param	array	$pRange	Array containg one or more arrays containing one or two coordinate strings
 	 * @return  string	String representation of $pRange
 	 * @throws	Exception
 	 */
@@ -584,67 +549,76 @@ class PHPExcel_Cell
 	}
 
 	/**
-	 * Calculate range dimension
+	 * Calculate range boundaries
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	array	Range dimension (width, height)
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range coordinates (Start Cell, End Cell) where Start Cell and End Cell are arrays (Column Number, Row Number)
 	 */
-	public static function rangeDimension($pRange = 'A1:A1')
+	public static function rangeBoundaries($pRange = 'A1:A1')
 	{
 		// Uppercase coordinate
 		$pRange = strtoupper($pRange);
 
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
+		// Extract range
+		if (strpos($pRange, ':') === false) {
+			$rangeA = $rangeB = $pRange;
+		} else {
+			list($rangeA, $rangeB) = explode(':', $pRange);
+		}
 
-   		// Calculate range outer borders
-   		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
-   		$rangeEnd 	= PHPExcel_Cell::coordinateFromString($rangeB);
+		// Calculate range outer borders
+		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
+		$rangeEnd	= PHPExcel_Cell::coordinateFromString($rangeB);
 
-   		// Translate column into index
-   		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]);
-   		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]);
+		// Translate column into index
+		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]);
+		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]);
 
-   		return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );
+		return array($rangeStart, $rangeEnd);
+	}
+
+	/**
+	 * Calculate range dimension
+	 *
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range dimension (width, height)
+	 */
+	public static function rangeDimension($pRange = 'A1:A1')
+	{
+		// Calculate range outer borders
+		list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
+
+		return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );
 	}
 
 	/**
 	 * Calculate range boundaries
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	array	Range boundaries (staring Column, starting Row, Final Column, Final Row)
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range boundaries (staring Column, starting Row, Final Column, Final Row)
 	 */
 	public static function getRangeBoundaries($pRange = 'A1:A1')
 	{
 		// Uppercase coordinate
 		$pRange = strtoupper($pRange);
 
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
+		// Extract range
+		if (strpos($pRange, ':') === false) {
+			$rangeA = $pRange;
+			$rangeB = $pRange;
+		} else {
+			list($rangeA, $rangeB) = explode(':', $pRange);
+		}
 
-   		return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));
+		return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));
 	}
 
 	/**
 	 * Column index from string
 	 *
-	 * @param 	string $pString
-	 * @return 	int Column index (base 1 !!!)
-	 * @throws 	Exception
+	 * @param	string $pString
+	 * @return	int Column index (base 1 !!!)
+	 * @throws	Exception
 	 */
 	public static function columnIndexFromString($pString = 'A')
 	{
@@ -684,14 +658,14 @@ class PHPExcel_Cell
 		if ($pColumnIndex < 26) {
 			return chr(65 + $pColumnIndex);
 		}
-	   	return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ;
+		return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ;
 	}
 
 	/**
 	 * Extract all cell references in range
 	 *
-	 * @param 	string 	$pRange		Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000)
-	 * @return 	array	Array containing single cell references
+	 * @param	string	$pRange		Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000)
+	 * @return	array	Array containing single cell references
 	 */
 	public static function extractAllCellReferencesInRange($pRange = 'A1') {
 		// Returnvalue
@@ -731,17 +705,17 @@ class PHPExcel_Cell
 				$rangeStart		= $rangeEnd		= '';
 				$startingCol	= $startingRow	= $endingCol	= $endingRow	= 0;
 
-				list($rangeStart, $rangeEnd) 		= $range[$i];
+				list($rangeStart, $rangeEnd)		= $range[$i];
 				list($startingCol, $startingRow)	= PHPExcel_Cell::coordinateFromString($rangeStart);
-				list($endingCol, $endingRow) 	 	= PHPExcel_Cell::coordinateFromString($rangeEnd);
+				list($endingCol, $endingRow)		= PHPExcel_Cell::coordinateFromString($rangeEnd);
 
 				// Conversions...
-				$startingCol 	= PHPExcel_Cell::columnIndexFromString($startingCol);
-				$endingCol 		= PHPExcel_Cell::columnIndexFromString($endingCol);
+				$startingCol	= PHPExcel_Cell::columnIndexFromString($startingCol);
+				$endingCol		= PHPExcel_Cell::columnIndexFromString($endingCol);
 
 				// Current data
-				$currentCol 	= --$startingCol;
-				$currentRow 	= $startingRow;
+				$currentCol	= --$startingCol;
+				$currentRow	= $startingRow;
 
 				// Loop cells
 				while ($currentCol < $endingCol) {
@@ -763,9 +737,9 @@ class PHPExcel_Cell
 	/**
 	 * Compare 2 cells
 	 *
-	 * @param 	PHPExcel_Cell	$a	Cell a
-	 * @param 	PHPExcel_Cell	$a	Cell b
-	 * @return 	int		Result of comparison (always -1 or 1, never zero!)
+	 * @param	PHPExcel_Cell	$a	Cell a
+	 * @param	PHPExcel_Cell	$a	Cell b
+	 * @return	int		Result of comparison (always -1 or 1, never zero!)
 	 */
 	public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b)
 	{
@@ -813,7 +787,7 @@ class PHPExcel_Cell
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
@@ -841,8 +815,20 @@ class PHPExcel_Cell
 	{
 		$this->_xfIndex = $pValue;
 
-		$this->notifyCacheController();
+		return $this->notifyCacheController();
+	}
+
+
+	public function setFormulaAttributes($pAttributes)
+	{
+		$this->_formulaAttributes = $pAttributes;
 		return $this;
 	}
 
+	public function getFormulaAttributes()
+	{
+		return $this->_formulaAttributes;
+	}
+
 }
+
diff --git a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
index 7e305c5..5126811 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataType.php b/libraries/PHPExcel/PHPExcel/Cell/DataType.php
index 1496d83..d542cab 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DataType.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DataType.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
index 2c3913c..db1b497 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
index e49449f..ad5ae46 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
index eab9297..994cef5 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
index 4bd1ef2..c14d630 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Comment.php b/libraries/PHPExcel/PHPExcel/Comment.php
index 735e78c..432cfe1 100644
--- a/libraries/PHPExcel/PHPExcel/Comment.php
+++ b/libraries/PHPExcel/PHPExcel/Comment.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/DocumentProperties.php b/libraries/PHPExcel/PHPExcel/DocumentProperties.php
index 64b0c2a..d6d928e 100644
--- a/libraries/PHPExcel/PHPExcel/DocumentProperties.php
+++ b/libraries/PHPExcel/PHPExcel/DocumentProperties.php
@@ -8,12 +8,12 @@
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -41,70 +41,70 @@ class PHPExcel_DocumentProperties
 	 * @var string
 	 */
 	private $_creator;
-	
+
 	/**
 	 * LastModifiedBy
 	 *
 	 * @var string
 	 */
 	private $_lastModifiedBy;
-	
+
 	/**
 	 * Created
 	 *
 	 * @var datetime
 	 */
 	private $_created;
-	
+
 	/**
 	 * Modified
 	 *
 	 * @var datetime
 	 */
 	private $_modified;
-	
+
 	/**
 	 * Title
 	 *
 	 * @var string
 	 */
 	private $_title;
-	
+
 	/**
 	 * Description
 	 *
 	 * @var string
 	 */
 	private $_description;
-	
+
 	/**
 	 * Subject
 	 *
 	 * @var string
 	 */
 	private $_subject;
-	
+
 	/**
 	 * Keywords
 	 *
 	 * @var string
 	 */
 	private $_keywords;
-	
+
 	/**
 	 * Category
 	 *
 	 * @var string
 	 */
 	private $_category;
-	
+
 	/**
 	 * Company
-	 * 
+	 *
 	 * @var string
 	 */
 	private $_company;
-	
+
     /**
      * Create a new PHPExcel_DocumentProperties
      */
@@ -120,9 +120,10 @@ class PHPExcel_DocumentProperties
     	$this->_description		= '';
     	$this->_keywords		= '';
     	$this->_category		= '';
+    	$this->_manager			= '';
     	$this->_company 		= 'Microsoft Corporation';
     }
-    
+
     /**
      * Get Creator
      *
@@ -131,7 +132,7 @@ class PHPExcel_DocumentProperties
     public function getCreator() {
     	return $this->_creator;
     }
-    
+
     /**
      * Set Creator
      *
@@ -142,7 +143,7 @@ class PHPExcel_DocumentProperties
     	$this->_creator = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Last Modified By
      *
@@ -151,7 +152,7 @@ class PHPExcel_DocumentProperties
     public function getLastModifiedBy() {
     	return $this->_lastModifiedBy;
     }
-    
+
     /**
      * Set Last Modified By
      *
@@ -162,7 +163,7 @@ class PHPExcel_DocumentProperties
     	$this->_lastModifiedBy = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Created
      *
@@ -171,7 +172,7 @@ class PHPExcel_DocumentProperties
     public function getCreated() {
     	return $this->_created;
     }
-    
+
     /**
      * Set Created
      *
@@ -185,7 +186,7 @@ class PHPExcel_DocumentProperties
     	$this->_created = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Modified
      *
@@ -194,7 +195,7 @@ class PHPExcel_DocumentProperties
     public function getModified() {
     	return $this->_modified;
     }
-    
+
     /**
      * Set Modified
      *
@@ -208,7 +209,7 @@ class PHPExcel_DocumentProperties
     	$this->_modified = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Title
      *
@@ -217,7 +218,7 @@ class PHPExcel_DocumentProperties
     public function getTitle() {
     	return $this->_title;
     }
-    
+
     /**
      * Set Title
      *
@@ -228,7 +229,7 @@ class PHPExcel_DocumentProperties
     	$this->_title = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Description
      *
@@ -237,7 +238,7 @@ class PHPExcel_DocumentProperties
     public function getDescription() {
     	return $this->_description;
     }
-    
+
     /**
      * Set Description
      *
@@ -248,7 +249,7 @@ class PHPExcel_DocumentProperties
     	$this->_description = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Subject
      *
@@ -257,7 +258,7 @@ class PHPExcel_DocumentProperties
     public function getSubject() {
     	return $this->_subject;
     }
-    
+
     /**
      * Set Subject
      *
@@ -268,7 +269,7 @@ class PHPExcel_DocumentProperties
     	$this->_subject = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Keywords
      *
@@ -277,7 +278,7 @@ class PHPExcel_DocumentProperties
     public function getKeywords() {
     	return $this->_keywords;
     }
-    
+
     /**
      * Set Keywords
      *
@@ -288,7 +289,7 @@ class PHPExcel_DocumentProperties
     	$this->_keywords = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Category
      *
@@ -297,7 +298,7 @@ class PHPExcel_DocumentProperties
     public function getCategory() {
     	return $this->_category;
     }
-    
+
     /**
      * Set Category
      *
@@ -308,7 +309,7 @@ class PHPExcel_DocumentProperties
     	$this->_category = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Company
      *
@@ -317,18 +318,38 @@ class PHPExcel_DocumentProperties
     public function getCompany() {
     	return $this->_company;
     }
-    
+
     /**
      * Set Company
      *
      * @param string $pValue
-     * @return PHPPowerPoint_DocumentProperties
+     * @return PHPExcel_DocumentProperties
      */
     public function setCompany($pValue = '') {
     	$this->_company = $pValue;
     	return $this;
     }
-        
+
+    /**
+     * Get Manager
+     *
+     * @return string
+     */
+    public function getManager() {
+    	return $this->_manager;
+    }
+
+    /**
+     * Set Manager
+     *
+     * @param string $pValue
+     * @return PHPExcel_DocumentProperties
+     */
+    public function setManager($pValue = '') {
+    	$this->_manager = $pValue;
+    	return $this;
+    }
+
 	/**
 	 * Implement PHP __clone to create a deep clone, not just a shallow copy.
 	 */
diff --git a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
index 1522189..a6de9ee 100644
--- a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
+++ b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/HashTable.php b/libraries/PHPExcel/PHPExcel/HashTable.php
index bd526b6..2191672 100644
--- a/libraries/PHPExcel/PHPExcel/HashTable.php
+++ b/libraries/PHPExcel/PHPExcel/HashTable.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/IComparable.php b/libraries/PHPExcel/PHPExcel/IComparable.php
index 3c175d1..0a51b06 100644
--- a/libraries/PHPExcel/PHPExcel/IComparable.php
+++ b/libraries/PHPExcel/PHPExcel/IComparable.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/IOFactory.php b/libraries/PHPExcel/PHPExcel/IOFactory.php
index 21fd23c..a3650be 100644
--- a/libraries/PHPExcel/PHPExcel/IOFactory.php
+++ b/libraries/PHPExcel/PHPExcel/IOFactory.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/NamedRange.php b/libraries/PHPExcel/PHPExcel/NamedRange.php
index 1aa5236..992c2fa 100644
--- a/libraries/PHPExcel/PHPExcel/NamedRange.php
+++ b/libraries/PHPExcel/PHPExcel/NamedRange.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/CSV.php b/libraries/PHPExcel/PHPExcel/Reader/CSV.php
index 5fa83bd..086c948 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/CSV.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/CSV.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
index c6620e7..e83ac9a 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
index 96e3436..99f00ed 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -557,6 +557,11 @@ class PHPExcel_Reader_Excel2003XML implements PHPExcel_Reader_IReader
 					$cellDataFormula = '';
 					if (isset($cell_ss['Formula'])) {
 						$cellDataFormula = $cell_ss['Formula'];
+						// added this as a check for array formulas
+						if (isset($cell_ss['ArrayRange'])) {
+							$cellDataCSEFormula = $cell_ss['ArrayRange'];
+//							echo "found an array formula at ".$columnID.$rowID."<br />";
+						}
 						$hasCalculatedValue = true;
 					}
 					if (isset($cell->Data)) {
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
index 031dee5..c4e3e41 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -71,6 +71,9 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 	 */
 	private $_readFilter = null;
 
+
+	private $_referenceHelper = null;
+
 	/**
 	 * Read data only?
 	 *
@@ -150,6 +153,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 	 */
 	public function __construct() {
 		$this->_readFilter = new PHPExcel_Reader_DefaultReadFilter();
+		$this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance();
 	}
 
 	/**
@@ -245,12 +249,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 				$difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);
 				$difference[1] = $current[1] - $master[1];
 
-				$helper = PHPExcel_ReferenceHelper::getInstance();
-				$value = $helper->updateFormulaReferences(	$sharedFormulas[$instance]['formula'],
-															'A1',
-															$difference[0],
-															$difference[1]
-														 );
+				$value = $this->_referenceHelper->updateFormulaReferences(	$sharedFormulas[$instance]['formula'],
+																			'A1',
+																			$difference[0],
+																			$difference[1]
+																		 );
 //				echo 'Adjusted Formula is '.$value.'<br />';
 			}
 		}
@@ -311,7 +314,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 			switch ($rel["Type"]) {
 				case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-…":
 					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
-					if ($xmlCore) {
+					if (is_object($xmlCore)) {
 						$xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/");
 						$xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/");
 						$xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");
@@ -328,6 +331,25 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 					}
 				break;
 
+				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extende…":
+					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
+					if (is_object($xmlCore)) {
+						$docProps = $excel->getProperties();
+						if (isset($xmlCore->Company))
+							$docProps->setCompany((string) $xmlCore->Company);
+						if (isset($xmlCore->Manager))
+							$docProps->setManager((string) $xmlCore->Manager);
+					}
+				break;
+
+				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-…":
+					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
+					if (is_object($xmlCore)) {
+						$xmlCore->registerXPathNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
+						$docProps = $excel->getProperties();
+					}
+				break;
+
 				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeD…":
 					$dir = dirname($rel["Target"]);
 					$relsWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels"));  //~ http://schemas.openxmlformats.org/package/2006/relationships");
@@ -692,6 +714,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 												} else {
 													// Formula
 													$this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToBool');
+													if (isset($c->f['t'])) {
+														$att = array();
+														$att = $c->f;
+														$docSheet->getCell($r)->setFormulaAttributes($att);
+													}
 	//												echo '$calculatedValue = '.$calculatedValue.'<br />';
 												}
 												break;
@@ -1276,10 +1303,14 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 												break;
 
 											case '_xlnm.Print_Area':
-												$range = explode('!', $extractedRange);
-												$extractedRange = isset($range[1]) ? $range[1] : $range[0];
-
-												$docSheet->getPageSetup()->setPrintArea($extractedRange);
+												$rangeSets = explode(',', $extractedRange);		// FIXME: what if sheetname contains comma?
+												$newRangeSets = array();
+												foreach($rangeSets as $rangeSet) {
+													$range = explode('!', $rangeSet);	// FIXME: what if sheetname contains exclamation mark?
+													$rangeSet = isset($range[1]) ? $range[1] : $range[0];
+													$newRangeSets[] = str_replace('$', '', $rangeSet);
+												}
+												$docSheet->getPageSetup()->setPrintArea(implode(',',$newRangeSets));
 												break;
 
 											default:
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
index a4f20e7..5c71ee8 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of ParseXL (used as the base for this class):
@@ -834,7 +834,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 						//		Foo!$C$7:$J$66
 						//		Bar!$A$1:$IV$2
 
-						$explodes = explode('!', $range);
+						$explodes = explode('!', $range);	// FIXME: what if sheetname contains exclamation mark?
 						$sheetName = $explodes[0];
 
 						if (count($explodes) == 2) {
@@ -4202,22 +4202,22 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// 1. BITMAPCOREHEADER
 			// offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure
 			$bcSize = $this->_GetInt4d($iData, 0);
-			var_dump($bcSize);
+//			var_dump($bcSize);
 
 			// offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels
 			$bcWidth = $this->_GetInt2d($iData, 4);
-			var_dump($bcWidth);
+//			var_dump($bcWidth);
 
 			// offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels.
 			$bcHeight = $this->_GetInt2d($iData, 6);
-			var_dump($bcHeight);
+//			var_dump($bcHeight);
 			$ih = imagecreatetruecolor($bcWidth, $bcHeight);
 
 			// offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1
 
 			// offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24
 			$bcBitCount = $this->_GetInt2d($iData, 10);
-			var_dump($bcBitCount);
+//			var_dump($bcBitCount);
 
 			$rgbString = substr($iData, 12);
 			$rgbTriples = array();
@@ -4602,24 +4602,24 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 		case 0x12: $name = 'tUplus';	$size = 1;	$data = '+';	break;
 		case 0x13: $name = 'tUminus';	$size = 1;	$data = '-';	break;
 		case 0x14: $name = 'tPercent';	$size = 1;	$data = '%';	break;
-		case 0x15: // parenthesis
+		case 0x15:	//	parenthesis
 			$name  = 'tParen';
 			$size  = 1;
 			$data = null;
 			break;
-		case 0x16: // missing argument
+		case 0x16:	//	missing argument
 			$name = 'tMissArg';
 			$size = 1;
 			$data = '';
 			break;
-		case 0x17: // string
+		case 0x17:	//	string
 			$name = 'tStr';
 			// offset: 1; size: var; Unicode string, 8-bit string length
 			$string = $this->_readUnicodeStringShort(substr($formulaData, 1));
 			$size = 1 + $string['size'];
 			$data = $this->_UTF8toExcelDoubleQuoted($string['value']);
 			break;
-		case 0x19: // Special attribute
+		case 0x19:	//	Special attribute
 			// offset: 1; size: 1; attribute type flags:
 			switch (ord($formulaData[1])) {
 			case 0x01:
@@ -4689,39 +4689,42 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				break;
 			}
 			break;
-		case 0x1C: // error code
+		case 0x1C:	//	error code
 			// offset: 1; size: 1; error code
 			$name = 'tErr';
 			$size = 2;
 			$data = $this->_mapErrorCode(ord($formulaData[1]));
 			break;
-		case 0x1D: // boolean
+		case 0x1D:	//	boolean
 			// offset: 1; size: 1; 0 = false, 1 = true;
 			$name = 'tBool';
 			$size = 2;
 			$data = ord($formulaData[1]) ? 'TRUE' : 'FALSE';
 			break;
-		case 0x1E: // integer
+		case 0x1E:	//	integer
 			// offset: 1; size: 2; unsigned 16-bit integer
 			$name = 'tInt';
 			$size = 3;
 			$data = $this->_GetInt2d($formulaData, 1);
 			break;
-		case 0x1F: // number
+		case 0x1F:	//	number
 			// offset: 1; size: 8;
 			$name = 'tNum';
 			$size = 9;
 			$data = $this->_extractNumber(substr($formulaData, 1));
 			$data = str_replace(',', '.', (string)$data); // in case non-English locale
 			break;
-		case 0x40: // array constant
-		case 0x60: // array constant
+		case 0x20:	//	array constant
+		case 0x40:
+		case 0x60:
 			// offset: 1; size: 7; not used
 			$name = 'tArray';
 			$size = 8;
 			$data = null;
 			break;
-		case 0x41: // function with fixed number of arguments
+		case 0x21:	//	function with fixed number of arguments
+		case 0x41:
+		case 0x61:
 			$name = 'tFunc';
 			$size = 3;
 			// offset: 1; size: 2; index to built-in sheet function
@@ -4891,9 +4894,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			}
 			$data = array('function' => $function, 'args' => $args);
 			break;
-		case 0x22: // function with variable number of arguments
-		case 0x42: // function with variable number of arguments
-		case 0x62: // function with variable number of arguments
+		case 0x22:	//	function with variable number of arguments
+		case 0x42:
+		case 0x62:
 			$name = 'tFuncV';
 			$size = 4;
 			// offset: 1; size: 1; number of arguments
@@ -4995,8 +4998,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			}
 			$data = array('function' => $function, 'args' => $args);
 			break;
-		case 0x23: // index to defined name
+		case 0x23:	//	index to defined name
 		case 0x43:
+		case 0x63:
 			$name = 'tName';
 			$size = 5;
 			// offset: 1; size: 2; one-based index to definedname record
@@ -5004,22 +5008,23 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// offset: 2; size: 2; not used
 			$data = $this->_definedname[$definedNameIndex]['name'];
 			break;
-		case 0x24: // single cell reference e.g. A5
+		case 0x24:	//	single cell reference e.g. A5
 		case 0x44:
 		case 0x64:
 			$name = 'tRef';
 			$size = 5;
 			$data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4));
 			break;
-		case 0x25: // cell range reference to cells in the same sheet
+		case 0x25:	//	cell range reference to cells in the same sheet (2d)
 		case 0x45:
 		case 0x65:
 			$name = 'tArea';
 			$size = 9;
 			$data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8));
 			break;
-		case 0x26:
+		case 0x26:	//	Constant reference sub-expression
 		case 0x46:
+		case 0x66:
 			$name = 'tMemArea';
 			// offset: 1; size: 4; not used
 			// offset: 5; size: 2; size of the following subexpression
@@ -5027,7 +5032,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$size = 7 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
 			break;
+		case 0x27:	//	Deleted constant reference sub-expression
 		case 0x47:
+		case 0x67:
 			$name = 'tMemErr';
 			// offset: 1; size: 4; not used
 			// offset: 5; size: 2; size of the following subexpression
@@ -5035,16 +5042,17 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$size = 7 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
 			break;
-		case 0x29:
+		case 0x29:	//	Variable reference sub-expression
 		case 0x49:
+		case 0x69:
 			$name = 'tMemFunc';
-			// offset: 1; size: 2; size of the following subexpression
+			// offset: 1; size: 2; size of the following sub-expression
 			$subSize = $this->_GetInt2d($formulaData, 1);
 			$size = 3 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize));
 			break;
 
-		case 0x2C: // Relative reference, used in shared formulas and some other places
+		case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places
 		case 0x4C:
 		case 0x6C:
 			$name = 'tRefN';
@@ -5052,7 +5060,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell);
 			break;
 
-		case 0x2D:
+		case 0x2D:	//	Relative 2d range reference
 		case 0x4D:
 		case 0x6D:
 			$name = 'tAreaN';
@@ -5060,7 +5068,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell);
 			break;
 
-		case 0x39:
+		case 0x39:	//	External name
 		case 0x59:
 		case 0x79:
 			$name = 'tNameX';
@@ -5073,8 +5081,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// offset: 5; size: 2; not used
 			break;
 
-		case 0x3A: // 3d reference to cell
+		case 0x3A:	//	3d reference to cell
 		case 0x5A:
+		case 0x7A:
 			$name = 'tRef3d';
 			$size = 7;
 
@@ -5085,15 +5094,15 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				$cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4));
 
 				$data = "$sheetRange!$cellAddress";
-
 			} catch (Exception $e) {
 				// deleted sheet reference
 				$data = '#REF!';
 			}
 
 			break;
-		case 0x3B: // 3d reference to cell range
+		case 0x3B:	//	3d reference to cell range
 		case 0x5B:
+		case 0x7B:
 			$name = 'tArea3d';
 			$size = 11;
 
@@ -5104,15 +5113,13 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				$cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8));
 
 				$data = "$sheetRange!$cellRangeAddress";
-
 			} catch (Exception $e) {
 				// deleted sheet reference
 				$data = '#REF!';
-
 			}
 
 			break;
-		// case 0x39: // don't know how to deal with
+		// Unknown cases	// don't know how to deal with
 		default:
 			throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');
 			break;
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
index 0418dd7..b7c67e9 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
index c397d56..00fa2e8 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReader.php b/libraries/PHPExcel/PHPExcel/Reader/IReader.php
index ef5beac..e1cdc43 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/IReader.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/IReader.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
index 8a1407a..a1ddf91 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -242,6 +242,9 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 			throw new Exception("Could not open " . $pFilename . " for reading! File does not exist.");
 		}
 
+		$timezoneObj = new DateTimeZone('Europe/London');
+		$GMT = new DateTimeZone('UTC');
+
 		$zip = new ZipArchive;
 		if ($zip->open($pFilename) === true) {
 //			echo '<h1>Meta Information</h1>';
@@ -338,6 +341,11 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 					foreach($worksheetData as $key => $rowData) {
 //						echo '<b>'.$key.'</b><br />';
 						switch ($key) {
+							case 'table-header-rows':
+								foreach ($rowData as $key=>$cellData) {
+									$rowData = $cellData;
+									break;
+								}
 							case 'table-row' :
 								$columnID = 'A';
 								foreach($rowData as $key => $cellData) {
@@ -387,7 +395,8 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 													break;
 											case 'date' :
 													$type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
-													$dateObj = date_create($cellDataOfficeAttributes['date-value']);
+												    $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT);
+													$dateObj->setTimeZone($timezoneObj);
 													list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s'));
 													$dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second);
 													if ($dataValue != floor($dataValue)) {
@@ -418,7 +427,7 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 											if (($key % 2) == 0) {
 												$value = preg_replace('/\[\.(.*):\.(.*)\]/Ui','$1:$2',$value);
 												$value = preg_replace('/\[\.(.*)\]/Ui','$1',$value);
-												$value = PHPExcel_Calculation::_translateSeparator(';',',',$value);
+												$value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces);
 											}
 										}
 										unset($value);
diff --git a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
index ec8a4d4..790aa2f 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
index 88f2892..04b14f2 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
index cb9673c..7a37ed0 100644
--- a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
+++ b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -35,6 +35,13 @@
  */
 class PHPExcel_ReferenceHelper
 {
+	/**	Constants				*/
+	/**	Regular Expressions		*/
+	const REFHELPER_REGEXP_CELLREF		= '((\w*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])';
+	const REFHELPER_REGEXP_CELLRANGE	= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)';
+	const REFHELPER_REGEXP_ROWRANGE		= '((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)';
+	const REFHELPER_REGEXP_COLRANGE		= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})';
+
 	/**
 	 * Instance of this class
 	 *
@@ -119,10 +126,8 @@ class PHPExcel_ReferenceHelper
 			$newCoordinates = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1 + $pNumCols ) . ($cell->getRow() + $pNumRows);
 
 			// Should the cell be updated? Move value and cellXf index from one cell to another.
-			if (
-					(PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) &&
-					($cell->getRow() >= $beforeRow)
-				 ) {
+			if ((PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) &&
+				($cell->getRow() >= $beforeRow)) {
 
 				// Update cell styles
 				$pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex());
@@ -132,7 +137,7 @@ class PHPExcel_ReferenceHelper
 				if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) {
 					// Formula should be adjusted
 					$pSheet->getCell($newCoordinates)
-						->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows));
+						   ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle()));
 				} else {
 					// Formula should not be adjusted
 					$pSheet->getCell($newCoordinates)->setValue($cell->getValue());
@@ -340,43 +345,121 @@ class PHPExcel_ReferenceHelper
 	 * @return	string	Updated formula
 	 * @throws	Exception
 	 */
-	public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) {
-		// Parse formula into a tree of tokens
-		$tokenisedFormula = PHPExcel_Calculation::getInstance()->parseFormula($pFormula);
-
-		$newCellTokens = $cellTokens = array();
-		$adjustCount = 0;
-		//	Build the translation table of cell tokens
-		foreach($tokenisedFormula as $token) {
-			$token = $token['value'];
-			if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) {
-				list($column,$row) = PHPExcel_Cell::coordinateFromString($token);
-				//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
-				$column = PHPExcel_Cell::columnIndexFromString($column) + 100000;
-				$row += 10000000;
-				$cellIndex = $column.$row;
-				if (!isset($cellTokens[$cellIndex])) {
-					$newReference = $this->updateCellReference($token, $pBefore, $pNumCols, $pNumRows);
-					if ($newReference !== $token) {
-						$newCellTokens[$cellIndex] = preg_quote($newReference);
-						$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($token).'(?!\d)/i';
-						++$adjustCount;
-					}
-				}
-			}
-		}
-		if ($adjustCount == 0) {
-			return $pFormula;
-		}
-		krsort($cellTokens);
-		krsort($newCellTokens);
-
+	public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') {
 		//	Update cell references in the formula
 		$formulaBlocks = explode('"',$pFormula);
 		foreach($formulaBlocks as $i => &$formulaBlock) {
-			//	Only count/replace in alternate array entries
+			//	Ignore blocks that were enclosed in quotes (even entries in the $formulaBlocks array after the explode)
 			if (($i % 2) == 0) {
-				$formulaBlock = preg_replace($cellTokens,$newCellTokens,$formulaBlock);
+				$adjustCount = 0;
+				$newCellTokens = $cellTokens = array();
+				//	Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = substr($this->updateCellReference('$A'.$match[3],$pBefore,$pNumCols,$pNumRows),2);
+						$modified4 = substr($this->updateCellReference('$A'.$match[4],$pBefore,$pNumCols,$pNumRows),2);
+
+						if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = 100000;
+								$row = 10000000+trim($match[3],'$');
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<!\d)'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = substr($this->updateCellReference($match[3].'$1',$pBefore,$pNumCols,$pNumRows),0,-2);
+						$modified4 = substr($this->updateCellReference($match[4].'$1',$pBefore,$pNumCols,$pNumRows),0,-2);
+
+						if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($match[3],'$')) + 100000;
+								$row = 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?![A-Z])/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows);
+						$modified4 = $this->updateCellReference($match[4],$pBefore,$pNumCols,$pNumRows);
+
+						if ($match[3].$match[4] !== $modified3.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]);
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000;
+								$row = trim($row,'$') + 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3];
+						$modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows);
+
+						if ($match[3] !== $modified3) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3;
+								list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]);
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000;
+								$row = trim($row,'$') + 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				if ($adjustCount > 0) {
+					krsort($cellTokens);
+					krsort($newCellTokens);
+					//	Update cell references in the formula
+					$formulaBlock = str_replace('\\','',preg_replace($cellTokens,$newCellTokens,$formulaBlock));
+				}
 			}
 		}
 		unset($formulaBlock);
diff --git a/libraries/PHPExcel/PHPExcel/RichText.php b/libraries/PHPExcel/PHPExcel/RichText.php
index c938c62..588e643 100644
--- a/libraries/PHPExcel/PHPExcel/RichText.php
+++ b/libraries/PHPExcel/PHPExcel/RichText.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
index 613028f..3f1aa7a 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/Run.php b/libraries/PHPExcel/PHPExcel/RichText/Run.php
index 209af21..aac7676 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/Run.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/Run.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
index 3a24482..f5ce8e0 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Settings.php b/libraries/PHPExcel/PHPExcel/Settings.php
index 7a1d57e..52d7880 100644
--- a/libraries/PHPExcel/PHPExcel/Settings.php
+++ b/libraries/PHPExcel/PHPExcel/Settings.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Settings
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /** PHPExcel root directory */
diff --git a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
index 10f82e4..f209838 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Date.php b/libraries/PHPExcel/PHPExcel/Shared/Date.php
index c45c23f..334e8df 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Date.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Date.php
@@ -23,7 +23,7 @@
  * @package	PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
index a89c94e..a24f963 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher.php b/libraries/PHPExcel/PHPExcel/Shared/Escher.php
index c230d99..11c19b2 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
index c78485b..6cbd2f0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
index c659fd5..919cf1a 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
index 83e3193..454b7ee 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
index 59d34cf..61eab5d 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
@@ -70,6 +70,13 @@ class PHPExcel_Shared_Escher_DggContainer
 	private $_OPT = array();
 
 	/**
+	 * Array of identifier clusters containg information about the maximum shape identifiers
+	 *
+	 * @var array
+	 */
+	private $_IDCLs = array();
+
+	/**
 	 * Get maximum shape index of all shapes in all drawings (plus one)
 	 *
 	 * @return int
@@ -174,4 +181,23 @@ class PHPExcel_Shared_Escher_DggContainer
 		return null;
 	}
 
+	/**
+	 * Get identifier clusters
+	 *
+	 * @return array
+	 */
+	public function getIDCLs()
+	{
+		return $this->_IDCLs;
+	}
+
+	/**
+	 * Set identifier clusters. array(<drawingId> => <max shape id>, ...)
+	 *
+	 * @param array $pValue
+	 */
+	public function setIDCLs($pValue)
+	{
+		$this->_IDCLs = $pValue;
+	}
 }
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
index 9292f2d..6040fb2 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
index 820e703..00ccb6d 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
index 35003dd..7f13632 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
index 05af633..6469c52 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/File.php b/libraries/PHPExcel/PHPExcel/Shared/File.php
index dc2c3fd..23169ce 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/File.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/File.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -75,7 +75,9 @@ class PHPExcel_Shared_File
 		$returnValue = '';
 
 		// Try using realpath()
-		$returnValue = realpath($pFilename);
+		if (file_exists($pFilename)) {
+			$returnValue = realpath($pFilename);
+		}
 
 		// Found something?
 		if ($returnValue == '' || is_null($returnValue)) {
@@ -107,14 +109,14 @@ class PHPExcel_Shared_File
 		// http://php.net/manual/en/function.sys-get-temp-dir.php#94119
 
 		if ( !function_exists('sys_get_temp_dir')) {
-			if( $temp = getenv('TMP') ) {
-				return realpath($temp);
+			if ($temp = getenv('TMP') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
-			if( $temp = getenv('TEMP') ) {
-				return realpath($temp);
+			if ($temp = getenv('TEMP') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
-			if( $temp = getenv('TMPDIR') ) {
-				return realpath($temp);
+			if ($temp = getenv('TMPDIR') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
 
 			// trick for creating a file in system's temporary dir
@@ -126,10 +128,11 @@ class PHPExcel_Shared_File
 			}
 
 			return null;
-
 		}
 
 		// use ordinary built-in PHP function
+		//	There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only
+		//		be called if we're running 5.2.1 or earlier
 		return realpath(sys_get_temp_dir());
 	}
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Font.php b/libraries/PHPExcel/PHPExcel/Shared/Font.php
index 1759e87..24d78be 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
index 7b6f845..af757d0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_OLE
  * @copyright  Copyright (c) 2006 - 2007 Christian Schmidt
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version 1.7.3c, 2010-06-01
+ * @version 1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
index b747e13..6aebbf0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1));
diff --git a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
index 6b7b312..7fb4934 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/String.php b/libraries/PHPExcel/PHPExcel/Shared/String.php
index 32766df..c033b9a 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/String.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/String.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -507,7 +507,7 @@ class PHPExcel_Shared_String
 	 * @author  Rasmus Andersson {@link http://rasmusandersson.se/}
 	 * @author vadik56
 	 */
-	function utf16_decode( $str, $bom_be=true ) {
+	public static function utf16_decode( $str, $bom_be=true ) {
 		if( strlen($str) < 2 ) return $str;
 		$c0 = ord($str{0});
 		$c1 = ord($str{1});
diff --git a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
index 223d3dd..8514847 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
@@ -22,13 +22,18 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 if (!defined('DATE_W3C')) {
   define('DATE_W3C', 'Y-m-d\TH:i:sP');
 }
 
+if (!defined('DEBUGMODE_ENABLED')) {
+  define('DEBUGMODE_ENABLED', false);
+}
+
+
 /**
  * PHPExcel_Shared_XMLWriter
  *
@@ -80,7 +85,9 @@ class PHPExcel_Shared_XMLWriter {
     	}
 
     	// Set default values
-    	$this->_xmlWriter->setIndent(true);
+		if (DEBUGMODE_ENABLED) {
+	    	$this->_xmlWriter->setIndent(true);
+	    }
     }
 
     /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
index 77661c6..b79bfc8 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
index 27fecd5..28fe725 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
index a0717ea..0ff98cc 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
index 99f358c..71219a0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
index a59c879..03c7dc3 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
index 02ff0a5..6947c11 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
index 9328fcb..6d2281c 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Style.php b/libraries/PHPExcel/PHPExcel/Style.php
index d0cbcb0..3e84f9f 100644
--- a/libraries/PHPExcel/PHPExcel/Style.php
+++ b/libraries/PHPExcel/PHPExcel/Style.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -675,7 +675,7 @@ class PHPExcel_Style implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Alignment.php b/libraries/PHPExcel/PHPExcel/Style/Alignment.php
index 412c603..15b6c87 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Alignment.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Alignment.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -479,7 +479,7 @@ class PHPExcel_Style_Alignment implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Border.php b/libraries/PHPExcel/PHPExcel/Style/Border.php
index 1af31d6..166ccb2 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Border.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Border.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -372,7 +372,7 @@ class PHPExcel_Style_Border implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Borders.php b/libraries/PHPExcel/PHPExcel/Style/Borders.php
index ffd66af..dc32c50 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Borders.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Borders.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -489,7 +489,7 @@ class PHPExcel_Style_Borders implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Color.php b/libraries/PHPExcel/PHPExcel/Style/Color.php
index 8a25af0..9734d62 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Color.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Color.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -398,7 +398,7 @@ class PHPExcel_Style_Color implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Conditional.php b/libraries/PHPExcel/PHPExcel/Style/Conditional.php
index 8ec5f92..4602b53 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Conditional.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Conditional.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Style/Fill.php b/libraries/PHPExcel/PHPExcel/Style/Fill.php
index 3ebf380..1357e47 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Fill.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Fill.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -391,7 +391,7 @@ class PHPExcel_Style_Fill implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Font.php b/libraries/PHPExcel/PHPExcel/Style/Font.php
index de39cf2..b58dbf5 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -609,7 +609,7 @@ class PHPExcel_Style_Font implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
index 9ff1a97..0f0dcdc 100644
--- a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
+++ b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 201
0-08-26
  */
 
 
@@ -443,7 +443,7 @@ class PHPExcel_Style_NumberFormat implements PHPExcel_IComparable
 	{
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Protection.php b/libraries/PHPExcel/PHPExcel/Style/Protection.php
index 1c70702..29832da 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Protection.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Protection.php
@@ -271,7 +271,7 @@ class PHPExcel_Style_Protection implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet.php b/libraries/PHPExcel/PHPExcel/Worksheet.php
index dc401fd..fb7cc0a 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -2180,9 +2180,8 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
 		$highestRow    = 1;
 
     	// Find cells that can be cleaned
-    	foreach ($this->_cellCollection->getCellList() as $coordinate) {
-			preg_match('/^(\w+)(\d+)$/U',$coordinate,$matches);
-			list(,$col,$row) = $matches;
+    	foreach ($this->_cellCollection->getCellList() as $coord) {
+			list($col,$row) = sscanf($coord,'%[A-Z]%d');
 			$column = PHPExcel_Cell::columnIndexFromString($col);
 
 			// Determine highest column and row
@@ -2468,7 +2467,13 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
 			}
 
 			if (is_object($val) || (is_array($val))) {
-				$this->{$key} = unserialize(serialize($val));
+				if ($key == '_cellCollection') {
+					$newCollection = clone $this->_cellCollection;
+					$newCollection->copyCellCollection($this);
+					$this->_cellCollection = $newCollection;
+				} else {
+					$this->{$key} = unserialize(serialize($val));
+				}
 			}
 		}
 	}
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
index e2c65c3..511643b 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
index 4a6589f..630e089 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
index f42ef31..30b0035 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
index 7d362c0..537f9f3 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet_Drawing
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
index f83c26d..053ab0d 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet_Drawing
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
index 4e39339..9d2708d 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
index 9f2b25d..f614261 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
index 0bd37f5..a43e6a9 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
index 6fc8f1a..155b976 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
index ffbd573..8e615f7 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -179,6 +179,11 @@ class PHPExcel_Worksheet_PageSetup
 	const ORIENTATION_LANDSCAPE	= 'landscape';
 	const ORIENTATION_PORTRAIT	= 'portrait';
 
+	/* Print Range Set Method */
+	const SETPRINTRANGE_OVERWRITE	= 'O';
+	const SETPRINTRANGE_INSERT		= 'I';
+
+
 	/**
 	 * Paper size
 	 *
@@ -261,7 +266,7 @@ class PHPExcel_Worksheet_PageSetup
 	 * @var string
 	 */
 	private $_printArea = null;
-	
+
 	/**
 	 * First page number
 	 *
@@ -570,55 +575,197 @@ class PHPExcel_Worksheet_PageSetup
 	}
 
 	/**
-	 * Get print area
+	 *	Get print area
 	 *
-	 * @return string
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or a index value of 0, will return all ranges as a comma-separated string
+	 *							Otherwise, the specific range identified by the value of $index will be returned
+	 *							Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	string
 	 */
-	public function getPrintArea() {
-		return $this->_printArea;
+	public function getPrintArea($index = 0) {
+		if ($index == 0) {
+			return $this->_printArea;
+		}
+		$printAreas = explode(',',$this->_printArea);
+		if (isset($printAreas[$index-1])) {
+			return $printAreas[$index-1];
+		}
+		throw new Exception("Requested Print Area does not exist");
 	}
 
 	/**
-	 * Is print area set?
+	 *	Is print area set?
 	 *
-	 * @return boolean
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or an index value of 0, will identify whether any print range is set
+	 *							Otherwise, existence of the range identified by the value of $index will be returned
+	 *							Print areas are numbered from 1
+	 *	@return	boolean
 	 */
-	public function isPrintAreaSet() {
-		return !is_null($this->_printArea);
+	public function isPrintAreaSet($index = 0) {
+		if ($index == 0) {
+			return !is_null($this->_printArea);
+		}
+		$printAreas = explode(',',$this->_printArea);
+		return isset($printAreas[$index-1]);
 	}
 
 	/**
-	 * Set print area. E.g. 'A1:D10' or 'A1:D10,G5:M20'
+	 *	Clear a print area
 	 *
-	 * @param string $value
-	 * @throws Exception
-	 * @return PHPExcel_Worksheet_PageSetup
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or an index value of 0, will clear all print ranges that are set
+	 *							Otherwise, the range identified by the value of $index will be removed from the series
+	 *							Print areas are numbered from 1
+	 *	@return	PHPExcel_Worksheet_PageSetup
 	 */
-	public function setPrintArea($value) {
-    	if (strpos($value,':') === false) {
-    		throw new Exception('Cell coordinate must be a range of cells.');
-    	} elseif (strpos($value,'$') !== false) {
-    		throw new Exception('Cell coordinate must not be absolute.');
-    	} else {
-			$this->_printArea = strtoupper($value);
-    	}
+	public function clearPrintArea($index = 0) {
+		if ($index == 0) {
+			$this->_printArea = NULL;
+		} else {
+			$printAreas = explode(',',$this->_printArea);
+			if (isset($printAreas[$index-1])) {
+				unset($printAreas[$index-1]);
+				$this->_printArea = implode(',',$printAreas);
+			}
+		}
+
+    	return $this;
+	}
+
+	/**
+	 *	Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20'
+	 *
+	 *	@param	string	$value
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							When the method is "O"verwrite, then a positive integer index will overwrite that indexed
+	 *								entry in the print areas list; a negative index value will identify which entry to
+	 *								overwrite working bacward through the print area to the list, with the last entry as -1.
+	 *								Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
+	 *							When the method is "I"nsert, then a positive index will insert after that indexed entry in
+	 *								the print areas list, while a negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@param	string	$method	Determines the method used when setting multiple print areas
+	 *							Default behaviour, or the "O" method, overwrites existing print area
+	 *							The "I" method, inserts the new print area before any specified index, or at the end of the list
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+	public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) {
+		if (strpos($value,'!') !== false) {
+			throw new Exception('Cell coordinate must not specify a worksheet.');
+		} elseif (strpos($value,':') === false) {
+			throw new Exception('Cell coordinate must be a range of cells.');
+		} elseif (strpos($value,'$') !== false) {
+			throw new Exception('Cell coordinate must not be absolute.');
+		}
+		$value = strtoupper($value);
+
+		if ($method == self::SETPRINTRANGE_OVERWRITE) {
+			if ($index == 0) {
+				$this->_printArea = $value;
+			} else {
+				$printAreas = explode(',',$this->_printArea);
+				if($index < 0) {
+					$index = count($printAreas) - abs($index) + 1;
+				}
+				if (($index <= 0) || ($index > count($printAreas))) {
+		    		throw new Exception('Invalid index for setting print range.');
+				}
+				$printAreas[$index-1] = $value;
+				$this->_printArea = implode(',',$printAreas);
+			}
+		} elseif($method == self::SETPRINTRANGE_INSERT) {
+			if ($index == 0) {
+				$this->_printArea .= ($this->_printArea == '') ? $value : ','.$value;
+			} else {
+				$printAreas = explode(',',$this->_printArea);
+				if($index < 0) {
+					$index = abs($index) - 1;
+				}
+				if ($index > count($printAreas)) {
+		    		throw new Exception('Invalid index for setting print range.');
+				}
+				$printAreas = array_merge(array_slice($printAreas,0,$index),array($value),array_slice($printAreas,$index));
+				$this->_printArea = implode(',',$printAreas);
+			}
+		} else {
+    		throw new Exception('Invalid method for setting print range.');
+		}
+
     	return $this;
 	}
 
 	/**
-	 * Set print area
+	 *	Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas
 	 *
-	 * @param int $column1		Column 1
-	 * @param int $row1			Row 1
-	 * @param int $column2		Column 2
-	 * @param int $row2			Row 2
-	 * @return PHPExcel_Worksheet_PageSetup
+	 *	@param	string	$value
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							A positive index will insert after that indexed entry in the print areas list, while a
+	 *								negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
 	 */
-    public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2)
+	public function addPrintArea($value, $index = -1) {
+		return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT);
+	}
+
+	/**
+	 *	Set print area
+	 *
+	 *	@param	int		$column1	Column 1
+	 *	@param	int		$row1		Row 1
+	 *	@param	int		$column2	Column 2
+	 *	@param	int		$row2		Row 2
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							When the method is "O"verwrite, then a positive integer index will overwrite that indexed
+	 *								entry in the print areas list; a negative index value will identify which entry to
+	 *								overwrite working bacward through the print area to the list, with the last entry as -1.
+	 *								Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
+	 *							When the method is "I"nsert, then a positive index will insert after that indexed entry in
+	 *								the print areas list, while a negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@param	string	$method	Determines the method used when setting multiple print areas
+	 *							Default behaviour, or the "O" method, overwrites existing print area
+	 *							The "I" method, inserts the new print area before any specified index, or at the end of the list
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+    public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE)
     {
-    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2);
+    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, $method);
     }
-    
+
+	/**
+	 *	Add a new print area to the list of print areas
+	 *
+	 *	@param	int		$column1	Column 1
+	 *	@param	int		$row1		Row 1
+	 *	@param	int		$column2	Column 2
+	 *	@param	int		$row2		Row 2
+	 *	@param	int		$index		Identifier for a specific print area range allowing several ranges to be set
+	 *								A positive index will insert after that indexed entry in the print areas list, while a
+	 *									negative index will insert before the indexed entry.
+	 *									Specifying an index value of 0, will always append the new print range at the end of the
+	 *									list.
+	 *								Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+    public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1)
+    {
+    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, self::SETPRINTRANGE_INSERT);
+	}
+
 	/**
 	 * Get first page number
 	 *
@@ -627,7 +774,7 @@ class PHPExcel_Worksheet_PageSetup
     public function getFirstPageNumber() {
 		return $this->_firstPageNumber;
     }
-    
+
     /**
      * Set first page number
      *
@@ -638,7 +785,7 @@ class PHPExcel_Worksheet_PageSetup
 		$this->_firstPageNumber = $value;
 		return $this;
     }
-    
+
     /**
      * Reset first page number
      *
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
index 0e7bc4f..f60a265 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
index c5cb33a..7311721 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
index 8b1277d..153024f 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
index d21bd51..e0f91fc 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
index c7e04ae..fdfe001 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
index f6f6a6f..87f8b29 100644
--- a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
+++ b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/CSV.php b/libraries/PHPExcel/PHPExcel/Writer/CSV.php
index 03e1a6e..765244d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/CSV.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/CSV.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -106,6 +106,8 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter {
 		// Fetch sheet
 		$sheet = $this->_phpExcel->getSheet($this->_sheetIndex);
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
 		PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
 
@@ -132,6 +134,7 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter {
 		fclose($fileHandle);
 
 		PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
index 1963ab9..b9f7464 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -201,6 +201,8 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter
 				}
 			}
 
+			$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+			PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 			$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
 			PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
 
@@ -331,6 +333,7 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter
 			}
 
 			PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
+			PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 
 			// Close file
 			if ($objZip->close() === false) {
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
index ddb7958..3a6ad37 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
index d27e386..84de96d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
index 68e0f04..21fc3a4 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
index 670b835..f1551da 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
index d133621..7ffdd6d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
index 8ab1c52..98a3c45 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
index dd7621d..5354936 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
index 9dbee16..e8ffe7b 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
index 245fb87..d2c51fb 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
index 411b42a..327e542 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -1002,7 +1002,18 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ
 
 						break;
 					case 'f':			// Formula
-						$objWriter->writeElement('f', substr($pCell->getValue(), 1));
+						$attributes = $pCell->getFormulaAttributes();
+						if($attributes['t'] == 'array') {
+							$objWriter->startElement('f');
+							$objWriter->writeAttribute('t', 'array');
+							$objWriter->writeAttribute('ref', $pCell->getCoordinate());
+							$objWriter->writeAttribute('aca', '1');
+							$objWriter->writeAttribute('ca', '1');
+							$objWriter->text(substr($pCell->getValue(), 1));
+							$objWriter->endElement();
+						} else {
+							$objWriter->writeElement('f', substr($pCell->getValue(), 1));
+						}
 						if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
 							if ($this->getParentWriter()->getPreCalculateFormulas()) {
 								$calculatedValue = $pCell->getCalculatedValue();
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
index c153237..97d56e1 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
index 0bb5571..4d69d91 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -91,6 +91,13 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 	 */
 	private $_parser;
 
+	/**
+	 * Identifier clusters for drawings. Used in MSODRAWINGGROUP record.
+	 *
+	 * @var array
+	 */
+	private $_IDCLs;
+
 
 	/**
 	 * Create a new PHPExcel_Writer_Excel5
@@ -120,6 +127,8 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		// garbage collect
 		$this->_phpExcel->garbageCollect();
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
 		PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
 
@@ -130,6 +139,21 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel, $this->_BIFF_version,
 					$this->_str_total, $this->_str_unique, $this->_str_table, $this->_colors, $this->_parser);
 
+		// Initialise worksheet writers
+		$countSheets = $this->_phpExcel->getSheetCount();
+		for ($i = 0; $i < $countSheets; ++$i) {
+			$this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version,
+									   $this->_str_total, $this->_str_unique,
+									   $this->_str_table, $this->_colors,
+									   $this->_parser,
+									   $this->_preCalculateFormulas,
+									   $this->_phpExcel->getSheet($i));
+		}
+
+		// build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook.
+		$this->_buildWorksheetEschers();
+		$this->_buildWorkbookEscher();
+
 		// add 15 identical cell style Xfs
 		// for now, we use the first cellXf instead of cellStyleXf
 		$cellXfCollection = $this->_phpExcel->getCellXfCollection();
@@ -146,19 +170,10 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$workbookStreamName = ($this->_BIFF_version == 0x0600) ? 'Workbook' : 'Book';
 		$OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName));
 
-		// Initialise worksheet writers
-		$countSheets = $this->_phpExcel->getSheetCount();
 		// Write the worksheet streams before the global workbook stream,
 		// because the byte sizes of these are needed in the global workbook stream
 		$worksheetSizes = array();
 		for ($i = 0; $i < $countSheets; ++$i) {
-			$this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version,
-									   $this->_str_total, $this->_str_unique,
-									   $this->_str_table, $this->_colors,
-									   $this->_parser,
-									   $this->_preCalculateFormulas,
-									   $this->_phpExcel->getSheet($i));
-
 			$this->_writerWorksheets[$i]->close();
 			$worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize;
 		}
@@ -176,6 +191,7 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$res = $root->save($pFilename);
 
 		PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
@@ -208,4 +224,253 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$this->_preCalculateFormulas = $pValue;
 	}
 
+	private function _buildWorksheetEschers()
+	{
+		// 1-based index to BstoreContainer
+		$blipIndex = 0;
+
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			// sheet index
+			$sheetIndex = $sheet->getParent()->getIndex($sheet);
+
+			$escher = null;
+
+			// check if there are any shapes for this sheet
+			if (count($sheet->getDrawingCollection()) == 0) {
+				continue;
+			}
+
+			// create intermediate Escher object
+			$escher = new PHPExcel_Shared_Escher();
+
+			// dgContainer
+			$dgContainer = new PHPExcel_Shared_Escher_DgContainer();
+
+			// set the drawing index (we use sheet index + 1)
+			$dgId = $sheet->getParent()->getIndex($sheet) + 1;
+			$dgContainer->setDgId($dgId);
+			$escher->setDgContainer($dgContainer);
+
+			// spgrContainer
+			$spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
+			$dgContainer->setSpgrContainer($spgrContainer);
+
+			// add one shape which is the group shape
+			$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
+			$spContainer->setSpgr(true);
+			$spContainer->setSpType(0);
+			$spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10);
+			$spgrContainer->addChild($spContainer);
+
+			// add the shapes
+
+			$countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet
+
+			foreach ($sheet->getDrawingCollection() as $drawing) {
+				++$blipIndex;
+
+				++$countShapes[$sheetIndex];
+
+				// add the shape
+				$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
+
+				// set the shape type
+				$spContainer->setSpType(0x004B);
+
+				// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
+				$reducedSpId = $countShapes[$sheetIndex];
+				$spId = $reducedSpId
+					| ($sheet->getParent()->getIndex($sheet) + 1) << 10;
+				$spContainer->setSpId($spId);
+
+				// keep track of last reducedSpId
+				$lastReducedSpId = $reducedSpId;
+
+				// keep track of last spId
+				$lastSpId = $spId;
+
+				// set the BLIP index
+				$spContainer->setOPT(0x4104, $blipIndex);
+
+				// set coordinates and offsets, client anchor
+				$coordinates = $drawing->getCoordinates();
+				$offsetX = $drawing->getOffsetX();
+				$offsetY = $drawing->getOffsetY();
+				$width = $drawing->getWidth();
+				$height = $drawing->getHeight();
+
+				$twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height);
+
+				$spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
+				$spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
+				$spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
+				$spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
+				$spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
+				$spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
+
+				$spgrContainer->addChild($spContainer);
+			}
+
+			// identifier clusters, used for workbook Escher object
+			$this->_IDCLs[$dgId] = $lastReducedSpId;
+
+			// set last shape index
+			$dgContainer->setLastSpId($lastSpId);
+
+			// set the Escher object
+			$this->_writerWorksheets[$sheetIndex]->setEscher($escher);
+		}
+	}
+
+	/**
+	 * Build the Escher object corresponding to the MSODRAWINGGROUP record
+	 */
+	private function _buildWorkbookEscher()
+	{
+		$escher = null;
+
+		// any drawings in this workbook?
+		$found = false;
+		foreach ($this->_phpExcel->getAllSheets() as $sheet) {
+			if (count($sheet->getDrawingCollection()) > 0) {
+				$found = true;
+			}
+		}
+
+		// nothing to do if there are no drawings
+		if (!$found) {
+			return;
+		}
+
+		// if we reach here, then there are drawings in the workbook
+		$escher = new PHPExcel_Shared_Escher();
+
+		// dggContainer
+		$dggContainer = new PHPExcel_Shared_Escher_DggContainer();
+		$escher->setDggContainer($dggContainer);
+
+		// set IDCLs (identifier clusters)
+		$dggContainer->setIDCLs($this->_IDCLs);
+
+		// this loop is for determining maximum shape identifier of all drawing
+		$spIdMax = 0;
+		$totalCountShapes = 0;
+		$countDrawings = 0;
+
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			$sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet
+
+			if (count($sheet->getDrawingCollection()) > 0) {
+				++$countDrawings;
+
+				foreach ($sheet->getDrawingCollection() as $drawing) {
+					++$sheetCountShapes;
+					++$totalCountShapes;
+
+					$spId = $sheetCountShapes
+						| ($this->_phpExcel->getIndex($sheet) + 1) << 10;
+					$spIdMax = max($spId, $spIdMax);
+				}
+			}
+		}
+
+		$dggContainer->setSpIdMax($spIdMax + 1);
+		$dggContainer->setCDgSaved($countDrawings);
+		$dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing
+
+		// bstoreContainer
+		$bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();
+		$dggContainer->setBstoreContainer($bstoreContainer);
+
+		// the BSE's (all the images)
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			foreach ($sheet->getDrawingCollection() as $drawing) {
+				if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
+
+					$filename = $drawing->getPath();
+
+					list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
+
+					switch ($imageFormat) {
+
+					case 1: // GIF, not supported by BIFF8, we convert to PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$imageResource = imagecreatefromgif($filename);
+						ob_start();
+						imagepng($imageResource);
+						$blipData = ob_get_contents();
+						ob_end_clean();
+						break;
+
+					case 2: // JPEG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
+						$blipData = file_get_contents($filename);
+						break;
+
+					case 3: // PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$blipData = file_get_contents($filename);
+						break;
+
+					case 6: // Windows DIB (BMP), we convert to PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename);
+						ob_start();
+						imagepng($imageResource);
+						$blipData = ob_get_contents();
+						ob_end_clean();
+						break;
+
+					default: continue 2;
+
+					}
+
+					$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
+					$blip->setData($blipData);
+
+					$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
+					$BSE->setBlipType($blipType);
+					$BSE->setBlip($blip);
+
+					$bstoreContainer->addBSE($BSE);
+
+				} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
+
+					switch ($drawing->getRenderingFunction()) {
+
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
+						$renderingFunction = 'imagejpeg';
+						break;
+
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$renderingFunction = 'imagepng';
+						break;
+
+					}
+
+					ob_start();
+					call_user_func($renderingFunction, $drawing->getImageResource());
+					$blipData = ob_get_contents();
+					ob_end_clean();
+
+					$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
+					$blip->setData($blipData);
+
+					$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
+					$BSE->setBlipType($blipType);
+					$BSE->setBlip($blip);
+
+					$bstoreContainer->addBSE($BSE);
+				}
+			}
+		}
+
+		// Set the Escher object
+		$this->_writerWorkbook->setEscher($escher);
+	}
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
index 2c0a2d1..e758aeb 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class):
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
index 402bd19..3c9c29f 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
  
@@ -106,9 +106,12 @@ class PHPExcel_Writer_Excel5_Escher
 					, $this->_object->getCSpSaved()
 					, $this->_object->getCDgSaved() // count total number of drawings saved
 				);
+
 			// add file identifier clusters (one per drawing)
-			for ($i = 0; $i < $this->_object->getCDgSaved(); ++$i) {
-				$dggData .= pack('VV', 0, 0);
+			$IDCLs = $this->_object->getIDCLs();
+
+			foreach ($IDCLs as $dgId => $maxReducedSpId) {
+				$dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
 			}
 
 			$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
index bb4d201..2928070 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
index cef650f..eb9891e 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class):
@@ -1148,6 +1148,9 @@ class PHPExcel_Writer_Excel5_Parser
 			case "<>":
 				return $token;
 				break;
+			case "^":
+				return $token;
+				break;
 			default:
 				// if it's a reference A1 or $A$1 or $A1 or A$1
 				if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and
@@ -1288,19 +1291,30 @@ class PHPExcel_Writer_Excel5_Parser
 			$result2 = $this->_expression();
 			$result = $this->_createTree('ptgUminus', $result2, '');
 			return $result;
+		} elseif ($this->_current_token == "+") {
+			// catch "+" Term
+			$this->_advance();
+			$result2 = $this->_expression();
+			$result = $this->_createTree('ptgUplus', $result2, '');
+			return $result;
 		}
 		$result = $this->_term();
 		while (($this->_current_token == "+") or
-			   ($this->_current_token == "-")) {
+			   ($this->_current_token == "-") or
+			   ($this->_current_token == "^")) {
 		/**/
 			if ($this->_current_token == "+") {
 				$this->_advance();
 				$result2 = $this->_term();
 				$result = $this->_createTree('ptgAdd', $result, $result2);
-			} else {
+			} elseif ($this->_current_token == "-") {
 				$this->_advance();
 				$result2 = $this->_term();
 				$result = $this->_createTree('ptgSub', $result, $result2);
+			} else {
+				$this->_advance();
+				$result2 = $this->_term();
+				$result = $this->_createTree('ptgPower', $result, $result2);
 			}
 		}
 		return $result;
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
index d26ddee..6e517e6 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class):
@@ -182,6 +182,13 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 	 */
 	private $_colors;
 
+	/**
+	 * Escher object corresponding to MSODRAWINGGROUP
+	 *
+	 * @var PHPExcel_Shared_Escher
+	 */
+	private $_escher;
+
 
 	/**
 	 * Class constructor
@@ -1400,143 +1407,9 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 	 */
 	private function _writeMsoDrawingGroup()
 	{
-		// any drawings in this workbook?
-		$found = false;
-		foreach ($this->_phpExcel->getAllSheets() as $sheet) {
-			if (count($sheet->getDrawingCollection()) > 0) {
-				$found = true;
-			}
-		}
-
-		// if there are drawings, then we need to write MSODRAWINGGROUP record
-		if ($found) {
-
-			// create intermediate Escher object
-			$escher = new PHPExcel_Shared_Escher();
-
-			// dggContainer
-			$dggContainer = new PHPExcel_Shared_Escher_DggContainer();
-			$escher->setDggContainer($dggContainer);
-
-			// this loop is for determining maximum shape identifier of all drawing
-			$spIdMax = 0;
-			$totalCountShapes = 0;
-			$countDrawings = 0;
-
-			foreach ($this->_phpExcel->getAllsheets() as $sheet) {
-				$sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet
-
-				if (count($sheet->getDrawingCollection()) > 0) {
-					++$countDrawings;
-
-					foreach ($sheet->getDrawingCollection() as $drawing) {
-						++$sheetCountShapes;
-						++$totalCountShapes;
-
-						$spId = $sheetCountShapes
-							| ($this->_phpExcel->getIndex($sheet) + 1) << 10;
-						$spIdMax = max($spId, $spIdMax);
-					}
-				}
-			}
-
-			$dggContainer->setSpIdMax($spIdMax + 1);
-			$dggContainer->setCDgSaved($countDrawings);
-			$dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing
-
-			// bstoreContainer
-			$bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();
-			$dggContainer->setBstoreContainer($bstoreContainer);
-
-			// the BSE's (all the images)
-			foreach ($this->_phpExcel->getAllsheets() as $sheet) {
-				foreach ($sheet->getDrawingCollection() as $drawing) {
-					if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
-
-						$filename = $drawing->getPath();
-
-						list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
-
-						switch ($imageFormat) {
-
-						case 1: // GIF, not supported by BIFF8, we convert to PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$imageResource = imagecreatefromgif($filename);
-							ob_start();
-							imagepng($imageResource);
-							$blipData = ob_get_contents();
-							ob_end_clean();
-							break;
-
-						case 2: // JPEG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
-							$blipData = file_get_contents($filename);
-							break;
-
-						case 3: // PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$blipData = file_get_contents($filename);
-							break;
-
-						case 6: // Windows DIB (BMP), we convert to PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename);
-							ob_start();
-							imagepng($imageResource);
-							$blipData = ob_get_contents();
-							ob_end_clean();
-							break;
-
-						default: continue 2;
-
-						}
-
-						$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
-						$blip->setData($blipData);
-
-						$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
-						$BSE->setBlipType($blipType);
-						$BSE->setBlip($blip);
-
-						$bstoreContainer->addBSE($BSE);
-
-					} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
-
-						switch ($drawing->getRenderingFunction()) {
-
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
-							$renderingFunction = 'imagejpeg';
-							break;
-
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$renderingFunction = 'imagepng';
-							break;
-
-						}
-
-						ob_start();
-						call_user_func($renderingFunction, $drawing->getImageResource());
-						$blipData = ob_get_contents();
-						ob_end_clean();
-
-						$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
-						$blip->setData($blipData);
-
-						$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
-						$BSE->setBlipType($blipType);
-						$BSE->setBlip($blip);
-
-						$bstoreContainer->addBSE($BSE);
-					}
-				}
-			}
-
-			// write the Escher stream from the intermediate Escher object
-			$writer = new PHPExcel_Writer_Excel5_Escher($escher);
+		// write the Escher stream if necessary
+		if (isset($this->_escher)) {
+			$writer = new PHPExcel_Writer_Excel5_Escher($this->_escher);
 			$data = $writer->close();
 
 			$record = 0x00EB;
@@ -1544,7 +1417,30 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 			$header = pack("vv",  $record, $length);
 
 			return $this->writeData($header . $data);
+
+		} else {
+			return '';
 		}
 	}
 
+	/**
+	 * Get Escher object
+	 *
+	 * @return PHPExcel_Shared_Escher
+	 */
+	public function getEscher()
+	{
+		return $this->_escher;
+	}
+
+	/**
+	 * Set Escher object
+	 *
+	 * @param PHPExcel_Shared_Escher $pValue
+	 */
+	public function setEscher(PHPExcel_Shared_Escher $pValue = null)
+	{
+		$this->_escher = $pValue;
+	}
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
index 646101a..0dd2b00 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class):
@@ -186,6 +186,13 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 	private $_countCellStyleXfs;
 
 	/**
+	 * Escher object corresponding to MSODRAWING
+	 *
+	 * @var PHPExcel_Shared_Escher
+	 */
+	private $_escher;
+
+	/**
 	 * Constructor
 	 *
 	 * @param int  $BIFF_version		 BIFF version
@@ -2694,142 +2701,82 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 	}
 
 	/**
-	 * Write MSODRAWING record
+	 * Get Escher object
+	 *
+	 * @return PHPExcel_Shared_Escher
 	 */
-	private function _writeMsoDrawing()
+	public function getEscher()
 	{
-		// check if there are any shapes for this sheet
-		if (count($this->_phpSheet->getDrawingCollection()) == 0) {
-			return;
-		}
-
-		// create intermediate Escher object
-		$escher = new PHPExcel_Shared_Escher();
-
-		// dgContainer
-		$dgContainer = new PHPExcel_Shared_Escher_DgContainer();
-
-		// set the drawing index (we use sheet index + 1)
-		$dgContainer->setDgId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1);
-		$escher->setDgContainer($dgContainer);
-
-		// spgrContainer
-		$spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
-		$dgContainer->setSpgrContainer($spgrContainer);
-
-		// add one shape which is the group shape
-		$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
-		$spContainer->setSpgr(true);
-		$spContainer->setSpType(0);
-		$spContainer->setSpId(($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10);
-		$spgrContainer->addChild($spContainer);
-
-		// add the shapes
-
-		// outer loop is for determining BSE index
-		$blipIndex = 0; // 1-based index to BstoreContainer
-
-		$countShapes = 0; // count number of shapes (minus group shape), in this sheet
-
-		foreach ($this->_phpSheet->getParent()->getAllsheets() as $sheet) {
-			foreach ($sheet->getDrawingCollection() as $drawing) {
-				++$blipIndex;
-
-				if ($sheet === $this->_phpSheet) {
-					++$countShapes;
-
-					// add the shape
-					$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
-
-					// set the shape type
-					$spContainer->setSpType(0x004B);
-
-					// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
-					$spId = $countShapes
-						| ($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10;
-					$spContainer->setSpId($spId);
-
-					// keep track of last spId
-					$lastSpId = $spId;
-
-					// set the BLIP index
-					$spContainer->setOPT(0x4104, $blipIndex);
-
-					// set coordinates and offsets, client anchor
-					$coordinates = $drawing->getCoordinates();
-					$offsetX = $drawing->getOffsetX();
-					$offsetY = $drawing->getOffsetY();
-					$width = $drawing->getWidth();
-					$height = $drawing->getHeight();
-
-					$twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($this->_phpSheet, $coordinates, $offsetX, $offsetY, $width, $height);
+		return $this->_escher;
+	}
 
-					$spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
-					$spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
-					$spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
-					$spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
-					$spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
-					$spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
+	/**
+	 * Set Escher object
+	 *
+	 * @param PHPExcel_Shared_Escher $pValue
+	 */
+	public function setEscher(PHPExcel_Shared_Escher $pValue = null)
+	{
+		$this->_escher = $pValue;
+	}
 
-					$spgrContainer->addChild($spContainer);
-				}
+	/**
+	 * Write MSODRAWING record
+	 */
+	private function _writeMsoDrawing()
+	{
+		// write the Escher stream if necessary
+		if (isset($this->_escher)) {
+			$writer = new PHPExcel_Writer_Excel5_Escher($this->_escher);
+			$data = $writer->close();
+			$spOffsets = $writer->getSpOffsets();
+
+			// write the neccesary MSODRAWING, OBJ records
+
+			// split the Escher stream
+			$spOffsets[0] = 0;
+			$nm = count($spOffsets) - 1; // number of shapes excluding first shape
+			for ($i = 1; $i <= $nm; ++$i) {
+				// MSODRAWING record
+				$record = 0x00EC;			// Record identifier
+
+				// chunk of Escher stream for one shape
+
+				$dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]);
+
+				$length = strlen($dataChunk);
+				$header = pack("vv", $record, $length);
+
+				$this->_append($header . $dataChunk);
+
+				// OBJ record
+				$record = 0x005D; // record identifier
+				$objData = '';
+
+				// ftCmo
+				$objData .=
+					pack('vvvvvVVV'
+						, 0x0015	// 0x0015 = ftCmo
+						, 0x0012	// length of ftCmo data
+						, 0x0008	// object type, 0x0008 = picture
+						, $i		// object id number, Excel seems to use 1-based index, local for the sheet
+						, 0x6011	// option flags, 0x6011 is what OpenOffice.org uses
+						, 0			// reserved
+						, 0			// reserved
+						, 0			// reserved
+					);
+				// ftEnd
+				$objData .=
+					pack('vv'
+						, 0x0000	// 0x0000 = ftEnd
+						, 0x0000	// length of ftEnd data
+					);
+
+				$length = strlen($objData);
+				$header = pack('vv', $record, $length);
+				$this->_append($header . $objData);
 			}
 		}
-
-		// set last shape index
-		$dgContainer->setLastSpId($lastSpId);
-
-		// write the Escher stream
-		$writer = new PHPExcel_Writer_Excel5_Escher($escher);
-		$data = $writer->close();
-		$spOffsets = $writer->getSpOffsets();
-
-		// write the neccesary MSODRAWING, OBJ records
-
-		// split the Escher stream
-		$spOffsets[0] = 0;
-		$nm = count($spOffsets) - 1; // number of shapes excluding first shape
-		for ($i = 1; $i <= $nm; ++$i) {
-			// MSODRAWING record
-			$record = 0x00EC;			// Record identifier
-
-			// chunk of Escher stream for one shape
-
-			$dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]);
-
-			$length = strlen($dataChunk);
-			$header = pack("vv", $record, $length);
-
-			$this->_append($header . $dataChunk);
-
-			// OBJ record
-			$record = 0x005D; // record identifier
-			$objData = '';
-
-			// ftCmo
-			$objData .=
-				pack('vvvvvVVV'
-					, 0x0015	// 0x0015 = ftCmo
-					, 0x0012	// length of ftCmo data
-					, 0x0008	// object type, 0x0008 = picture
-					, $i		// object id number, Excel seems to use 1-based index, local for the sheet
-					, 0x6011	// option flags, 0x6011 is what OpenOffice.org uses
-					, 0			// reserved
-					, 0			// reserved
-					, 0			// reserved
-				);
-			// ftEnd
-			$objData .=
-				pack('vv'
-					, 0x0000	// 0x0000 = ftEnd
-					, 0x0000	// length of ftEnd data
-				);
-
-			$length = strlen($objData);
-			$header = pack('vv', $record, $length);
-			$this->_append($header . $objData);
-		}
-
 	}
 
 	/**
@@ -3006,4 +2953,4 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 		return 0;
 	}
 
-}
+}
\ No newline at end of file
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
index 9246a34..27632f3 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class):
diff --git a/libraries/PHPExcel/PHPExcel/Writer/HTML.php b/libraries/PHPExcel/PHPExcel/Writer/HTML.php
index 3c892cf..b6667f5 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/HTML.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/HTML.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -152,6 +152,8 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 		// garbage collect
 		$this->_phpExcel->garbageCollect();
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
 		PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
 
@@ -182,6 +184,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 		fclose($fileHandle);
 
 		PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
@@ -330,7 +333,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 	    	// row min,max
 			$rowMin = $dimension[0][1];
 			$rowMax = $dimension[1][1];
-			
+
 			// calculate start of <tbody>, <thead>
 			$tbodyStart = $rowMin;
 	    	$tbodyEnd   = $rowMax;
@@ -338,7 +341,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 			$theadEnd   = 0; // default: no </thead>
 			if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
 				$rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop();
-				
+
 				// we can only support repeating rows that start at top row
 				if ($rowsToRepeatAtTop[0] == 1) {
 					$theadStart = $rowsToRepeatAtTop[0];
@@ -346,7 +349,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 					$tbodyStart = $rowsToRepeatAtTop[1] + 1;
 				}
 			}
-			
+
 			// Loop through cells
 	    	$rowData = null;
 	    	for ($row = $rowMin; $row <= $rowMax; ++$row) {
diff --git a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
index ec5331e..35fd689 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/PDF.php b/libraries/PHPExcel/PHPExcel/Writer/PDF.php
index 570ce9d..f588635 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/PDF.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/PDF.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Writer
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
index 603c4f7..51616b4 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -163,10 +163,10 @@ class PHPExcel_Writer_Serialized implements PHPExcel_Writer_IWriter
 
 		// PHPExcel
 		$objWriter->startElement('PHPExcel');
-		$objWriter->writeAttribute('version', '1.7.3c');
+		$objWriter->writeAttribute('version', '1.7.4');
 
 			// Comment
-			$objWriter->writeComment('This file has been generated using PHPExcel v1.7.3c (http://www.codeplex.com/PHPExcel) It contains a base64 encoded serialized version of the PHPExcel internal object.');
+			$objWriter->writeComment('This file has been generated using PHPExcel v1.7.4 (http://www.codeplex.com/PHPExcel) It contains a base64 encoded serialized version of the PHPExcel internal object.');
 
 			// Data
 			$objWriter->startElement('data');
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, QA_3_3, updated. RELEASE_3_3_7-9-gadaa35a
                        
                        
by Dieter Adriaenssens 11 Sep '10
                    by Dieter Adriaenssens 11 Sep '10
11 Sep '10
                    
                        The branch, QA_3_3 has been updated
       via  adaa35a87feeaf079d4178bb471073e0e19a75b6 (commit)
      from  f5879655d58812b978dc975e5dc8d8497d11a3c3 (commit)
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
 ChangeLog                                          |    1 +
 libraries/PHPExcel/PHPExcel.php                    |    4 +-
 libraries/PHPExcel/PHPExcel/Autoloader.php         |    2 +-
 .../PHPExcel/PHPExcel/CachedObjectStorage/APC.php  |   45 +++-
 .../PHPExcel/CachedObjectStorage/CacheBase.php     |   35 ++-
 .../PHPExcel/CachedObjectStorage/DiscISAM.php      |   28 ++-
 .../PHPExcel/CachedObjectStorage/ICache.php        |    9 +-
 .../PHPExcel/CachedObjectStorage/Memcache.php      |   53 +++-
 .../PHPExcel/CachedObjectStorage/Memory.php        |    2 +-
 .../PHPExcel/CachedObjectStorage/MemoryGZip.php    |    2 +-
 .../CachedObjectStorage/MemorySerialized.php       |    2 +-
 .../PHPExcel/CachedObjectStorage/PHPTemp.php       |   26 ++-
 .../PHPExcel/CachedObjectStorage/Wincache.php      |   58 +++-
 libraries/PHPExcel/PHPExcel/Calculation.php        |  105 +++++--
 .../PHPExcel/PHPExcel/Calculation/Exception.php    |    2 +-
 .../PHPExcel/Calculation/ExceptionHandler.php      |    2 +-
 .../PHPExcel/Calculation/FormulaParser.php         |    2 +-
 .../PHPExcel/PHPExcel/Calculation/FormulaToken.php |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Function.php     |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Functions.php    |  175 ++++++-------
 libraries/PHPExcel/PHPExcel/Cell.php               |  296 ++++++++++----------
 .../PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/DataType.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DataValidation.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DefaultValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Comment.php            |    2 +-
 libraries/PHPExcel/PHPExcel/DocumentProperties.php |   93 ++++---
 libraries/PHPExcel/PHPExcel/DocumentSecurity.php   |    2 +-
 libraries/PHPExcel/PHPExcel/HashTable.php          |    2 +-
 libraries/PHPExcel/PHPExcel/IComparable.php        |    2 +-
 libraries/PHPExcel/PHPExcel/IOFactory.php          |    2 +-
 libraries/PHPExcel/PHPExcel/NamedRange.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/CSV.php         |    2 +-
 .../PHPExcel/PHPExcel/Reader/DefaultReadFilter.php |    2 +-
 .../PHPExcel/PHPExcel/Reader/Excel2003XML.php      |    7 +-
 libraries/PHPExcel/PHPExcel/Reader/Excel2007.php   |   55 +++-
 libraries/PHPExcel/PHPExcel/Reader/Excel5.php      |   77 +++---
 .../PHPExcel/PHPExcel/Reader/Excel5/Escher.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReader.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/OOCalc.php      |   15 +-
 libraries/PHPExcel/PHPExcel/Reader/SYLK.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/Serialized.php  |    2 +-
 libraries/PHPExcel/PHPExcel/ReferenceHelper.php    |  161 ++++++++---
 libraries/PHPExcel/PHPExcel/RichText.php           |    2 +-
 .../PHPExcel/PHPExcel/RichText/ITextElement.php    |    2 +-
 libraries/PHPExcel/PHPExcel/RichText/Run.php       |    2 +-
 .../PHPExcel/PHPExcel/RichText/TextElement.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Settings.php           |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/CodePage.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Date.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Drawing.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Escher.php      |    2 +-
 .../PHPExcel/Shared/Escher/DgContainer.php         |    2 +-
 .../Shared/Escher/DgContainer/SpgrContainer.php    |    2 +-
 .../DgContainer/SpgrContainer/SpContainer.php      |    2 +-
 .../PHPExcel/Shared/Escher/DggContainer.php        |   28 ++-
 .../Shared/Escher/DggContainer/BstoreContainer.php |    2 +-
 .../Escher/DggContainer/BstoreContainer/BSE.php    |    2 +-
 .../DggContainer/BstoreContainer/BSE/Blip.php      |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Excel5.php      |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/File.php        |   21 +-
 libraries/PHPExcel/PHPExcel/Shared/Font.php        |    2 +-
 .../PHPExcel/Shared/OLE/ChainedBlockStream.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/OLERead.php     |    2 +-
 .../PHPExcel/PHPExcel/Shared/PasswordHasher.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/String.php      |    4 +-
 libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php   |   11 +-
 .../PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php  |    2 +-
 .../PHPExcel/Shared/trend/bestFitClass.php         |    2 +-
 .../Shared/trend/exponentialBestFitClass.php       |    2 +-
 .../PHPExcel/Shared/trend/linearBestFitClass.php   |    2 +-
 .../Shared/trend/logarithmicBestFitClass.php       |    2 +-
 .../Shared/trend/polynomialBestFitClass.php        |    2 +-
 .../PHPExcel/Shared/trend/powerBestFitClass.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Style.php              |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Alignment.php    |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Border.php       |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Borders.php      |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Color.php        |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Conditional.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Style/Fill.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Font.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/NumberFormat.php |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Protection.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet.php          |   15 +-
 .../PHPExcel/PHPExcel/Worksheet/BaseDrawing.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/CellIterator.php   |    2 +-
 .../PHPExcel/Worksheet/ColumnDimension.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/HeaderFooter.php   |    2 +-
 .../PHPExcel/Worksheet/HeaderFooterDrawing.php     |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageMargins.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageSetup.php      |  213 ++++++++++++---
 .../PHPExcel/PHPExcel/Worksheet/Protection.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Row.php      |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowDimension.php   |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowIterator.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/SheetView.php      |    2 +-
 libraries/PHPExcel/PHPExcel/WorksheetIterator.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/CSV.php         |    5 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel2007.php   |    5 +-
 .../PHPExcel/Writer/Excel2007/Comments.php         |    2 +-
 .../PHPExcel/Writer/Excel2007/ContentTypes.php     |    2 +-
 .../PHPExcel/Writer/Excel2007/DocProps.php         |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Rels.php    |    2 +-
 .../PHPExcel/Writer/Excel2007/StringTable.php      |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Style.php   |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Theme.php   |    2 +-
 .../PHPExcel/Writer/Excel2007/Workbook.php         |    2 +-
 .../PHPExcel/Writer/Excel2007/Worksheet.php        |   15 +-
 .../PHPExcel/Writer/Excel2007/WriterPart.php       |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel5.php      |  285 ++++++++++++++++++-
 .../PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Escher.php     |    9 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Parser.php     |   20 ++-
 .../PHPExcel/PHPExcel/Writer/Excel5/Workbook.php   |  172 +++---------
 .../PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php  |  211 ++++++---------
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/HTML.php        |   11 +-
 libraries/PHPExcel/PHPExcel/Writer/IWriter.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/PDF.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/Serialized.php  |    6 +-
 129 files changed, 1563 insertions(+), 917 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 42030ef..eeebed1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@ $HeadURL: https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/trunk/phpMyA
 
 3.3.8.0 (not yet released)
 - bug #3059311 [import] BIGINT field type added to table analysis
+- [core] Update library PHPExcel to version 1.7.4
 
 3.3.7.0 (2010-09-07)
 - patch #3050492 [PDF scratchboard] Cannot drag table box to the edge after
diff --git a/libraries/PHPExcel/PHPExcel.php b/libraries/PHPExcel/PHPExcel.php
index 8b9c71f..c54d421 100644
--- a/libraries/PHPExcel/PHPExcel.php
+++ b/libraries/PHPExcel/PHPExcel.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -434,7 +434,7 @@ class PHPExcel
 
 		// update the cellXfs
 		foreach ($pSheet->getCellCollection(false) as $cellID) {
-			$cell = $sheet->getCell($cellID);
+			$cell = $pSheet->getCell($cellID);
 			$cell->setXfIndex( $cell->getXfIndex() + $countCellXfs );
 		}
 
diff --git a/libraries/PHPExcel/PHPExcel/Autoloader.php b/libraries/PHPExcel/PHPExcel/Autoloader.php
index 3821d74..e66ce60 100644
--- a/libraries/PHPExcel/PHPExcel/Autoloader.php
+++ b/libraries/PHPExcel/PHPExcel/Autoloader.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 class PHPExcel_Autoloader
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
index 62e3a14..dae46c2 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -45,7 +45,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 
 		if (!apc_store($this->_cachePrefix.$this->_currentObjectID.'.cache',serialize($this->_currentObject),$this->_cacheTime)) {
 			$this->__destruct();
-			throw new Exception('Failed to store cell in APC');
+			throw new Exception('Failed to store cell '.$cellID.' in APC');
 		}
 		$this->_currentObjectID = $this->_currentObject = null;
 	}	//	function _storeData()
@@ -90,7 +90,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 			if ($success === false) {
 				//	Entry no longer exists in APC, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in APC');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
 			}
 			return true;
 		}
@@ -117,7 +117,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 			if ($obj === false) {
 				//	Entry no longer exists in APC, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in APC');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -150,6 +150,35 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$obj = apc_fetch($this->_cachePrefix.$cellID.'.cache');
+				if ($obj === false) {
+					//	Entry no longer exists in APC, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in APC');
+				}
+				if (!apc_store($newCachePrefix.$cellID.'.cache',$obj,$this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in APC');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -170,12 +199,8 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
 		$cacheTime	= (isset($arguments['cacheTime']))	? $arguments['cacheTime']	: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 			$this->_cacheTime = $cacheTime;
 
 			parent::__construct($parent);
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
index 9871d90..208ed02 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -116,7 +116,7 @@ class PHPExcel_CachedObjectStorage_CacheBase {
 			$this->_currentObjectID = $this->_currentObject = null;
 		}
 
-		if (isset($this->_cellCache[$pCoord])) {
+		if (is_object($this->_cellCache[$pCoord])) {
 			$this->_cellCache[$pCoord]->detach();
 			unset($this->_cellCache[$pCoord]);
 		}
@@ -141,13 +141,34 @@ class PHPExcel_CachedObjectStorage_CacheBase {
 	public function getSortedCellList() {
 		$sortKeys = array();
 		foreach ($this->_cellCache as $coord => $value) {
-			preg_match('/^(\w+)(\d+)$/U',$coord,$matches);
-			list(,$colNum,$rowNum) = $matches;
-			$sortKeys[$coord] =  str_pad($rowNum . str_pad($colNum,3,'@',STR_PAD_LEFT),12,'0',STR_PAD_LEFT);
+			list($colNum,$rowNum) = sscanf($coord,'%[A-Z]%d');
+			$sortKeys[sprintf('%09d%3s',$rowNum,$colNum)] = $coord;
 		}
-		asort($sortKeys);
+		ksort($sortKeys);
 
-		return array_keys($sortKeys);
+		return array_values($sortKeys);
 	}	//	function sortCellList()
 
+
+	protected function _getUniqueID() {
+		if (function_exists('posix_getpid')) {
+			$baseUnique = posix_getpid();
+		} else {
+			$baseUnique = mt_rand();
+		}
+		return uniqid($baseUnique,true);
+	}
+
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		$this->_parent = $parent;
+		if ((!is_null($this->_currentObject)) && (is_object($this->_currentObject))) {
+			$this->_currentObject->attach($parent);
+		}
+	}	//	function copyCellCollection()
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
index e685607..dff52fa 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -103,6 +103,24 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage
 	}	//	function getCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newFileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache';
+		//	Copy the existing cell cache file
+		copy ($this->_fileName,$newFileName);
+		$this->_fileName = $newFileName;
+		//	Open the copied cell cache file
+		$this->_fileHandle = fopen($this->_fileName,'a+');
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -121,12 +139,8 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage
 	public function __construct(PHPExcel_Worksheet $parent) {
 		parent::__construct($parent);
 		if (is_null($this->_fileHandle)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_fileName = sys_get_temp_dir().'/PHPExcel.'.uniqid($baseUnique,true).'.cache';
+			$baseUnique = $this->_getUniqueID();
+			$this->_fileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache';
 			$this->_fileHandle = fopen($this->_fileName,'a+');
 		}
 	}	//	function __construct()
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
index f3282aa..4731b8e 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -94,4 +94,11 @@ interface PHPExcel_CachedObjectStorage_ICache
 	 */
 	public function getSortedCellList();
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent);
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
index f1fc43c..74df8e8 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -49,7 +49,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 		if (!$this->_memcache->replace($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) {
 			if (!$this->_memcache->add($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) {
 				$this->__destruct();
-				throw new Exception('Failed to store cell in Memcache');
+				throw new Exception('Failed to store cell '.$cellID.' in MemCache');
 			}
 		}
 		$this->_currentObjectID = $this->_currentObject = null;
@@ -90,12 +90,12 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 			if ($this->_currentObjectID == $pCoord) {
 				return true;
 			}
-			//	Check if the requested entry still exists in apc
+			//	Check if the requested entry still exists in Memcache
 			$success = $this->_memcache->get($this->_cachePrefix.$pCoord.'.cache');
 			if ($success === false) {
 				//	Entry no longer exists in Memcache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Memcache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
 			}
 			return true;
 		}
@@ -122,7 +122,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 			if ($obj === false) {
 				//	Entry no longer exists in Memcache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Memcache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -155,6 +155,35 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$obj = $this->_memcache->get($this->_cachePrefix.$cellID.'.cache');
+				if ($obj === false) {
+					//	Entry no longer exists in Memcache, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache');
+				}
+				if (!$this->_memcache->add($newCachePrefix.$cellID.'.cache',$obj,NULL,$this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in MemCache');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -177,17 +206,13 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 		$cacheTime		= (isset($arguments['cacheTime']))		? $arguments['cacheTime']		: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 
 			//	Set a new Memcache object and connect to the Memcache server
 			$this->_memcache = new Memcache();
-			if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback')) {
-				throw new Exception('Could not connect to Memcache server at '.$memcacheServer.':'.$memcachePort);
+			if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) {
+				throw new Exception('Could not connect to MemCache server at '.$memcacheServer.':'.$memcachePort);
 			}
 			$this->_cacheTime = $cacheTime;
 
@@ -197,7 +222,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
 
 
 	public function failureCallback($host, $port) {
-		throw new Exception('memcache '.$host.':'.$port' failed');
+		throw new Exception('memcache '.$host.':'.$port.' failed');
 	}
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
index be0fade..4b59b91 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
index c281389..394faf2 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
index 9c29ea2..0b5b997 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
index 98cd952..54810d8 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -38,6 +38,8 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 	private $_fileHandle = null;
 
 
+	private $_memoryCacheSize = null;
+
 	private function _storeData() {
 		$this->_currentObject->detach();
 
@@ -102,6 +104,24 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 	}	//	function getCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Open a new stream for the cell cache data
+		$newFileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+');
+		//	Copy the existing cell cache data to the new stream
+		fseek($this->_fileHandle,0);
+		while (!feof($this->_fileHandle)) {
+			fwrite($newFileHandle,fread($this->_fileHandle, 1024));
+		}
+		$this->_fileHandle = $newFileHandle;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
@@ -118,11 +138,11 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
 
 
 	public function __construct(PHPExcel_Worksheet $parent, $memoryCacheSize = '1MB') {
-		$memoryCacheSize	= (isset($arguments['memoryCacheSize']))	? $arguments['memoryCacheSize']	: '1MB';
+		$this->_memoryCacheSize	= (isset($arguments['memoryCacheSize']))	? $arguments['memoryCacheSize']	: '1MB';
 
 		parent::__construct($parent);
 		if (is_null($this->_fileHandle)) {
-			$this->_fileHandle = fopen('php://temp/maxmemory:'.$memoryCacheSize,'a+');
+			$this->_fileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+');
 		}
 	}	//	function __construct()
 
diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
index d759d7c..aa075be 100644
--- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
+++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel_CachedObjectStorage
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -45,9 +45,15 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 
 		$obj = serialize($this->_currentObject);
 		if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
-			wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime);
+			if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
+				$this->__destruct();
+				throw new Exception('Failed to store cell '.$cellID.' in WinCache');
+			}
 		} else {
-			wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime);
+			if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
+				$this->__destruct();
+				throw new Exception('Failed to store cell '.$cellID.' in WinCache');
+			}
 		}
 
 		$this->_currentObjectID = $this->_currentObject = null;
@@ -93,7 +99,7 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 			if ($success === false) {
 				//	Entry no longer exists in Wincache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Wincache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache');
 			}
 			return true;
 		}
@@ -120,9 +126,9 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 			$success = false;
 			$obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
 			if ($success === false) {
-				//	Entry no longer exists in Wincache, so clear it from the cache array
+				//	Entry no longer exists in WinCache, so clear it from the cache array
 				parent::deleteCacheData($pCoord);
-				throw new Exception('Cell entry no longer exists in Wincache');
+				throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache');
 			}
 		} else {
 			//	Return null if requested entry doesn't exist in cache
@@ -155,13 +161,43 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 	}	//	function deleteCacheData()
 
 
+	/**
+	 *	Clone the cell collection
+	 *
+	 *	@return	void
+	 */
+	public function copyCellCollection(PHPExcel_Worksheet $parent) {
+		parent::copyCellCollection($parent);
+		//	Get a new id for the new file name
+		$baseUnique = $this->_getUniqueID();
+		$newCachePrefix = substr(md5($baseUnique),0,8).'.';
+		$cacheList = $this->getCellList();
+		foreach($cacheList as $cellID) {
+			if ($cellID != $this->_currentObjectID) {
+				$success = false;
+				$obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
+				if ($success === false) {
+					//	Entry no longer exists in WinCache, so clear it from the cache array
+					parent::deleteCacheData($cellID);
+					throw new Exception('Cell entry '.$cellID.' no longer exists in Wincache');
+				}
+				if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
+					$this->__destruct();
+					throw new Exception('Failed to store cell '.$cellID.' in Wincache');
+				}
+			}
+		}
+		$this->_cachePrefix = $newCachePrefix;
+	}	//	function copyCellCollection()
+
+
 	public function unsetWorksheetCells() {
 		if(!is_null($this->_currentObject)) {
 			$this->_currentObject->detach();
 			$this->_currentObject = $this->_currentObjectID = null;
 		}
 
-		//	Flush the Wincache cache
+		//	Flush the WinCache cache
 		$this->__destruct();
 
 		$this->_cellCache = array();
@@ -175,12 +211,8 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
 		$cacheTime	= (isset($arguments['cacheTime']))	? $arguments['cacheTime']	: 600;
 
 		if (is_null($this->_cachePrefix)) {
-			if (function_exists('posix_getpid')) {
-				$baseUnique = posix_getpid();
-			} else {
-				$baseUnique = mt_rand();
-			}
-			$this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.';
+			$baseUnique = $this->_getUniqueID();
+			$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
 			$this->_cacheTime = $cacheTime;
 
 			parent::__construct($parent);
diff --git a/libraries/PHPExcel/PHPExcel/Calculation.php b/libraries/PHPExcel/PHPExcel/Calculation.php
index 6e8499e..e32891a 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -2248,7 +2248,7 @@ class PHPExcel_Calculation {
 		}
 		$this->debugLogStack[] = $wsTitle.'!'.$cellID;
 		//	Parse the formula onto the token stack and calculate the value
-		$cellValue = $this->_processTokenStack($this->_parseFormula($formula), $cellID, $pCell);
+		$cellValue = $this->_processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell);
 		array_pop($this->debugLogStack);
 
 		// Save to calculation cache
@@ -2462,31 +2462,24 @@ class PHPExcel_Calculation {
 			$value = array_pop($testArray);
 		}
 
-		switch (gettype($value)) {
-			case 'double'	:
-			case 'float'	:
-				$typeString = 'a floating point number';
-				break;
-			case 'integer'	:
-				$typeString = 'an integer number';
-				break;
-			case 'boolean'	:
-				$typeString = 'a boolean';
-				break;
-			case 'array'	:
-				$typeString = 'a matrix';
-				break;
-			case 'string'	:
-				if ($value == '') {
-					return 'an empty string';
-				} elseif ($value{0} == '#') {
-					return 'a '.$value.' error';
-				} else {
-					$typeString = 'a string';
-				}
-				break;
-			case 'NULL'	:
-				return 'a null value';
+		if (is_null($value)) {
+			return 'a null value';
+		} elseif (is_float($value)) {
+			$typeString = 'a floating point number';
+		} elseif(is_int($value)) {
+			$typeString = 'an integer number';
+		} elseif(is_bool($value)) {
+			$typeString = 'a boolean';
+		} elseif(is_array($value)) {
+			$typeString = 'a matrix';
+		} else {
+			if ($value == '') {
+				return 'an empty string';
+			} elseif ($value{0} == '#') {
+				return 'a '.$value.' error';
+			} else {
+				$typeString = 'a string';
+			}
 		}
 		return $typeString.' with a value of '.self::_showValue($value);
 	}	//	function _showTypeDetails()
@@ -2548,11 +2541,15 @@ class PHPExcel_Calculation {
 
 
 	// Convert infix to postfix notation
-	private function _parseFormula($formula) {
+	private function _parseFormula($formula, PHPExcel_Cell $pCell = null) {
 		if (($formula = self::_convertMatrixReferences(trim($formula))) === false) {
 			return false;
 		}
 
+		//	If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet),
+		//		so we store the parent worksheet so that we can re-attach it when necessary
+		$pCellParent = (!is_null($pCell)) ? $pCell->getParent() : null;
+
 		//	Binary Operators
 		//	These operators always work on two values
 		//	Array key is the operator, the value indicates whether this is a left or right associative operator
@@ -2774,12 +2771,56 @@ class PHPExcel_Calculation {
 //					echo 'Element '.$val.' is a Cell reference<br />';
 //					Watch for this case-change when modifying to allow cell references in different worksheets...
 //						Should only be applied to the actual cell column, not the worksheet name
+
+					//	If the last entry on the stack was a : operator, then we have a cell range reference
+					$testPrevOp = $stack->last(1);
+					if ($testPrevOp['value'] == ':') {
+						//	If we have a worksheet reference, then we're playing with a 3D reference
+						if ($matches[2] == '') {
+							//	Otherwise, we 'inherit' the worksheet reference from the start cell reference
+							//	The start of the cell range reference should be the last entry in $output
+							$startCellRef = $output[count($output)-1]['value'];
+							preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches);
+							if ($startMatches[2] > '') {
+								$val = $startMatches[2].'!'.$val;
+							}
+						}
+					}
 					$cellRef = strtoupper($val);
-//					$output[] = $cellRef;
+
 					$output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $cellRef);
 //					$expectingOperator = false;
 				} else {	// it's a variable, constant, string, number or boolean
 //					echo 'Element is a Variable, Constant, String, Number or Boolean<br />';
+					//	If the last entry on the stack was a : operator, then we may have a row or column range reference
+					$testPrevOp = $stack->last(1);
+					if ($testPrevOp['value'] == ':') {
+						$startRowColRef = $output[count($output)-1]['value'];
+						$rangeWS1 = '';
+						if (strpos('!',$startRowColRef) !== false) {
+							list($rangeWS1,$startRowColRef) = explode('!',$startRowColRef);
+						}
+						if ($rangeWS1 != '') $rangeWS1 .= '!';
+						$rangeWS2 = $rangeWS1;
+						if (strpos('!',$val) !== false) {
+							list($rangeWS2,$val) = explode('!',$val);
+						}
+						if ($rangeWS2 != '') $rangeWS2 .= '!';
+						if ((is_integer($startRowColRef)) && (ctype_digit($val)) &&
+							($startRowColRef <= 1048576) && ($val <= 1048576)) {
+							//	Row range
+							$endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestColumn() : 'XFD';	//	Max 16,384 columns for Excel2007
+							$output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef;
+							$val = $rangeWS2.$endRowColRef.$val;
+						} elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) &&
+							(strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) {
+							//	Column range
+							$endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestRow() : 1048576;		//	Max 1,048,576 rows for Excel2007
+							$output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1';
+							$val = $rangeWS2.$val.$endRowColRef;
+						}
+					}
+
 					$localeConstant = false;
 					if ($opCharacter == '"') {
 //						echo 'Element is a String<br />';
@@ -2808,6 +2849,8 @@ class PHPExcel_Calculation {
 				}
 				$index += $length;
 
+			} elseif ($opCharacter == '$') {	// absolute row or column range
+				$index++;
 			} elseif ($opCharacter == ')') {	// miscellaneous error checking
 				if ($expectingOperand) {
 					$output[] = array('type' => 'Null Value', 'value' => self::$_ExcelConstants['NULL'], 'reference' => NULL);
@@ -3067,7 +3110,7 @@ class PHPExcel_Calculation {
 								return $this->_raiseFormulaError('Unable to access Cell Reference');
 							}
 							$this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
-							$cellRef = $matches[2].'!'.$cellRef;
+//							$cellRef = $matches[2].'!'.$cellRef;
 						} else {
 //							echo '$cellRef='.$cellRef.' in current worksheet<br />';
 							$this->_writeDebug('Evaluating Cell Range '.$cellRef.' in current worksheet');
@@ -3101,7 +3144,7 @@ class PHPExcel_Calculation {
 								return $this->_raiseFormulaError('Unable to access Cell Reference');
 							}
 							$this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
-							$cellRef = $matches[2].'!'.$cellRef;
+//							$cellRef = $matches[2].'!'.$cellRef;
 						} else {
 //							echo '$cellRef='.$cellRef.' in current worksheet<br />';
 							$this->_writeDebug('Evaluating Cell '.$cellRef.' in current worksheet');
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
index 8e77b9d..b94f3f4 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
index 9956167..7050260 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
index 8fcde41..271aa75 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
index 69d7f42..8c1396e 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Function.php b/libraries/PHPExcel/PHPExcel/Calculation/Function.php
index 783e533..81dfc99 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Function.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Function.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Calculation
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
index 8ce3cfd..805f483 100644
--- a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
+++ b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Calculation
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
@@ -1885,7 +1885,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -1937,7 +1937,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -1984,7 +1984,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -2036,7 +2036,7 @@ class PHPExcel_Calculation_Functions {
 			}
 
 			// Return
-			if (($aCount > 0) && ($returnValue > 0)) {
+			if (($aCount > 0) && ($returnValue >= 0)) {
 				return sqrt($returnValue / $aCount);
 			}
 		}
@@ -5691,7 +5691,7 @@ class PHPExcel_Calculation_Functions {
 	 *	@return	string	Version information
 	 */
 	public static function VERSION() {
-		return 'PHPExcel 1.7.3c, 2010-06-01';
+		return 'PHPExcel 1.7.4, 2010-08-26';
 	}	//	function VERSION()
 
 
@@ -11139,112 +11139,101 @@ class PHPExcel_Calculation_Functions {
 	 *	@return	integer			The relative position of the found item
 	 */
 	public static function MATCH($lookup_value, $lookup_array, $match_type=1) {
-
-		// flatten the lookup_array
 		$lookup_array = self::flattenArray($lookup_array);
-
-		// flatten lookup_value since it may be a cell reference to a value or the value itself
 		$lookup_value = self::flattenSingleValue($lookup_value);
-
-		// MATCH is not case sensitive
+		$match_type	= (is_null($match_type)) ? 1 : (int) self::flattenSingleValue($match_type);
+		//	MATCH is not case sensitive
 		$lookup_value = strtolower($lookup_value);
 
-		/*
-		echo "--------------------<br>looking for $lookup_value in <br>";
-		print_r($lookup_array);
-		echo "<br>";
-		//return 1;
-		/**/
-
-		// **
-		// check inputs
-		// **
-		// lookup_value type has to be number, text, or logical values
-		if (!is_numeric($lookup_value) && !is_string($lookup_value) && !is_bool($lookup_value)){
-			// error: lookup_array should contain only number, text, or logical values
-			//echo "error: lookup_array should contain only number, text, or logical values<br>";
+		//	lookup_value type has to be number, text, or logical values
+		if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) {
 			return self::$_errorCodes['na'];
 		}
 
-		// match_type is 0, 1 or -1
-		if ($match_type!==0 && $match_type!==-1 && $match_type!==1){
-			// error: wrong value for match_type
-			//echo "error: wrong value for match_type<br>";
+		//	match_type is 0, 1 or -1
+		if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) {
 			return self::$_errorCodes['na'];
 		}
 
-		// lookup_array should not be empty
-		if (sizeof($lookup_array)<=0){
-			// error: empty range
-			//echo "error: empty range ".sizeof($lookup_array)."<br>";
+		//	lookup_array should not be empty
+		$lookupArraySize = count($lookup_array);
+		if ($lookupArraySize <= 0) {
 			return self::$_errorCodes['na'];
 		}
 
-		// lookup_array should contain only number, text, or logical values
-		for ($i=0;$i<sizeof($lookup_array);++$i){
-			// check the type of the value
-			if (!is_numeric($lookup_array[$i]) && !is_string($lookup_array[$i]) && !is_bool($lookup_array[$i])){
-				// error: lookup_array should contain only number, text, or logical values
-				//echo "error: lookup_array should contain only number, text, or logical values<br>";
+		//	lookup_array should contain only number, text, or logical values, or empty (null) cells
+		foreach($lookup_array as $i => $lookupArrayValue) {
+			//	check the type of the value
+			if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) &&
+				(!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) {
 				return self::$_errorCodes['na'];
 			}
-			// convert tpo lowercase
-			if (is_string($lookup_array[$i]))
-				$lookup_array[$i] = strtolower($lookup_array[$i]);
+			//	convert strings to lowercase for case-insensitive testing
+			if (is_string($lookupArrayValue)) {
+				$lookup_array[$i] = strtolower($lookupArrayValue);
+			}
+			if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) {
+				$lookup_array = array_slice($lookup_array,0,$i-1);
+			}
 		}
 
 		// if match_type is 1 or -1, the list has to be ordered
-		if($match_type==1 || $match_type==-1){
-			// **
-			// iniitialization
-			// store the last value
-			$iLastValue=$lookup_array[0];
-			// **
-			// loop on the cells
-			for ($i=0;$i<sizeof($lookup_array);++$i){
-				// check ascending order
-				if(($match_type==1 && $lookup_array[$i]<$iLastValue)
-					// OR check descending order
-					|| ($match_type==-1 && $lookup_array[$i]>$iLastValue)){
-					// error: list is not ordered correctly
-					//echo "error: list is not ordered correctly<br>";
-					return self::$_errorCodes['na'];
-				}
-			}
+		if ($match_type == 1) {
+			asort($lookup_array);
+			$keySet = array_keys($lookup_array);
+		} elseif($match_type == -1) {
+			arsort($lookup_array);
+			$keySet = array_keys($lookup_array);
 		}
+
 		// **
 		// find the match
 		// **
 		// loop on the cells
-		for ($i=0; $i < sizeof($lookup_array); ++$i){
-			// if match_type is 0 <=> find the first value that is exactly equal to lookup_value
-			if ($match_type==0 && $lookup_array[$i]==$lookup_value){
-				// this is the exact match
-				return $i+1;
-			}
-			// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value
-			if ($match_type==-1 && $lookup_array[$i] < $lookup_value){
-				if ($i<1){
+//		var_dump($lookup_array);
+//		echo '<br />';
+		foreach($lookup_array as $i => $lookupArrayValue) {
+			if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) {
+				//	exact match
+				return ++$i;
+			} elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) {
+//				echo '$i = '.$i.' => ';
+//				var_dump($lookupArrayValue);
+//				echo '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value
+				if ($i < 1){
 					// 1st cell was allready smaller than the lookup_value
 					break;
-				}
-				else
+				} else {
 					// the previous cell was the match
-					return $i;
-			}
-			// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value
-			if ($match_type==1 && $lookup_array[$i] > $lookup_value){
-				if ($i<1){
+					return $keySet[$i-1]+1;
+				}
+			} elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) {
+//				echo '$i = '.$i.' => ';
+//				var_dump($lookupArrayValue);
+//				echo '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// if match_type is 1 <=> find the largest value that is less than or equal to lookup_value
+				if ($i < 1){
 					// 1st cell was allready bigger than the lookup_value
 					break;
-				}
-				else
+				} else {
 					// the previous cell was the match
-					return $i;
+					return $keySet[$i-1]+1;
+				}
 			}
 		}
-		// unsuccessful in finding a match, return #N/A error value
-		//echo "unsuccessful in finding a match<br>";
+
+		//	unsuccessful in finding a match, return #N/A error value
 		return self::$_errorCodes['na'];
 	}	//	function MATCH()
 
@@ -11378,25 +11367,19 @@ class PHPExcel_Calculation_Functions {
 		}
 		$value	= self::flattenSingleValue($value);
 
-		switch (gettype($value)) {
-			case 'double'	:
-			case 'float'	:
-			case 'integer'	:
+		if ((is_float($value)) || (is_int($value))) {
 				return 1;
-				break;
-			case 'boolean'	:
+		} elseif(is_bool($value)) {
 				return 4;
-				break;
-			case 'array'	:
+		} elseif(is_array($value)) {
 				return 64;
 				break;
-			case 'string'	:
-				//	Errors
-				if ((strlen($value) > 0) && ($value{0} == '#')) {
-					return 16;
-				}
-				return 2;
-				break;
+		} elseif(is_string($value)) {
+			//	Errors
+			if ((strlen($value) > 0) && ($value{0} == '#')) {
+				return 16;
+			}
+			return 2;
 		}
 		return 0;
 	}	//	function TYPE()
diff --git a/libraries/PHPExcel/PHPExcel/Cell.php b/libraries/PHPExcel/PHPExcel/Cell.php
index f8ebf86..b805b8d 100644
--- a/libraries/PHPExcel/PHPExcel/Cell.php
+++ b/libraries/PHPExcel/PHPExcel/Cell.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Cell
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
@@ -91,6 +91,13 @@ class PHPExcel_Cell
 	 */
 	private $_xfIndex;
 
+	/**
+	 * Attributes of the formula
+	 *
+	 *
+	 */
+	private $_formulaAttributes;
+
 
 	/**
 	 * Send notification to the cache controller
@@ -98,6 +105,7 @@ class PHPExcel_Cell
 	 **/
 	public function notifyCacheController() {
 		$this->_parent->getCellCacheController()->updateCacheData($this);
+		return $this;
 	}
 
 	public function detach() {
@@ -112,11 +120,11 @@ class PHPExcel_Cell
 	/**
 	 * Create a new Cell
 	 *
-	 * @param 	string 				$pColumn
-	 * @param 	int 				$pRow
-	 * @param 	mixed 				$pValue
-	 * @param 	string 				$pDataType
-	 * @param 	PHPExcel_Worksheet	$pSheet
+	 * @param	string				$pColumn
+	 * @param	int				$pRow
+	 * @param	mixed				$pValue
+	 * @param	string				$pDataType
+	 * @param	PHPExcel_Worksheet	$pSheet
 	 * @throws	Exception
 	 */
 	public function __construct($pColumn = 'A', $pRow = 1, $pValue = null, $pDataType = null, PHPExcel_Worksheet $pSheet = null)
@@ -189,7 +197,7 @@ class PHPExcel_Cell
 	 *
 	 * This clears the cell formula.
 	 *
-	 * @param mixed 	$pValue					Value
+	 * @param mixed	$pValue					Value
 	 * @return PHPExcel_Cell
 	 */
 	public function setValue($pValue = null)
@@ -203,7 +211,7 @@ class PHPExcel_Cell
 	/**
 	 * Set cell value (with explicit data type given)
 	 *
-	 * @param mixed 	$pValue			Value
+	 * @param mixed	$pValue			Value
 	 * @param string	$pDataType		Explicit data type
 	 * @return PHPExcel_Cell
 	 * @throws Exception
@@ -242,8 +250,7 @@ class PHPExcel_Cell
 		// set the datatype
 		$this->_dataType = $pDataType;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -254,7 +261,7 @@ class PHPExcel_Cell
 	public function getCalculatedValue($resetLog=true)
 	{
 //		echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'<br />';
-		if (!is_null($this->_calculatedValue) && $this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
+		if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
 			try {
 //				echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value<br />';
 				$result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
@@ -262,28 +269,23 @@ class PHPExcel_Cell
 			} catch ( Exception $ex ) {
 //				echo 'Calculation Exception: '.$ex->getMessage().'<br />';
 				$result = '#N/A';
-				throw(new Exception($ex->getMessage()));
+				throw(new Exception($this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()));
 			}
 
-			if ((is_string($result)) && ($result == '#Not Yet Implemented')) {
+			if ($result === '#Not Yet Implemented') {
 //				echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />';
 				return $this->_calculatedValue; // Fallback if calculation engine does not support the formula.
-			} else {
-//				echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
-				return $result;
 			}
+//			echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
+			return $result;
 		}
 
 		if (is_null($this->_value)) {
 //			echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise<br />';
 			return null;
-		} else if ($this->_dataType != PHPExcel_Cell_DataType::TYPE_FORMULA) {
-//			echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
-			return $this->_value;
-		} else {
-//			echo 'Cell value is a formula: Calculating value<br />';
-			return PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
 		}
+//		echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
+		return $this->_value;
 	}
 
 	/**
@@ -298,8 +300,7 @@ class PHPExcel_Cell
 			$this->_calculatedValue = $pValue;
 		}
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -332,8 +333,7 @@ class PHPExcel_Cell
 	{
 		$this->_dataType = $pDataType;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
@@ -361,15 +361,14 @@ class PHPExcel_Cell
 			throw new Exception('Cannot get data validation for cell that is not bound to a worksheet');
 		}
 
-		$dataValidation = $this->_parent->getDataValidation($this->getCoordinate());
-		return $dataValidation;
+		return $this->_parent->getDataValidation($this->getCoordinate());
 	}
 
 	/**
 	 * Set Data validation
 	 *
-	 * @param 	PHPExcel_Cell_DataValidation	$pDataValidation
-	 * @throws 	Exception
+	 * @param	PHPExcel_Cell_DataValidation	$pDataValidation
+	 * @throws	Exception
 	 * @return PHPExcel_Cell
 	 */
 	public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = null)
@@ -380,45 +379,43 @@ class PHPExcel_Cell
 
 		$this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation);
 
-		$this->notifyCacheController();
-    	return $this;
+		return $this->notifyCacheController();
 	}
 
-    /**
-     * Has Hyperlink
-     *
-     * @return boolean
-     */
-    public function hasHyperlink()
-    {
+	/**
+	 * Has Hyperlink
+	 *
+	 * @return boolean
+	 */
+	public function hasHyperlink()
+	{
 		if (!isset($this->_parent)) {
 			throw new Exception('Cannot check for hyperlink when cell is not bound to a worksheet');
 		}
 
 		return $this->_parent->hyperlinkExists($this->getCoordinate());
-    }
-
-    /**
-     * Get Hyperlink
-     *
-     * @throws Exception
-     * @return PHPExcel_Cell_Hyperlink
-     */
-    public function getHyperlink()
-    {
+	}
+
+	/**
+	 * Get Hyperlink
+	 *
+	 * @throws Exception
+	 * @return PHPExcel_Cell_Hyperlink
+	 */
+	public function getHyperlink()
+	{
 		if (!isset($this->_parent)) {
 			throw new Exception('Cannot get hyperlink for cell that is not bound to a worksheet');
 		}
 
-		$hyperlink = $this->_parent->getHyperlink($this->getCoordinate());
-		return $hyperlink;
-    }
+		return $this->_parent->getHyperlink($this->getCoordinate());
+	}
 
 	/**
 	 * Set Hyperlink
 	 *
-	 * @param 	PHPExcel_Cell_Hyperlink	$pHyperlink
-	 * @throws 	Exception
+	 * @param	PHPExcel_Cell_Hyperlink	$pHyperlink
+	 * @throws	Exception
 	 * @return PHPExcel_Cell
 	 */
 	public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = null)
@@ -429,9 +426,8 @@ class PHPExcel_Cell
 
 		$this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink);
 
-		$this->notifyCacheController();
-    	return $this;
-    }
+		return $this->notifyCacheController();
+	}
 
 	/**
 	 * Get parent
@@ -451,94 +447,63 @@ class PHPExcel_Cell
 	public function rebindParent(PHPExcel_Worksheet $parent) {
 		$this->_parent = $parent;
 
-		$this->notifyCacheController();
-		return $this;
+		return $this->notifyCacheController();
 	}
 
 	/**
 	 * Is cell in a specific range?
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	boolean
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	boolean
 	 */
 	public function isInRange($pRange = 'A1:A1')
 	{
-		// Uppercase coordinate
-		$pRange = strtoupper($pRange);
-
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
-
-   		// Calculate range outer borders
-   		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
-   		$rangeEnd 	= PHPExcel_Cell::coordinateFromString($rangeB);
+		list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
 
-   		// Translate column into index
-   		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1;
-   		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1;
-
-   		// Translate properties
-		$myColumn		= PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1;
-		$myRow			= $this->getRow();
+		// Translate properties
+		$myColumn	= PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1;
+		$myRow		= $this->getRow();
 
 		// Verify if cell is in range
-		return (
-				($rangeStart[0] <= $myColumn && $rangeEnd[0] >= $myColumn) &&
-				($rangeStart[1] <= $myRow && $rangeEnd[1] >= $myRow)
-		);
+		return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) &&
+				($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow)
+			   );
 	}
 
 	/**
 	 * Coordinate from string
 	 *
-	 * @param 	string 	$pCoordinateString
-	 * @return 	array 	Array containing column and row (indexes 0 and 1)
+	 * @param	string	$pCoordinateString
+	 * @return	array	Array containing column and row (indexes 0 and 1)
 	 * @throws	Exception
 	 */
 	public static function coordinateFromString($pCoordinateString = 'A1')
 	{
 		if (strpos($pCoordinateString,':') !== false) {
 			throw new Exception('Cell coordinate string can not be a range of cells.');
-
 		} else if ($pCoordinateString == '') {
 			throw new Exception('Cell coordinate can not be zero-length string.');
-
 		} else if (preg_match("/([$]?[A-Z]+)([$]?\d+)/", $pCoordinateString, $matches)) {
 			list(, $column, $row) = $matches;
 			return array($column, $row);
-
 		} else {
 			throw new Exception('Invalid cell coordinate.');
-
 		}
 	}
 
 	/**
 	 * Make string coordinate absolute
 	 *
-	 * @param 	string 	$pCoordinateString
-	 * @return 	string	Absolute coordinate
+	 * @param	string	$pCoordinateString
+	 * @return	string	Absolute coordinate
 	 * @throws	Exception
 	 */
 	public static function absoluteCoordinate($pCoordinateString = 'A1')
 	{
 		if (strpos($pCoordinateString,':') === false && strpos($pCoordinateString,',') === false) {
-			// Return value
-			$returnValue = '';
-
 			// Create absolute coordinate
 			list($column, $row) = PHPExcel_Cell::coordinateFromString($pCoordinateString);
-			$returnValue = '$' . $column . '$' . $row;
-
-			// Return
-			return $returnValue;
+			return '$' . $column . '$' . $row;
 		} else {
 			throw new Exception("Coordinate string should not be a cell range.");
 		}
@@ -547,8 +512,8 @@ class PHPExcel_Cell
 	/**
 	 * Split range into coordinate strings
 	 *
-	 * @param 	string 	$pRange
-	 * @return 	array	Array containg one or more arrays containing one or two coordinate strings
+	 * @param	string	$pRange
+	 * @return	array	Array containg one or more arrays containing one or two coordinate strings
 	 */
 	public static function splitRange($pRange = 'A1:A1')
 	{
@@ -562,7 +527,7 @@ class PHPExcel_Cell
 	/**
 	 * Build range from coordinate strings
 	 *
-	 * @param 	array	$pRange	Array containg one or more arrays containing one or two coordinate strings
+	 * @param	array	$pRange	Array containg one or more arrays containing one or two coordinate strings
 	 * @return  string	String representation of $pRange
 	 * @throws	Exception
 	 */
@@ -584,67 +549,76 @@ class PHPExcel_Cell
 	}
 
 	/**
-	 * Calculate range dimension
+	 * Calculate range boundaries
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	array	Range dimension (width, height)
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range coordinates (Start Cell, End Cell) where Start Cell and End Cell are arrays (Column Number, Row Number)
 	 */
-	public static function rangeDimension($pRange = 'A1:A1')
+	public static function rangeBoundaries($pRange = 'A1:A1')
 	{
 		// Uppercase coordinate
 		$pRange = strtoupper($pRange);
 
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
+		// Extract range
+		if (strpos($pRange, ':') === false) {
+			$rangeA = $rangeB = $pRange;
+		} else {
+			list($rangeA, $rangeB) = explode(':', $pRange);
+		}
 
-   		// Calculate range outer borders
-   		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
-   		$rangeEnd 	= PHPExcel_Cell::coordinateFromString($rangeB);
+		// Calculate range outer borders
+		$rangeStart = PHPExcel_Cell::coordinateFromString($rangeA);
+		$rangeEnd	= PHPExcel_Cell::coordinateFromString($rangeB);
 
-   		// Translate column into index
-   		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]);
-   		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]);
+		// Translate column into index
+		$rangeStart[0]	= PHPExcel_Cell::columnIndexFromString($rangeStart[0]);
+		$rangeEnd[0]	= PHPExcel_Cell::columnIndexFromString($rangeEnd[0]);
 
-   		return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );
+		return array($rangeStart, $rangeEnd);
+	}
+
+	/**
+	 * Calculate range dimension
+	 *
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range dimension (width, height)
+	 */
+	public static function rangeDimension($pRange = 'A1:A1')
+	{
+		// Calculate range outer borders
+		list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
+
+		return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) );
 	}
 
 	/**
 	 * Calculate range boundaries
 	 *
-	 * @param 	string 	$pRange		Cell range (e.g. A1:A1)
-	 * @return 	array	Range boundaries (staring Column, starting Row, Final Column, Final Row)
+	 * @param	string	$pRange		Cell range (e.g. A1:A1)
+	 * @return	array	Range boundaries (staring Column, starting Row, Final Column, Final Row)
 	 */
 	public static function getRangeBoundaries($pRange = 'A1:A1')
 	{
 		// Uppercase coordinate
 		$pRange = strtoupper($pRange);
 
-   		// Extract range
-   		$rangeA 	= '';
-   		$rangeB 	= '';
-   		if (strpos($pRange, ':') === false) {
-   			$rangeA = $pRange;
-   			$rangeB = $pRange;
-   		} else {
-   			list($rangeA, $rangeB) = explode(':', $pRange);
-   		}
+		// Extract range
+		if (strpos($pRange, ':') === false) {
+			$rangeA = $pRange;
+			$rangeB = $pRange;
+		} else {
+			list($rangeA, $rangeB) = explode(':', $pRange);
+		}
 
-   		return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));
+		return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB));
 	}
 
 	/**
 	 * Column index from string
 	 *
-	 * @param 	string $pString
-	 * @return 	int Column index (base 1 !!!)
-	 * @throws 	Exception
+	 * @param	string $pString
+	 * @return	int Column index (base 1 !!!)
+	 * @throws	Exception
 	 */
 	public static function columnIndexFromString($pString = 'A')
 	{
@@ -684,14 +658,14 @@ class PHPExcel_Cell
 		if ($pColumnIndex < 26) {
 			return chr(65 + $pColumnIndex);
 		}
-	   	return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ;
+		return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ;
 	}
 
 	/**
 	 * Extract all cell references in range
 	 *
-	 * @param 	string 	$pRange		Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000)
-	 * @return 	array	Array containing single cell references
+	 * @param	string	$pRange		Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000)
+	 * @return	array	Array containing single cell references
 	 */
 	public static function extractAllCellReferencesInRange($pRange = 'A1') {
 		// Returnvalue
@@ -731,17 +705,17 @@ class PHPExcel_Cell
 				$rangeStart		= $rangeEnd		= '';
 				$startingCol	= $startingRow	= $endingCol	= $endingRow	= 0;
 
-				list($rangeStart, $rangeEnd) 		= $range[$i];
+				list($rangeStart, $rangeEnd)		= $range[$i];
 				list($startingCol, $startingRow)	= PHPExcel_Cell::coordinateFromString($rangeStart);
-				list($endingCol, $endingRow) 	 	= PHPExcel_Cell::coordinateFromString($rangeEnd);
+				list($endingCol, $endingRow)		= PHPExcel_Cell::coordinateFromString($rangeEnd);
 
 				// Conversions...
-				$startingCol 	= PHPExcel_Cell::columnIndexFromString($startingCol);
-				$endingCol 		= PHPExcel_Cell::columnIndexFromString($endingCol);
+				$startingCol	= PHPExcel_Cell::columnIndexFromString($startingCol);
+				$endingCol		= PHPExcel_Cell::columnIndexFromString($endingCol);
 
 				// Current data
-				$currentCol 	= --$startingCol;
-				$currentRow 	= $startingRow;
+				$currentCol	= --$startingCol;
+				$currentRow	= $startingRow;
 
 				// Loop cells
 				while ($currentCol < $endingCol) {
@@ -763,9 +737,9 @@ class PHPExcel_Cell
 	/**
 	 * Compare 2 cells
 	 *
-	 * @param 	PHPExcel_Cell	$a	Cell a
-	 * @param 	PHPExcel_Cell	$a	Cell b
-	 * @return 	int		Result of comparison (always -1 or 1, never zero!)
+	 * @param	PHPExcel_Cell	$a	Cell a
+	 * @param	PHPExcel_Cell	$a	Cell b
+	 * @return	int		Result of comparison (always -1 or 1, never zero!)
 	 */
 	public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b)
 	{
@@ -813,7 +787,7 @@ class PHPExcel_Cell
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
@@ -841,8 +815,20 @@ class PHPExcel_Cell
 	{
 		$this->_xfIndex = $pValue;
 
-		$this->notifyCacheController();
+		return $this->notifyCacheController();
+	}
+
+
+	public function setFormulaAttributes($pAttributes)
+	{
+		$this->_formulaAttributes = $pAttributes;
 		return $this;
 	}
 
+	public function getFormulaAttributes()
+	{
+		return $this->_formulaAttributes;
+	}
+
 }
+
diff --git a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
index 7e305c5..5126811 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataType.php b/libraries/PHPExcel/PHPExcel/Cell/DataType.php
index 1496d83..d542cab 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DataType.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DataType.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
index 2c3913c..db1b497 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
index e49449f..ad5ae46 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
index eab9297..994cef5 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
index 4bd1ef2..c14d630 100644
--- a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
+++ b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Cell
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Comment.php b/libraries/PHPExcel/PHPExcel/Comment.php
index 735e78c..432cfe1 100644
--- a/libraries/PHPExcel/PHPExcel/Comment.php
+++ b/libraries/PHPExcel/PHPExcel/Comment.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/DocumentProperties.php b/libraries/PHPExcel/PHPExcel/DocumentProperties.php
index 64b0c2a..d6d928e 100644
--- a/libraries/PHPExcel/PHPExcel/DocumentProperties.php
+++ b/libraries/PHPExcel/PHPExcel/DocumentProperties.php
@@ -8,12 +8,12 @@
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -41,70 +41,70 @@ class PHPExcel_DocumentProperties
 	 * @var string
 	 */
 	private $_creator;
-	
+
 	/**
 	 * LastModifiedBy
 	 *
 	 * @var string
 	 */
 	private $_lastModifiedBy;
-	
+
 	/**
 	 * Created
 	 *
 	 * @var datetime
 	 */
 	private $_created;
-	
+
 	/**
 	 * Modified
 	 *
 	 * @var datetime
 	 */
 	private $_modified;
-	
+
 	/**
 	 * Title
 	 *
 	 * @var string
 	 */
 	private $_title;
-	
+
 	/**
 	 * Description
 	 *
 	 * @var string
 	 */
 	private $_description;
-	
+
 	/**
 	 * Subject
 	 *
 	 * @var string
 	 */
 	private $_subject;
-	
+
 	/**
 	 * Keywords
 	 *
 	 * @var string
 	 */
 	private $_keywords;
-	
+
 	/**
 	 * Category
 	 *
 	 * @var string
 	 */
 	private $_category;
-	
+
 	/**
 	 * Company
-	 * 
+	 *
 	 * @var string
 	 */
 	private $_company;
-	
+
     /**
      * Create a new PHPExcel_DocumentProperties
      */
@@ -120,9 +120,10 @@ class PHPExcel_DocumentProperties
     	$this->_description		= '';
     	$this->_keywords		= '';
     	$this->_category		= '';
+    	$this->_manager			= '';
     	$this->_company 		= 'Microsoft Corporation';
     }
-    
+
     /**
      * Get Creator
      *
@@ -131,7 +132,7 @@ class PHPExcel_DocumentProperties
     public function getCreator() {
     	return $this->_creator;
     }
-    
+
     /**
      * Set Creator
      *
@@ -142,7 +143,7 @@ class PHPExcel_DocumentProperties
     	$this->_creator = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Last Modified By
      *
@@ -151,7 +152,7 @@ class PHPExcel_DocumentProperties
     public function getLastModifiedBy() {
     	return $this->_lastModifiedBy;
     }
-    
+
     /**
      * Set Last Modified By
      *
@@ -162,7 +163,7 @@ class PHPExcel_DocumentProperties
     	$this->_lastModifiedBy = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Created
      *
@@ -171,7 +172,7 @@ class PHPExcel_DocumentProperties
     public function getCreated() {
     	return $this->_created;
     }
-    
+
     /**
      * Set Created
      *
@@ -185,7 +186,7 @@ class PHPExcel_DocumentProperties
     	$this->_created = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Modified
      *
@@ -194,7 +195,7 @@ class PHPExcel_DocumentProperties
     public function getModified() {
     	return $this->_modified;
     }
-    
+
     /**
      * Set Modified
      *
@@ -208,7 +209,7 @@ class PHPExcel_DocumentProperties
     	$this->_modified = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Title
      *
@@ -217,7 +218,7 @@ class PHPExcel_DocumentProperties
     public function getTitle() {
     	return $this->_title;
     }
-    
+
     /**
      * Set Title
      *
@@ -228,7 +229,7 @@ class PHPExcel_DocumentProperties
     	$this->_title = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Description
      *
@@ -237,7 +238,7 @@ class PHPExcel_DocumentProperties
     public function getDescription() {
     	return $this->_description;
     }
-    
+
     /**
      * Set Description
      *
@@ -248,7 +249,7 @@ class PHPExcel_DocumentProperties
     	$this->_description = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Subject
      *
@@ -257,7 +258,7 @@ class PHPExcel_DocumentProperties
     public function getSubject() {
     	return $this->_subject;
     }
-    
+
     /**
      * Set Subject
      *
@@ -268,7 +269,7 @@ class PHPExcel_DocumentProperties
     	$this->_subject = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Keywords
      *
@@ -277,7 +278,7 @@ class PHPExcel_DocumentProperties
     public function getKeywords() {
     	return $this->_keywords;
     }
-    
+
     /**
      * Set Keywords
      *
@@ -288,7 +289,7 @@ class PHPExcel_DocumentProperties
     	$this->_keywords = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Category
      *
@@ -297,7 +298,7 @@ class PHPExcel_DocumentProperties
     public function getCategory() {
     	return $this->_category;
     }
-    
+
     /**
      * Set Category
      *
@@ -308,7 +309,7 @@ class PHPExcel_DocumentProperties
     	$this->_category = $pValue;
     	return $this;
     }
-    
+
     /**
      * Get Company
      *
@@ -317,18 +318,38 @@ class PHPExcel_DocumentProperties
     public function getCompany() {
     	return $this->_company;
     }
-    
+
     /**
      * Set Company
      *
      * @param string $pValue
-     * @return PHPPowerPoint_DocumentProperties
+     * @return PHPExcel_DocumentProperties
      */
     public function setCompany($pValue = '') {
     	$this->_company = $pValue;
     	return $this;
     }
-        
+
+    /**
+     * Get Manager
+     *
+     * @return string
+     */
+    public function getManager() {
+    	return $this->_manager;
+    }
+
+    /**
+     * Set Manager
+     *
+     * @param string $pValue
+     * @return PHPExcel_DocumentProperties
+     */
+    public function setManager($pValue = '') {
+    	$this->_manager = $pValue;
+    	return $this;
+    }
+
 	/**
 	 * Implement PHP __clone to create a deep clone, not just a shallow copy.
 	 */
diff --git a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
index 1522189..a6de9ee 100644
--- a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
+++ b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/HashTable.php b/libraries/PHPExcel/PHPExcel/HashTable.php
index bd526b6..2191672 100644
--- a/libraries/PHPExcel/PHPExcel/HashTable.php
+++ b/libraries/PHPExcel/PHPExcel/HashTable.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/IComparable.php b/libraries/PHPExcel/PHPExcel/IComparable.php
index 3c175d1..0a51b06 100644
--- a/libraries/PHPExcel/PHPExcel/IComparable.php
+++ b/libraries/PHPExcel/PHPExcel/IComparable.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/IOFactory.php b/libraries/PHPExcel/PHPExcel/IOFactory.php
index 21fd23c..a3650be 100644
--- a/libraries/PHPExcel/PHPExcel/IOFactory.php
+++ b/libraries/PHPExcel/PHPExcel/IOFactory.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/NamedRange.php b/libraries/PHPExcel/PHPExcel/NamedRange.php
index 1aa5236..992c2fa 100644
--- a/libraries/PHPExcel/PHPExcel/NamedRange.php
+++ b/libraries/PHPExcel/PHPExcel/NamedRange.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/CSV.php b/libraries/PHPExcel/PHPExcel/Reader/CSV.php
index 5fa83bd..086c948 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/CSV.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/CSV.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
index c6620e7..e83ac9a 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
index 96e3436..99f00ed 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -557,6 +557,11 @@ class PHPExcel_Reader_Excel2003XML implements PHPExcel_Reader_IReader
 					$cellDataFormula = '';
 					if (isset($cell_ss['Formula'])) {
 						$cellDataFormula = $cell_ss['Formula'];
+						// added this as a check for array formulas
+						if (isset($cell_ss['ArrayRange'])) {
+							$cellDataCSEFormula = $cell_ss['ArrayRange'];
+//							echo "found an array formula at ".$columnID.$rowID."<br />";
+						}
 						$hasCalculatedValue = true;
 					}
 					if (isset($cell->Data)) {
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
index 031dee5..c4e3e41 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -71,6 +71,9 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 	 */
 	private $_readFilter = null;
 
+
+	private $_referenceHelper = null;
+
 	/**
 	 * Read data only?
 	 *
@@ -150,6 +153,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 	 */
 	public function __construct() {
 		$this->_readFilter = new PHPExcel_Reader_DefaultReadFilter();
+		$this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance();
 	}
 
 	/**
@@ -245,12 +249,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 				$difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]);
 				$difference[1] = $current[1] - $master[1];
 
-				$helper = PHPExcel_ReferenceHelper::getInstance();
-				$value = $helper->updateFormulaReferences(	$sharedFormulas[$instance]['formula'],
-															'A1',
-															$difference[0],
-															$difference[1]
-														 );
+				$value = $this->_referenceHelper->updateFormulaReferences(	$sharedFormulas[$instance]['formula'],
+																			'A1',
+																			$difference[0],
+																			$difference[1]
+																		 );
 //				echo 'Adjusted Formula is '.$value.'<br />';
 			}
 		}
@@ -311,7 +314,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 			switch ($rel["Type"]) {
 				case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-…":
 					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
-					if ($xmlCore) {
+					if (is_object($xmlCore)) {
 						$xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/");
 						$xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/");
 						$xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");
@@ -328,6 +331,25 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 					}
 				break;
 
+				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extende…":
+					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
+					if (is_object($xmlCore)) {
+						$docProps = $excel->getProperties();
+						if (isset($xmlCore->Company))
+							$docProps->setCompany((string) $xmlCore->Company);
+						if (isset($xmlCore->Manager))
+							$docProps->setManager((string) $xmlCore->Manager);
+					}
+				break;
+
+				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-…":
+					$xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}"));
+					if (is_object($xmlCore)) {
+						$xmlCore->registerXPathNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
+						$docProps = $excel->getProperties();
+					}
+				break;
+
 				case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeD…":
 					$dir = dirname($rel["Target"]);
 					$relsWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels"));  //~ http://schemas.openxmlformats.org/package/2006/relationships");
@@ -692,6 +714,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 												} else {
 													// Formula
 													$this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToBool');
+													if (isset($c->f['t'])) {
+														$att = array();
+														$att = $c->f;
+														$docSheet->getCell($r)->setFormulaAttributes($att);
+													}
 	//												echo '$calculatedValue = '.$calculatedValue.'<br />';
 												}
 												break;
@@ -1276,10 +1303,14 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
 												break;
 
 											case '_xlnm.Print_Area':
-												$range = explode('!', $extractedRange);
-												$extractedRange = isset($range[1]) ? $range[1] : $range[0];
-
-												$docSheet->getPageSetup()->setPrintArea($extractedRange);
+												$rangeSets = explode(',', $extractedRange);		// FIXME: what if sheetname contains comma?
+												$newRangeSets = array();
+												for
each($rangeSets as $rangeSet) {
+													$range = explode('!', $rangeSet);	// FIXME: what if sheetname contains exclamation mark?
+													$rangeSet = isset($range[1]) ? $range[1] : $range[0];
+													$newRangeSets[] = str_replace('$', '', $rangeSet);
+												}
+												$docSheet->getPageSetup()->setPrintArea(implode(',',$newRangeSets));
 												break;
 
 											default:
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
index a4f20e7..5c71ee8 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of ParseXL (used as the base for this class):
@@ -834,7 +834,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 						//		Foo!$C$7:$J$66
 						//		Bar!$A$1:$IV$2
 
-						$explodes = explode('!', $range);
+						$explodes = explode('!', $range);	// FIXME: what if sheetname contains exclamation mark?
 						$sheetName = $explodes[0];
 
 						if (count($explodes) == 2) {
@@ -4202,22 +4202,22 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// 1. BITMAPCOREHEADER
 			// offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure
 			$bcSize = $this->_GetInt4d($iData, 0);
-			var_dump($bcSize);
+//			var_dump($bcSize);
 
 			// offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels
 			$bcWidth = $this->_GetInt2d($iData, 4);
-			var_dump($bcWidth);
+//			var_dump($bcWidth);
 
 			// offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels.
 			$bcHeight = $this->_GetInt2d($iData, 6);
-			var_dump($bcHeight);
+//			var_dump($bcHeight);
 			$ih = imagecreatetruecolor($bcWidth, $bcHeight);
 
 			// offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1
 
 			// offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24
 			$bcBitCount = $this->_GetInt2d($iData, 10);
-			var_dump($bcBitCount);
+//			var_dump($bcBitCount);
 
 			$rgbString = substr($iData, 12);
 			$rgbTriples = array();
@@ -4602,24 +4602,24 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 		case 0x12: $name = 'tUplus';	$size = 1;	$data = '+';	break;
 		case 0x13: $name = 'tUminus';	$size = 1;	$data = '-';	break;
 		case 0x14: $name = 'tPercent';	$size = 1;	$data = '%';	break;
-		case 0x15: // parenthesis
+		case 0x15:	//	parenthesis
 			$name  = 'tParen';
 			$size  = 1;
 			$data = null;
 			break;
-		case 0x16: // missing argument
+		case 0x16:	//	missing argument
 			$name = 'tMissArg';
 			$size = 1;
 			$data = '';
 			break;
-		case 0x17: // string
+		case 0x17:	//	string
 			$name = 'tStr';
 			// offset: 1; size: var; Unicode string, 8-bit string length
 			$string = $this->_readUnicodeStringShort(substr($formulaData, 1));
 			$size = 1 + $string['size'];
 			$data = $this->_UTF8toExcelDoubleQuoted($string['value']);
 			break;
-		case 0x19: // Special attribute
+		case 0x19:	//	Special attribute
 			// offset: 1; size: 1; attribute type flags:
 			switch (ord($formulaData[1])) {
 			case 0x01:
@@ -4689,39 +4689,42 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				break;
 			}
 			break;
-		case 0x1C: // error code
+		case 0x1C:	//	error code
 			// offset: 1; size: 1; error code
 			$name = 'tErr';
 			$size = 2;
 			$data = $this->_mapErrorCode(ord($formulaData[1]));
 			break;
-		case 0x1D: // boolean
+		case 0x1D:	//	boolean
 			// offset: 1; size: 1; 0 = false, 1 = true;
 			$name = 'tBool';
 			$size = 2;
 			$data = ord($formulaData[1]) ? 'TRUE' : 'FALSE';
 			break;
-		case 0x1E: // integer
+		case 0x1E:	//	integer
 			// offset: 1; size: 2; unsigned 16-bit integer
 			$name = 'tInt';
 			$size = 3;
 			$data = $this->_GetInt2d($formulaData, 1);
 			break;
-		case 0x1F: // number
+		case 0x1F:	//	number
 			// offset: 1; size: 8;
 			$name = 'tNum';
 			$size = 9;
 			$data = $this->_extractNumber(substr($formulaData, 1));
 			$data = str_replace(',', '.', (string)$data); // in case non-English locale
 			break;
-		case 0x40: // array constant
-		case 0x60: // array constant
+		case 0x20:	//	array constant
+		case 0x40:
+		case 0x60:
 			// offset: 1; size: 7; not used
 			$name = 'tArray';
 			$size = 8;
 			$data = null;
 			break;
-		case 0x41: // function with fixed number of arguments
+		case 0x21:	//	function with fixed number of arguments
+		case 0x41:
+		case 0x61:
 			$name = 'tFunc';
 			$size = 3;
 			// offset: 1; size: 2; index to built-in sheet function
@@ -4891,9 +4894,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			}
 			$data = array('function' => $function, 'args' => $args);
 			break;
-		case 0x22: // function with variable number of arguments
-		case 0x42: // function with variable number of arguments
-		case 0x62: // function with variable number of arguments
+		case 0x22:	//	function with variable number of arguments
+		case 0x42:
+		case 0x62:
 			$name = 'tFuncV';
 			$size = 4;
 			// offset: 1; size: 1; number of arguments
@@ -4995,8 +4998,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			}
 			$data = array('function' => $function, 'args' => $args);
 			break;
-		case 0x23: // index to defined name
+		case 0x23:	//	index to defined name
 		case 0x43:
+		case 0x63:
 			$name = 'tName';
 			$size = 5;
 			// offset: 1; size: 2; one-based index to definedname record
@@ -5004,22 +5008,23 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// offset: 2; size: 2; not used
 			$data = $this->_definedname[$definedNameIndex]['name'];
 			break;
-		case 0x24: // single cell reference e.g. A5
+		case 0x24:	//	single cell reference e.g. A5
 		case 0x44:
 		case 0x64:
 			$name = 'tRef';
 			$size = 5;
 			$data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4));
 			break;
-		case 0x25: // cell range reference to cells in the same sheet
+		case 0x25:	//	cell range reference to cells in the same sheet (2d)
 		case 0x45:
 		case 0x65:
 			$name = 'tArea';
 			$size = 9;
 			$data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8));
 			break;
-		case 0x26:
+		case 0x26:	//	Constant reference sub-expression
 		case 0x46:
+		case 0x66:
 			$name = 'tMemArea';
 			// offset: 1; size: 4; not used
 			// offset: 5; size: 2; size of the following subexpression
@@ -5027,7 +5032,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$size = 7 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
 			break;
+		case 0x27:	//	Deleted constant reference sub-expression
 		case 0x47:
+		case 0x67:
 			$name = 'tMemErr';
 			// offset: 1; size: 4; not used
 			// offset: 5; size: 2; size of the following subexpression
@@ -5035,16 +5042,17 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$size = 7 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize));
 			break;
-		case 0x29:
+		case 0x29:	//	Variable reference sub-expression
 		case 0x49:
+		case 0x69:
 			$name = 'tMemFunc';
-			// offset: 1; size: 2; size of the following subexpression
+			// offset: 1; size: 2; size of the following sub-expression
 			$subSize = $this->_GetInt2d($formulaData, 1);
 			$size = 3 + $subSize;
 			$data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize));
 			break;
 
-		case 0x2C: // Relative reference, used in shared formulas and some other places
+		case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places
 		case 0x4C:
 		case 0x6C:
 			$name = 'tRefN';
@@ -5052,7 +5060,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell);
 			break;
 
-		case 0x2D:
+		case 0x2D:	//	Relative 2d range reference
 		case 0x4D:
 		case 0x6D:
 			$name = 'tAreaN';
@@ -5060,7 +5068,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			$data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell);
 			break;
 
-		case 0x39:
+		case 0x39:	//	External name
 		case 0x59:
 		case 0x79:
 			$name = 'tNameX';
@@ -5073,8 +5081,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 			// offset: 5; size: 2; not used
 			break;
 
-		case 0x3A: // 3d reference to cell
+		case 0x3A:	//	3d reference to cell
 		case 0x5A:
+		case 0x7A:
 			$name = 'tRef3d';
 			$size = 7;
 
@@ -5085,15 +5094,15 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				$cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4));
 
 				$data = "$sheetRange!$cellAddress";
-
 			} catch (Exception $e) {
 				// deleted sheet reference
 				$data = '#REF!';
 			}
 
 			break;
-		case 0x3B: // 3d reference to cell range
+		case 0x3B:	//	3d reference to cell range
 		case 0x5B:
+		case 0x7B:
 			$name = 'tArea3d';
 			$size = 11;
 
@@ -5104,15 +5113,13 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader
 				$cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8));
 
 				$data = "$sheetRange!$cellRangeAddress";
-
 			} catch (Exception $e) {
 				// deleted sheet reference
 				$data = '#REF!';
-
 			}
 
 			break;
-		// case 0x39: // don't know how to deal with
+		// Unknown cases	// don't know how to deal with
 		default:
 			throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');
 			break;
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
index 0418dd7..b7c67e9 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
index c397d56..00fa2e8 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReader.php b/libraries/PHPExcel/PHPExcel/Reader/IReader.php
index ef5beac..e1cdc43 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/IReader.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/IReader.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
index 8a1407a..a1ddf91 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -242,6 +242,9 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 			throw new Exception("Could not open " . $pFilename . " for reading! File does not exist.");
 		}
 
+		$timezoneObj = new DateTimeZone('Europe/London');
+		$GMT = new DateTimeZone('UTC');
+
 		$zip = new ZipArchive;
 		if ($zip->open($pFilename) === true) {
 //			echo '<h1>Meta Information</h1>';
@@ -338,6 +341,11 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 					foreach($worksheetData as $key => $rowData) {
 //						echo '<b>'.$key.'</b><br />';
 						switch ($key) {
+							case 'table-header-rows':
+								foreach ($rowData as $key=>$cellData) {
+									$rowData = $cellData;
+									break;
+								}
 							case 'table-row' :
 								$columnID = 'A';
 								foreach($rowData as $key => $cellData) {
@@ -387,7 +395,8 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 													break;
 											case 'date' :
 													$type = PHPExcel_Cell_DataType::TYPE_NUMERIC;
-													$dateObj = date_create($cellDataOfficeAttributes['date-value']);
+												    $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT);
+													$dateObj->setTimeZone($timezoneObj);
 													list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s'));
 													$dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second);
 													if ($dataValue != floor($dataValue)) {
@@ -418,7 +427,7 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 											if (($key % 2) == 0) {
 												$value = preg_replace('/\[\.(.*):\.(.*)\]/Ui','$1:$2',$value);
 												$value = preg_replace('/\[\.(.*)\]/Ui','$1',$value);
-												$value = PHPExcel_Calculation::_translateSeparator(';',',',$value);
+												$value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces);
 											}
 										}
 										unset($value);
diff --git a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
index ec8a4d4..790aa2f 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
index 88f2892..04b14f2 100644
--- a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
+++ b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Reader
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
index cb9673c..7a37ed0 100644
--- a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
+++ b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -35,6 +35,13 @@
  */
 class PHPExcel_ReferenceHelper
 {
+	/**	Constants				*/
+	/**	Regular Expressions		*/
+	const REFHELPER_REGEXP_CELLREF		= '((\w*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])';
+	const REFHELPER_REGEXP_CELLRANGE	= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)';
+	const REFHELPER_REGEXP_ROWRANGE		= '((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)';
+	const REFHELPER_REGEXP_COLRANGE		= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})';
+
 	/**
 	 * Instance of this class
 	 *
@@ -119,10 +126,8 @@ class PHPExcel_ReferenceHelper
 			$newCoordinates = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1 + $pNumCols ) . ($cell->getRow() + $pNumRows);
 
 			// Should the cell be updated? Move value and cellXf index from one cell to another.
-			if (
-					(PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) &&
-					($cell->getRow() >= $beforeRow)
-				 ) {
+			if ((PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) &&
+				($cell->getRow() >= $beforeRow)) {
 
 				// Update cell styles
 				$pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex());
@@ -132,7 +137,7 @@ class PHPExcel_ReferenceHelper
 				if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) {
 					// Formula should be adjusted
 					$pSheet->getCell($newCoordinates)
-						->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows));
+						   ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle()));
 				} else {
 					// Formula should not be adjusted
 					$pSheet->getCell($newCoordinates)->setValue($cell->getValue());
@@ -340,43 +345,121 @@ class PHPExcel_ReferenceHelper
 	 * @return	string	Updated formula
 	 * @throws	Exception
 	 */
-	public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) {
-		// Parse formula into a tree of tokens
-		$tokenisedFormula = PHPExcel_Calculation::getInstance()->parseFormula($pFormula);
-
-		$newCellTokens = $cellTokens = array();
-		$adjustCount = 0;
-		//	Build the translation table of cell tokens
-		foreach($tokenisedFormula as $token) {
-			$token = $token['value'];
-			if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) {
-				list($column,$row) = PHPExcel_Cell::coordinateFromString($token);
-				//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
-				$column = PHPExcel_Cell::columnIndexFromString($column) + 100000;
-				$row += 10000000;
-				$cellIndex = $column.$row;
-				if (!isset($cellTokens[$cellIndex])) {
-					$newReference = $this->updateCellReference($token, $pBefore, $pNumCols, $pNumRows);
-					if ($newReference !== $token) {
-						$newCellTokens[$cellIndex] = preg_quote($newReference);
-						$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($token).'(?!\d)/i';
-						++$adjustCount;
-					}
-				}
-			}
-		}
-		if ($adjustCount == 0) {
-			return $pFormula;
-		}
-		krsort($cellTokens);
-		krsort($newCellTokens);
-
+	public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') {
 		//	Update cell references in the formula
 		$formulaBlocks = explode('"',$pFormula);
 		foreach($formulaBlocks as $i => &$formulaBlock) {
-			//	Only count/replace in alternate array entries
+			//	Ignore blocks that were enclosed in quotes (even entries in the $formulaBlocks array after the explode)
 			if (($i % 2) == 0) {
-				$formulaBlock = preg_replace($cellTokens,$newCellTokens,$formulaBlock);
+				$adjustCount = 0;
+				$newCellTokens = $cellTokens = array();
+				//	Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = substr($this->updateCellReference('$A'.$match[3],$pBefore,$pNumCols,$pNumRows),2);
+						$modified4 = substr($this->updateCellReference('$A'.$match[4],$pBefore,$pNumCols,$pNumRows),2);
+
+						if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = 100000;
+								$row = 10000000+trim($match[3],'$');
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<!\d)'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = substr($this->updateCellReference($match[3].'$1',$pBefore,$pNumCols,$pNumRows),0,-2);
+						$modified4 = substr($this->updateCellReference($match[4].'$1',$pBefore,$pNumCols,$pNumRows),0,-2);
+
+						if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($match[3],'$')) + 100000;
+								$row = 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?![A-Z])/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3].':'.$match[4];
+						$modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows);
+						$modified4 = $this->updateCellReference($match[4],$pBefore,$pNumCols,$pNumRows);
+
+						if ($match[3].$match[4] !== $modified3.$modified4) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3.':'.$modified4;
+								list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]);
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000;
+								$row = trim($row,'$') + 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 0) {
+					foreach($matches as $match) {
+						$fromString = ($match[2] > '') ? $match[2].'!' : '';
+						$fromString .= $match[3];
+						$modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows);
+
+						if ($match[3] !== $modified3) {
+							if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) {
+								$toString = ($match[2] > '') ? $match[2].'!' : '';
+								$toString .= $modified3;
+								list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]);
+								//	Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
+								$column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000;
+								$row = trim($row,'$') + 10000000;
+								$cellIndex = $column.$row;
+
+								$newCellTokens[$cellIndex] = preg_quote($toString);
+								$cellTokens[$cellIndex] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				if ($adjustCount > 0) {
+					krsort($cellTokens);
+					krsort($newCellTokens);
+					//	Update cell references in the formula
+					$formulaBlock = str_replace('\\','',preg_replace($cellTokens,$newCellTokens,$formulaBlock));
+				}
 			}
 		}
 		unset($formulaBlock);
diff --git a/libraries/PHPExcel/PHPExcel/RichText.php b/libraries/PHPExcel/PHPExcel/RichText.php
index c938c62..588e643 100644
--- a/libraries/PHPExcel/PHPExcel/RichText.php
+++ b/libraries/PHPExcel/PHPExcel/RichText.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
index 613028f..3f1aa7a 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/Run.php b/libraries/PHPExcel/PHPExcel/RichText/Run.php
index 209af21..aac7676 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/Run.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/Run.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
index 3a24482..f5ce8e0 100644
--- a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
+++ b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php
@@ -20,7 +20,7 @@
  * @package    PHPExcel_RichText
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Settings.php b/libraries/PHPExcel/PHPExcel/Settings.php
index 7a1d57e..52d7880 100644
--- a/libraries/PHPExcel/PHPExcel/Settings.php
+++ b/libraries/PHPExcel/PHPExcel/Settings.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Settings
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /** PHPExcel root directory */
diff --git a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
index 10f82e4..f209838 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Date.php b/libraries/PHPExcel/PHPExcel/Shared/Date.php
index c45c23f..334e8df 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Date.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Date.php
@@ -23,7 +23,7 @@
  * @package	PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
index a89c94e..a24f963 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher.php b/libraries/PHPExcel/PHPExcel/Shared/Escher.php
index c230d99..11c19b2 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
index c78485b..6cbd2f0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
index c659fd5..919cf1a 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
index 83e3193..454b7ee 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
index 59d34cf..61eab5d 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
@@ -70,6 +70,13 @@ class PHPExcel_Shared_Escher_DggContainer
 	private $_OPT = array();
 
 	/**
+	 * Array of identifier clusters containg information about the maximum shape identifiers
+	 *
+	 * @var array
+	 */
+	private $_IDCLs = array();
+
+	/**
 	 * Get maximum shape index of all shapes in all drawings (plus one)
 	 *
 	 * @return int
@@ -174,4 +181,23 @@ class PHPExcel_Shared_Escher_DggContainer
 		return null;
 	}
 
+	/**
+	 * Get identifier clusters
+	 *
+	 * @return array
+	 */
+	public function getIDCLs()
+	{
+		return $this->_IDCLs;
+	}
+
+	/**
+	 * Set identifier clusters. array(<drawingId> => <max shape id>, ...)
+	 *
+	 * @param array $pValue
+	 */
+	public function setIDCLs($pValue)
+	{
+		$this->_IDCLs = $pValue;
+	}
 }
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
index 9292f2d..6040fb2 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
index 820e703..00ccb6d 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
index 35003dd..7f13632 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Escher
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
index 05af633..6469c52 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/File.php b/libraries/PHPExcel/PHPExcel/Shared/File.php
index dc2c3fd..23169ce 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/File.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/File.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -75,7 +75,9 @@ class PHPExcel_Shared_File
 		$returnValue = '';
 
 		// Try using realpath()
-		$returnValue = realpath($pFilename);
+		if (file_exists($pFilename)) {
+			$returnValue = realpath($pFilename);
+		}
 
 		// Found something?
 		if ($returnValue == '' || is_null($returnValue)) {
@@ -107,14 +109,14 @@ class PHPExcel_Shared_File
 		// http://php.net/manual/en/function.sys-get-temp-dir.php#94119
 
 		if ( !function_exists('sys_get_temp_dir')) {
-			if( $temp = getenv('TMP') ) {
-				return realpath($temp);
+			if ($temp = getenv('TMP') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
-			if( $temp = getenv('TEMP') ) {
-				return realpath($temp);
+			if ($temp = getenv('TEMP') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
-			if( $temp = getenv('TMPDIR') ) {
-				return realpath($temp);
+			if ($temp = getenv('TMPDIR') ) {
+				if (file_exists($temp)) { return realpath($temp); }
 			}
 
 			// trick for creating a file in system's temporary dir
@@ -126,10 +128,11 @@ class PHPExcel_Shared_File
 			}
 
 			return null;
-
 		}
 
 		// use ordinary built-in PHP function
+		//	There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only
+		//		be called if we're running 5.2.1 or earlier
 		return realpath(sys_get_temp_dir());
 	}
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/Font.php b/libraries/PHPExcel/PHPExcel/Shared/Font.php
index 1759e87..24d78be 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
index 7b6f845..af757d0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_OLE
  * @copyright  Copyright (c) 2006 - 2007 Christian Schmidt
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version 1.7.3c, 2010-06-01
+ * @version 1.7.4, 2010-08-26
  */
 
 /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
index b747e13..6aebbf0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1));
diff --git a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
index 6b7b312..7fb4934 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/String.php b/libraries/PHPExcel/PHPExcel/Shared/String.php
index 32766df..c033b9a 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/String.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/String.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -507,7 +507,7 @@ class PHPExcel_Shared_String
 	 * @author  Rasmus Andersson {@link http://rasmusandersson.se/}
 	 * @author vadik56
 	 */
-	function utf16_decode( $str, $bom_be=true ) {
+	public static function utf16_decode( $str, $bom_be=true ) {
 		if( strlen($str) < 2 ) return $str;
 		$c0 = ord($str{0});
 		$c1 = ord($str{1});
diff --git a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
index 223d3dd..8514847 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php
@@ -22,13 +22,18 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 if (!defined('DATE_W3C')) {
   define('DATE_W3C', 'Y-m-d\TH:i:sP');
 }
 
+if (!defined('DEBUGMODE_ENABLED')) {
+  define('DEBUGMODE_ENABLED', false);
+}
+
+
 /**
  * PHPExcel_Shared_XMLWriter
  *
@@ -80,7 +85,9 @@ class PHPExcel_Shared_XMLWriter {
     	}
 
     	// Set default values
-    	$this->_xmlWriter->setIndent(true);
+		if (DEBUGMODE_ENABLED) {
+	    	$this->_xmlWriter->setIndent(true);
+	    }
     }
 
     /**
diff --git a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
index 77661c6..b79bfc8 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
index 27fecd5..28fe725 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
index a0717ea..0ff98cc 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
index 99f358c..71219a0 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
index a59c879..03c7dc3 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
index 02ff0a5..6947c11 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
index 9328fcb..6d2281c 100644
--- a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
+++ b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Shared_Best_Fit
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Style.php b/libraries/PHPExcel/PHPExcel/Style.php
index d0cbcb0..3e84f9f 100644
--- a/libraries/PHPExcel/PHPExcel/Style.php
+++ b/libraries/PHPExcel/PHPExcel/Style.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -675,7 +675,7 @@ class PHPExcel_Style implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Alignment.php b/libraries/PHPExcel/PHPExcel/Style/Alignment.php
index 412c603..15b6c87 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Alignment.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Alignment.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -479,7 +479,7 @@ class PHPExcel_Style_Alignment implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Border.php b/libraries/PHPExcel/PHPExcel/Style/Border.php
index 1af31d6..166ccb2 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Border.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Border.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -372,7 +372,7 @@ class PHPExcel_Style_Border implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Borders.php b/libraries/PHPExcel/PHPExcel/Style/Borders.php
index ffd66af..dc32c50 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Borders.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Borders.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -489,7 +489,7 @@ class PHPExcel_Style_Borders implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Color.php b/libraries/PHPExcel/PHPExcel/Style/Color.php
index 8a25af0..9734d62 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Color.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Color.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -398,7 +398,7 @@ class PHPExcel_Style_Color implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Conditional.php b/libraries/PHPExcel/PHPExcel/Style/Conditional.php
index 8ec5f92..4602b53 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Conditional.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Conditional.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Style/Fill.php b/libraries/PHPExcel/PHPExcel/Style/Fill.php
index 3ebf380..1357e47 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Fill.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Fill.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -391,7 +391,7 @@ class PHPExcel_Style_Fill implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Font.php b/libraries/PHPExcel/PHPExcel/Style/Font.php
index de39cf2..b58dbf5 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -609,7 +609,7 @@ class PHPExcel_Style_Font implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
index 9ff1a97..0f0dcdc 100644
--- a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
+++ b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Style
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -443,7 +443,7 @@ class PHPExcel_Style_NumberFormat implements PHPExcel_IComparable
 	{
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Style/Protection.php b/libraries/PHPExcel/PHPExcel/Style/Protection.php
index 1c70702..29832da 100644
--- a/libraries/PHPExcel/PHPExcel/Style/Protection.php
+++ b/libraries/PHPExcel/PHPExcel/Style/Protection.php
@@ -271,7 +271,7 @@ class PHPExcel_Style_Protection implements PHPExcel_IComparable
 	public function __clone() {
 		$vars = get_object_vars($this);
 		foreach ($vars as $key => $value) {
-			if (is_object($value)) {
+			if ((is_object($value)) && ($key != '_parent')) {
 				$this->$key = clone $value;
 			} else {
 				$this->$key = $value;
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet.php b/libraries/PHPExcel/PHPExcel/Worksheet.php
index dc401fd..fb7cc0a 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -2180,9 +2180,8 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
 		$highestRow    = 1;
 
     	// Find cells that can be cleaned
-    	foreach ($this->_cellCollection->getCellList() as $coordinate) {
-			preg_match('/^(\w+)(\d+)$/U',$coordinate,$matches);
-			list(,$col,$row) = $matches;
+    	foreach ($this->_cellCollection->getCellList() as $coord) {
+			list($col,$row) = sscanf($coord,'%[A-Z]%d');
 			$column = PHPExcel_Cell::columnIndexFromString($col);
 
 			// Determine highest column and row
@@ -2468,7 +2467,13 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
 			}
 
 			if (is_object($val) || (is_array($val))) {
-				$this->{$key} = unserialize(serialize($val));
+				if ($key == '_cellCollection') {
+					$newCollection = clone $this->_cellCollection;
+					$newCollection->copyCellCollection($this);
+					$this->_cellCollection = $newCollection;
+				} else {
+					$this->{$key} = unserialize(serialize($val));
+				}
 			}
 		}
 	}
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
index e2c65c3..511643b 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
index 4a6589f..630e089 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
index f42ef31..30b0035 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
index 7d362c0..537f9f3 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet_Drawing
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
index f83c26d..053ab0d 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet_Drawing
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
index 4e39339..9d2708d 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
index 9f2b25d..f614261 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
index 0bd37f5..a43e6a9 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
index 6fc8f1a..155b976 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
index ffbd573..8e615f7 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -179,6 +179,11 @@ class PHPExcel_Worksheet_PageSetup
 	const ORIENTATION_LANDSCAPE	= 'landscape';
 	const ORIENTATION_PORTRAIT	= 'portrait';
 
+	/* Print Range Set Method */
+	const SETPRINTRANGE_OVERWRITE	= 'O';
+	const SETPRINTRANGE_INSERT		= 'I';
+
+
 	/**
 	 * Paper size
 	 *
@@ -261,7 +266,7 @@ class PHPExcel_Worksheet_PageSetup
 	 * @var string
 	 */
 	private $_printArea = null;
-	
+
 	/**
 	 * First page number
 	 *
@@ -570,55 +575,197 @@ class PHPExcel_Worksheet_PageSetup
 	}
 
 	/**
-	 * Get print area
+	 *	Get print area
 	 *
-	 * @return string
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or a index value of 0, will return all ranges as a comma-separated string
+	 *							Otherwise, the specific range identified by the value of $index will be returned
+	 *							Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	string
 	 */
-	public function getPrintArea() {
-		return $this->_printArea;
+	public function getPrintArea($index = 0) {
+		if ($index == 0) {
+			return $this->_printArea;
+		}
+		$printAreas = explode(',',$this->_printArea);
+		if (isset($printAreas[$index-1])) {
+			return $printAreas[$index-1];
+		}
+		throw new Exception("Requested Print Area does not exist");
 	}
 
 	/**
-	 * Is print area set?
+	 *	Is print area set?
 	 *
-	 * @return boolean
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or an index value of 0, will identify whether any print range is set
+	 *							Otherwise, existence of the range identified by the value of $index will be returned
+	 *							Print areas are numbered from 1
+	 *	@return	boolean
 	 */
-	public function isPrintAreaSet() {
-		return !is_null($this->_printArea);
+	public function isPrintAreaSet($index = 0) {
+		if ($index == 0) {
+			return !is_null($this->_printArea);
+		}
+		$printAreas = explode(',',$this->_printArea);
+		return isset($printAreas[$index-1]);
 	}
 
 	/**
-	 * Set print area. E.g. 'A1:D10' or 'A1:D10,G5:M20'
+	 *	Clear a print area
 	 *
-	 * @param string $value
-	 * @throws Exception
-	 * @return PHPExcel_Worksheet_PageSetup
+	 *	@param	int		$index	Identifier for a specific print area range if several ranges have been set
+	 *							Default behaviour, or an index value of 0, will clear all print ranges that are set
+	 *							Otherwise, the range identified by the value of $index will be removed from the series
+	 *							Print areas are numbered from 1
+	 *	@return	PHPExcel_Worksheet_PageSetup
 	 */
-	public function setPrintArea($value) {
-    	if (strpos($value,':') === false) {
-    		throw new Exception('Cell coordinate must be a range of cells.');
-    	} elseif (strpos($value,'$') !== false) {
-    		throw new Exception('Cell coordinate must not be absolute.');
-    	} else {
-			$this->_printArea = strtoupper($value);
-    	}
+	public function clearPrintArea($index = 0) {
+		if ($index == 0) {
+			$this->_printArea = NULL;
+		} else {
+			$printAreas = explode(',',$this->_printArea);
+			if (isset($printAreas[$index-1])) {
+				unset($printAreas[$index-1]);
+				$this->_printArea = implode(',',$printAreas);
+			}
+		}
+
+    	return $this;
+	}
+
+	/**
+	 *	Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20'
+	 *
+	 *	@param	string	$value
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							When the method is "O"verwrite, then a positive integer index will overwrite that indexed
+	 *								entry in the print areas list; a negative index value will identify which entry to
+	 *								overwrite working bacward through the print area to the list, with the last entry as -1.
+	 *								Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
+	 *							When the method is "I"nsert, then a positive index will insert after that indexed entry in
+	 *								the print areas list, while a negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@param	string	$method	Determines the method used when setting multiple print areas
+	 *							Default behaviour, or the "O" method, overwrites existing print area
+	 *							The "I" method, inserts the new print area before any specified index, or at the end of the list
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+	public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) {
+		if (strpos($value,'!') !== false) {
+			throw new Exception('Cell coordinate must not specify a worksheet.');
+		} elseif (strpos($value,':') === false) {
+			throw new Exception('Cell coordinate must be a range of cells.');
+		} elseif (strpos($value,'$') !== false) {
+			throw new Exception('Cell coordinate must not be absolute.');
+		}
+		$value = strtoupper($value);
+
+		if ($method == self::SETPRINTRANGE_OVERWRITE) {
+			if ($index == 0) {
+				$this->_printArea = $value;
+			} else {
+				$printAreas = explode(',',$this->_printArea);
+				if($index < 0) {
+					$index = count($printAreas) - abs($index) + 1;
+				}
+				if (($index <= 0) || ($index > count($printAreas))) {
+		    		throw new Exception('Invalid index for setting print range.');
+				}
+				$printAreas[$index-1] = $value;
+				$this->_printArea = implode(',',$printAreas);
+			}
+		} elseif($method == self::SETPRINTRANGE_INSERT) {
+			if ($index == 0) {
+				$this->_printArea .= ($this->_printArea == '') ? $value : ','.$value;
+			} else {
+				$printAreas = explode(',',$this->_printArea);
+				if($index < 0) {
+					$index = abs($index) - 1;
+				}
+				if ($index > count($printAreas)) {
+		    		throw new Exception('Invalid index for setting print range.');
+				}
+				$printAreas = array_merge(array_slice($printAreas,0,$index),array($value),array_slice($printAreas,$index));
+				$this->_printArea = implode(',',$printAreas);
+			}
+		} else {
+    		throw new Exception('Invalid method for setting print range.');
+		}
+
     	return $this;
 	}
 
 	/**
-	 * Set print area
+	 *	Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas
 	 *
-	 * @param int $column1		Column 1
-	 * @param int $row1			Row 1
-	 * @param int $column2		Column 2
-	 * @param int $row2			Row 2
-	 * @return PHPExcel_Worksheet_PageSetup
+	 *	@param	string	$value
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							A positive index will insert after that indexed entry in the print areas list, while a
+	 *								negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
 	 */
-    public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2)
+	public function addPrintArea($value, $index = -1) {
+		return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT);
+	}
+
+	/**
+	 *	Set print area
+	 *
+	 *	@param	int		$column1	Column 1
+	 *	@param	int		$row1		Row 1
+	 *	@param	int		$column2	Column 2
+	 *	@param	int		$row2		Row 2
+	 *	@param	int		$index	Identifier for a specific print area range allowing several ranges to be set
+	 *							When the method is "O"verwrite, then a positive integer index will overwrite that indexed
+	 *								entry in the print areas list; a negative index value will identify which entry to
+	 *								overwrite working bacward through the print area to the list, with the last entry as -1.
+	 *								Specifying an index value of 0, will overwrite <b>all</b> existing print ranges.
+	 *							When the method is "I"nsert, then a positive index will insert after that indexed entry in
+	 *								the print areas list, while a negative index will insert before the indexed entry.
+	 *								Specifying an index value of 0, will always append the new print range at the end of the
+	 *								list.
+	 *							Print areas are numbered from 1
+	 *	@param	string	$method	Determines the method used when setting multiple print areas
+	 *							Default behaviour, or the "O" method, overwrites existing print area
+	 *							The "I" method, inserts the new print area before any specified index, or at the end of the list
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+    public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE)
     {
-    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2);
+    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, $method);
     }
-    
+
+	/**
+	 *	Add a new print area to the list of print areas
+	 *
+	 *	@param	int		$column1	Column 1
+	 *	@param	int		$row1		Row 1
+	 *	@param	int		$column2	Column 2
+	 *	@param	int		$row2		Row 2
+	 *	@param	int		$index		Identifier for a specific print area range allowing several ranges to be set
+	 *								A positive index will insert after that indexed entry in the print areas list, while a
+	 *									negative index will insert before the indexed entry.
+	 *									Specifying an index value of 0, will always append the new print range at the end of the
+	 *									list.
+	 *								Print areas are numbered from 1
+	 *	@throws	Exception
+	 *	@return	PHPExcel_Worksheet_PageSetup
+	 */
+    public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1)
+    {
+    	return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, self::SETPRINTRANGE_INSERT);
+	}
+
 	/**
 	 * Get first page number
 	 *
@@ -627,7 +774,7 @@ class PHPExcel_Worksheet_PageSetup
     public function getFirstPageNumber() {
 		return $this->_firstPageNumber;
     }
-    
+
     /**
      * Set first page number
      *
@@ -638,7 +785,7 @@ class PHPExcel_Worksheet_PageSetup
 		$this->_firstPageNumber = $value;
 		return $this;
     }
-    
+
     /**
      * Reset first page number
      *
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
index 0e7bc4f..f60a265 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
index c5cb33a..7311721 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
index 8b1277d..153024f 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
index d21bd51..e0f91fc 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
index c7e04ae..fdfe001 100644
--- a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
+++ b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Worksheet
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
index f6f6a6f..87f8b29 100644
--- a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
+++ b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/CSV.php b/libraries/PHPExcel/PHPExcel/Writer/CSV.php
index 03e1a6e..765244d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/CSV.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/CSV.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -106,6 +106,8 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter {
 		// Fetch sheet
 		$sheet = $this->_phpExcel->getSheet($this->_sheetIndex);
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
 		PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
 
@@ -132,6 +134,7 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter {
 		fclose($fileHandle);
 
 		PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
index 1963ab9..b9f7464 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -201,6 +201,8 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter
 				}
 			}
 
+			$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+			PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 			$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
 			PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
 
@@ -331,6 +333,7 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter
 			}
 
 			PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
+			PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 
 			// Close file
 			if ($objZip->close() === false) {
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
index ddb7958..3a6ad37 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
index d27e386..84de96d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
index 68e0f04..21fc3a4 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
index 670b835..f1551da 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
index d133621..7ffdd6d 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
index 8ab1c52..98a3c45 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
index dd7621d..5354936 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
index 9dbee16..e8ffe7b 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
index 245fb87..d2c51fb 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
index 411b42a..327e542 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php
@@ -22,7 +22,7 @@
  * @package	PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -1002,7 +1002,18 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ
 
 						break;
 					case 'f':			// Formula
-						$objWriter->writeElement('f', substr($pCell->getValue(), 1));
+						$attributes = $pCell->getFormulaAttributes();
+						if($attributes['t'] == 'array') {
+							$objWriter->startElement('f');
+							$objWriter->writeAttribute('t', 'array');
+							$objWriter->writeAttribute('ref', $pCell->getCoordinate());
+							$objWriter->writeAttribute('aca', '1');
+							$objWriter->writeAttribute('ca', '1');
+							$objWriter->text(substr($pCell->getValue(), 1));
+							$objWriter->endElement();
+						} else {
+							$objWriter->writeElement('f', substr($pCell->getValue(), 1));
+						}
 						if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
 							if ($this->getParentWriter()->getPreCalculateFormulas()) {
 								$calculatedValue = $pCell->getCalculatedValue();
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
index c153237..97d56e1 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel2007
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
index 0bb5571..4d69d91 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version	1.7.3c, 2010-06-01
+ * @version	1.7.4, 2010-08-26
  */
 
 
@@ -91,6 +91,13 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 	 */
 	private $_parser;
 
+	/**
+	 * Identifier clusters for drawings. Used in MSODRAWINGGROUP record.
+	 *
+	 * @var array
+	 */
+	private $_IDCLs;
+
 
 	/**
 	 * Create a new PHPExcel_Writer_Excel5
@@ -120,6 +127,8 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		// garbage collect
 		$this->_phpExcel->garbageCollect();
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
 		PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
 
@@ -130,6 +139,21 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel, $this->_BIFF_version,
 					$this->_str_total, $this->_str_unique, $this->_str_table, $this->_colors, $this->_parser);
 
+		// Initialise worksheet writers
+		$countSheets = $this->_phpExcel->getSheetCount();
+		for ($i = 0; $i < $countSheets; ++$i) {
+			$this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version,
+									   $this->_str_total, $this->_str_unique,
+									   $this->_str_table, $this->_colors,
+									   $this->_parser,
+									   $this->_preCalculateFormulas,
+									   $this->_phpExcel->getSheet($i));
+		}
+
+		// build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook.
+		$this->_buildWorksheetEschers();
+		$this->_buildWorkbookEscher();
+
 		// add 15 identical cell style Xfs
 		// for now, we use the first cellXf instead of cellStyleXf
 		$cellXfCollection = $this->_phpExcel->getCellXfCollection();
@@ -146,19 +170,10 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$workbookStreamName = ($this->_BIFF_version == 0x0600) ? 'Workbook' : 'Book';
 		$OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName));
 
-		// Initialise worksheet writers
-		$countSheets = $this->_phpExcel->getSheetCount();
 		// Write the worksheet streams before the global workbook stream,
 		// because the byte sizes of these are needed in the global workbook stream
 		$worksheetSizes = array();
 		for ($i = 0; $i < $countSheets; ++$i) {
-			$this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version,
-									   $this->_str_total, $this->_str_unique,
-									   $this->_str_table, $this->_colors,
-									   $this->_parser,
-									   $this->_preCalculateFormulas,
-									   $this->_phpExcel->getSheet($i));
-
 			$this->_writerWorksheets[$i]->close();
 			$worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize;
 		}
@@ -176,6 +191,7 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$res = $root->save($pFilename);
 
 		PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
@@ -208,4 +224,253 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
 		$this->_preCalculateFormulas = $pValue;
 	}
 
+	private function _buildWorksheetEschers()
+	{
+		// 1-based index to BstoreContainer
+		$blipIndex = 0;
+
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			// sheet index
+			$sheetIndex = $sheet->getParent()->getIndex($sheet);
+
+			$escher = null;
+
+			// check if there are any shapes for this sheet
+			if (count($sheet->getDrawingCollection()) == 0) {
+				continue;
+			}
+
+			// create intermediate Escher object
+			$escher = new PHPExcel_Shared_Escher();
+
+			// dgContainer
+			$dgContainer = new PHPExcel_Shared_Escher_DgContainer();
+
+			// set the drawing index (we use sheet index + 1)
+			$dgId = $sheet->getParent()->getIndex($sheet) + 1;
+			$dgContainer->setDgId($dgId);
+			$escher->setDgContainer($dgContainer);
+
+			// spgrContainer
+			$spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
+			$dgContainer->setSpgrContainer($spgrContainer);
+
+			// add one shape which is the group shape
+			$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
+			$spContainer->setSpgr(true);
+			$spContainer->setSpType(0);
+			$spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10);
+			$spgrContainer->addChild($spContainer);
+
+			// add the shapes
+
+			$countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet
+
+			foreach ($sheet->getDrawingCollection() as $drawing) {
+				++$blipIndex;
+
+				++$countShapes[$sheetIndex];
+
+				// add the shape
+				$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
+
+				// set the shape type
+				$spContainer->setSpType(0x004B);
+
+				// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
+				$reducedSpId = $countShapes[$sheetIndex];
+				$spId = $reducedSpId
+					| ($sheet->getParent()->getIndex($sheet) + 1) << 10;
+				$spContainer->setSpId($spId);
+
+				// keep track of last reducedSpId
+				$lastReducedSpId = $reducedSpId;
+
+				// keep track of last spId
+				$lastSpId = $spId;
+
+				// set the BLIP index
+				$spContainer->setOPT(0x4104, $blipIndex);
+
+				// set coordinates and offsets, client anchor
+				$coordinates = $drawing->getCoordinates();
+				$offsetX = $drawing->getOffsetX();
+				$offsetY = $drawing->getOffsetY();
+				$width = $drawing->getWidth();
+				$height = $drawing->getHeight();
+
+				$twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height);
+
+				$spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
+				$spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
+				$spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
+				$spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
+				$spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
+				$spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
+
+				$spgrContainer->addChild($spContainer);
+			}
+
+			// identifier clusters, used for workbook Escher object
+			$this->_IDCLs[$dgId] = $lastReducedSpId;
+
+			// set last shape index
+			$dgContainer->setLastSpId($lastSpId);
+
+			// set the Escher object
+			$this->_writerWorksheets[$sheetIndex]->setEscher($escher);
+		}
+	}
+
+	/**
+	 * Build the Escher object corresponding to the MSODRAWINGGROUP record
+	 */
+	private function _buildWorkbookEscher()
+	{
+		$escher = null;
+
+		// any drawings in this workbook?
+		$found = false;
+		foreach ($this->_phpExcel->getAllSheets() as $sheet) {
+			if (count($sheet->getDrawingCollection()) > 0) {
+				$found = true;
+			}
+		}
+
+		// nothing to do if there are no drawings
+		if (!$found) {
+			return;
+		}
+
+		// if we reach here, then there are drawings in the workbook
+		$escher = new PHPExcel_Shared_Escher();
+
+		// dggContainer
+		$dggContainer = new PHPExcel_Shared_Escher_DggContainer();
+		$escher->setDggContainer($dggContainer);
+
+		// set IDCLs (identifier clusters)
+		$dggContainer->setIDCLs($this->_IDCLs);
+
+		// this loop is for determining maximum shape identifier of all drawing
+		$spIdMax = 0;
+		$totalCountShapes = 0;
+		$countDrawings = 0;
+
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			$sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet
+
+			if (count($sheet->getDrawingCollection()) > 0) {
+				++$countDrawings;
+
+				foreach ($sheet->getDrawingCollection() as $drawing) {
+					++$sheetCountShapes;
+					++$totalCountShapes;
+
+					$spId = $sheetCountShapes
+						| ($this->_phpExcel->getIndex($sheet) + 1) << 10;
+					$spIdMax = max($spId, $spIdMax);
+				}
+			}
+		}
+
+		$dggContainer->setSpIdMax($spIdMax + 1);
+		$dggContainer->setCDgSaved($countDrawings);
+		$dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing
+
+		// bstoreContainer
+		$bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();
+		$dggContainer->setBstoreContainer($bstoreContainer);
+
+		// the BSE's (all the images)
+		foreach ($this->_phpExcel->getAllsheets() as $sheet) {
+			foreach ($sheet->getDrawingCollection() as $drawing) {
+				if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
+
+					$filename = $drawing->getPath();
+
+					list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
+
+					switch ($imageFormat) {
+
+					case 1: // GIF, not supported by BIFF8, we convert to PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$imageResource = imagecreatefromgif($filename);
+						ob_start();
+						imagepng($imageResource);
+						$blipData = ob_get_contents();
+						ob_end_clean();
+						break;
+
+					case 2: // JPEG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
+						$blipData = file_get_contents($filename);
+						break;
+
+					case 3: // PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$blipData = file_get_contents($filename);
+						break;
+
+					case 6: // Windows DIB (BMP), we convert to PNG
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename);
+						ob_start();
+						imagepng($imageResource);
+						$blipData = ob_get_contents();
+						ob_end_clean();
+						break;
+
+					default: continue 2;
+
+					}
+
+					$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
+					$blip->setData($blipData);
+
+					$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
+					$BSE->setBlipType($blipType);
+					$BSE->setBlip($blip);
+
+					$bstoreContainer->addBSE($BSE);
+
+				} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
+
+					switch ($drawing->getRenderingFunction()) {
+
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
+						$renderingFunction = 'imagejpeg';
+						break;
+
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
+					case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
+						$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
+						$renderingFunction = 'imagepng';
+						break;
+
+					}
+
+					ob_start();
+					call_user_func($renderingFunction, $drawing->getImageResource());
+					$blipData = ob_get_contents();
+					ob_end_clean();
+
+					$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
+					$blip->setData($blipData);
+
+					$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
+					$BSE->setBlipType($blipType);
+					$BSE->setBlip($blip);
+
+					$bstoreContainer->addBSE($BSE);
+				}
+			}
+		}
+
+		// Set the Escher object
+		$this->_writerWorkbook->setEscher($escher);
+	}
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
index 2c0a2d1..e758aeb 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class):
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
index 402bd19..3c9c29f 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
  
@@ -106,9 +106,12 @@ class PHPExcel_Writer_Excel5_Escher
 					, $this->_object->getCSpSaved()
 					, $this->_object->getCDgSaved() // count total number of drawings saved
 				);
+
 			// add file identifier clusters (one per drawing)
-			for ($i = 0; $i < $this->_object->getCDgSaved(); ++$i) {
-				$dggData .= pack('VV', 0, 0);
+			$IDCLs = $this->_object->getIDCLs();
+
+			foreach ($IDCLs as $dgId => $maxReducedSpId) {
+				$dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
 			}
 
 			$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
index bb4d201..2928070 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
index cef650f..eb9891e 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class):
@@ -1148,6 +1148,9 @@ class PHPExcel_Writer_Excel5_Parser
 			case "<>":
 				return $token;
 				break;
+			case "^":
+				return $token;
+				break;
 			default:
 				// if it's a reference A1 or $A$1 or $A1 or A$1
 				if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and
@@ -1288,19 +1291,30 @@ class PHPExcel_Writer_Excel5_Parser
 			$result2 = $this->_expression();
 			$result = $this->_createTree('ptgUminus', $result2, '');
 			return $result;
+		} elseif ($this->_current_token == "+") {
+			// catch "+" Term
+			$this->_advance();
+			$result2 = $this->_expression();
+			$result = $this->_createTree('ptgUplus', $result2, '');
+			return $result;
 		}
 		$result = $this->_term();
 		while (($this->_current_token == "+") or
-			   ($this->_current_token == "-")) {
+			   ($this->_current_token == "-") or
+			   ($this->_current_token == "^")) {
 		/**/
 			if ($this->_current_token == "+") {
 				$this->_advance();
 				$result2 = $this->_term();
 				$result = $this->_createTree('ptgAdd', $result, $result2);
-			} else {
+			} elseif ($this->_current_token == "-") {
 				$this->_advance();
 				$result2 = $this->_term();
 				$result = $this->_createTree('ptgSub', $result, $result2);
+			} else {
+				$this->_advance();
+				$result2 = $this->_term();
+				$result = $this->_createTree('ptgPower', $result, $result2);
 			}
 		}
 		return $result;
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
index d26ddee..6e517e6 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class):
@@ -182,6 +182,13 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 	 */
 	private $_colors;
 
+	/**
+	 * Escher object corresponding to MSODRAWINGGROUP
+	 *
+	 * @var PHPExcel_Shared_Escher
+	 */
+	private $_escher;
+
 
 	/**
 	 * Class constructor
@@ -1400,143 +1407,9 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 	 */
 	private function _writeMsoDrawingGroup()
 	{
-		// any drawings in this workbook?
-		$found = false;
-		foreach ($this->_phpExcel->getAllSheets() as $sheet) {
-			if (count($sheet->getDrawingCollection()) > 0) {
-				$found = true;
-			}
-		}
-
-		// if there are drawings, then we need to write MSODRAWINGGROUP record
-		if ($found) {
-
-			// create intermediate Escher object
-			$escher = new PHPExcel_Shared_Escher();
-
-			// dggContainer
-			$dggContainer = new PHPExcel_Shared_Escher_DggContainer();
-			$escher->setDggContainer($dggContainer);
-
-			// this loop is for determining maximum shape identifier of all drawing
-			$spIdMax = 0;
-			$totalCountShapes = 0;
-			$countDrawings = 0;
-
-			foreach ($this->_phpExcel->getAllsheets() as $sheet) {
-				$sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet
-
-				if (count($sheet->getDrawingCollection()) > 0) {
-					++$countDrawings;
-
-					foreach ($sheet->getDrawingCollection() as $drawing) {
-						++$sheetCountShapes;
-						++$totalCountShapes;
-
-						$spId = $sheetCountShapes
-							| ($this->_phpExcel->getIndex($sheet) + 1) << 10;
-						$spIdMax = max($spId, $spIdMax);
-					}
-				}
-			}
-
-			$dggContainer->setSpIdMax($spIdMax + 1);
-			$dggContainer->setCDgSaved($countDrawings);
-			$dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing
-
-			// bstoreContainer
-			$bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();
-			$dggContainer->setBstoreContainer($bstoreContainer);
-
-			// the BSE's (all the images)
-			foreach ($this->_phpExcel->getAllsheets() as $sheet) {
-				foreach ($sheet->getDrawingCollection() as $drawing) {
-					if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
-
-						$filename = $drawing->getPath();
-
-						list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
-
-						switch ($imageFormat) {
-
-						case 1: // GIF, not supported by BIFF8, we convert to PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$imageResource = imagecreatefromgif($filename);
-							ob_start();
-							imagepng($imageResource);
-							$blipData = ob_get_contents();
-							ob_end_clean();
-							break;
-
-						case 2: // JPEG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
-							$blipData = file_get_contents($filename);
-							break;
-
-						case 3: // PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$blipData = file_get_contents($filename);
-							break;
-
-						case 6: // Windows DIB (BMP), we convert to PNG
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename);
-							ob_start();
-							imagepng($imageResource);
-							$blipData = ob_get_contents();
-							ob_end_clean();
-							break;
-
-						default: continue 2;
-
-						}
-
-						$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
-						$blip->setData($blipData);
-
-						$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
-						$BSE->setBlipType($blipType);
-						$BSE->setBlip($blip);
-
-						$bstoreContainer->addBSE($BSE);
-
-					} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
-
-						switch ($drawing->getRenderingFunction()) {
-
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG;
-							$renderingFunction = 'imagejpeg';
-							break;
-
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:
-						case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:
-							$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG;
-							$renderingFunction = 'imagepng';
-							break;
-
-						}
-
-						ob_start();
-						call_user_func($renderingFunction, $drawing->getImageResource());
-						$blipData = ob_get_contents();
-						ob_end_clean();
-
-						$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip();
-						$blip->setData($blipData);
-
-						$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE();
-						$BSE->setBlipType($blipType);
-						$BSE->setBlip($blip);
-
-						$bstoreContainer->addBSE($BSE);
-					}
-				}
-			}
-
-			// write the Escher stream from the intermediate Escher object
-			$writer = new PHPExcel_Writer_Excel5_Escher($escher);
+		// write the Escher stream if necessary
+		if (isset($this->_escher)) {
+			$writer = new PHPExcel_Writer_Excel5_Escher($this->_escher);
 			$data = $writer->close();
 
 			$record = 0x00EB;
@@ -1544,7 +1417,30 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
 			$header = pack("vv",  $record, $length);
 
 			return $this->writeData($header . $data);
+
+		} else {
+			return '';
 		}
 	}
 
+	/**
+	 * Get Escher object
+	 *
+	 * @return PHPExcel_Shared_Escher
+	 */
+	public function getEscher()
+	{
+		return $this->_escher;
+	}
+
+	/**
+	 * Set Escher object
+	 *
+	 * @param PHPExcel_Shared_Escher $pValue
+	 */
+	public function setEscher(PHPExcel_Shared_Escher $pValue = null)
+	{
+		$this->_escher = $pValue;
+	}
+
 }
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
index 646101a..0dd2b00 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class):
@@ -186,6 +186,13 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 	private $_countCellStyleXfs;
 
 	/**
+	 * Escher object corresponding to MSODRAWING
+	 *
+	 * @var PHPExcel_Shared_Escher
+	 */
+	private $_escher;
+
+	/**
 	 * Constructor
 	 *
 	 * @param int  $BIFF_version		 BIFF version
@@ -2694,142 +2701,82 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 	}
 
 	/**
-	 * Write MSODRAWING record
+	 * Get Escher object
+	 *
+	 * @return PHPExcel_Shared_Escher
 	 */
-	private function _writeMsoDrawing()
+	public function getEscher()
 	{
-		// check if there are any shapes for this sheet
-		if (count($this->_phpSheet->getDrawingCollection()) == 0) {
-			return;
-		}
-
-		// create intermediate Escher object
-		$escher = new PHPExcel_Shared_Escher();
-
-		// dgContainer
-		$dgContainer = new PHPExcel_Shared_Escher_DgContainer();
-
-		// set the drawing index (we use sheet index + 1)
-		$dgContainer->setDgId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1);
-		$escher->setDgContainer($dgContainer);
-
-		// spgrContainer
-		$spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
-		$dgContainer->setSpgrContainer($spgrContainer);
-
-		// add one shape which is the group shape
-		$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
-		$spContainer->setSpgr(true);
-		$spContainer->setSpType(0);
-		$spContainer->setSpId(($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10);
-		$spgrContainer->addChild($spContainer);
-
-		// add the shapes
-
-		// outer loop is for determining BSE index
-		$blipIndex = 0; // 1-based index to BstoreContainer
-
-		$countShapes = 0; // count number of shapes (minus group shape), in this sheet
-
-		foreach ($this->_phpSheet->getParent()->getAllsheets() as $sheet) {
-			foreach ($sheet->getDrawingCollection() as $drawing) {
-				++$blipIndex;
-
-				if ($sheet === $this->_phpSheet) {
-					++$countShapes;
-
-					// add the shape
-					$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
-
-					// set the shape type
-					$spContainer->setSpType(0x004B);
-
-					// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
-					$spId = $countShapes
-						| ($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10;
-					$spContainer->setSpId($spId);
-
-					// keep track of last spId
-					$lastSpId = $spId;
-
-					// set the BLIP index
-					$spContainer->setOPT(0x4104, $blipIndex);
-
-					// set coordinates and offsets, client anchor
-					$coordinates = $drawing->getCoordinates();
-					$offsetX = $drawing->getOffsetX();
-					$offsetY = $drawing->getOffsetY();
-					$width = $drawing->getWidth();
-					$height = $drawing->getHeight();
-
-					$twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($this->_phpSheet, $coordinates, $offsetX, $offsetY, $width, $height);
+		return $this->_escher;
+	}
 
-					$spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
-					$spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
-					$spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
-					$spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
-					$spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
-					$spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
+	/**
+	 * Set Escher object
+	 *
+	 * @param PHPExcel_Shared_Escher $pValue
+	 */
+	public function setEscher(PHPExcel_Shared_Escher $pValue = null)
+	{
+		$this->_escher = $pValue;
+	}
 
-					$spgrContainer->addChild($spContainer);
-				}
+	/**
+	 * Write MSODRAWING record
+	 */
+	private function _writeMsoDrawing()
+	{
+		// write the Escher stream if necessary
+		if (isset($this->_escher)) {
+			$writer = new PHPExcel_Writer_Excel5_Escher($this->_escher);
+			$data = $writer->close();
+			$spOffsets = $writer->getSpOffsets();
+
+			// write the neccesary MSODRAWING, OBJ records
+
+			// split the Escher stream
+			$spOffsets[0] = 0;
+			$nm = count($spOffsets) - 1; // number of shapes excluding first shape
+			for ($i = 1; $i <= $nm; ++$i) {
+				// MSODRAWING record
+				$record = 0x00EC;			// Record identifier
+
+				// chunk of Escher stream for one shape
+
+				$dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]);
+
+				$length = strlen($dataChunk);
+				$header = pack("vv", $record, $length);
+
+				$this->_append($header . $dataChunk);
+
+				// OBJ record
+				$record = 0x005D; // record identifier
+				$objData = '';
+
+				// ftCmo
+				$objData .=
+					pack('vvvvvVVV'
+						, 0x0015	// 0x0015 = ftCmo
+						, 0x0012	// length of ftCmo data
+						, 0x0008	// object type, 0x0008 = picture
+						, $i		// object id number, Excel seems to use 1-based index, local for the sheet
+						, 0x6011	// option flags, 0x6011 is what OpenOffice.org uses
+						, 0			// reserved
+						, 0			// reserved
+						, 0			// reserved
+					);
+				// ftEnd
+				$objData .=
+					pack('vv'
+						, 0x0000	// 0x0000 = ftEnd
+						, 0x0000	// length of ftEnd data
+					);
+
+				$length = strlen($objData);
+				$header = pack('vv', $record, $length);
+				$this->_append($header . $objData);
 			}
 		}
-
-		// set last shape index
-		$dgContainer->setLastSpId($lastSpId);
-
-		// write the Escher stream
-		$writer = new PHPExcel_Writer_Excel5_Escher($escher);
-		$data = $writer->close();
-		$spOffsets = $writer->getSpOffsets();
-
-		// write the neccesary MSODRAWING, OBJ records
-
-		// split the Escher stream
-		$spOffsets[0] = 0;
-		$nm = count($spOffsets) - 1; // number of shapes excluding first shape
-		for ($i = 1; $i <= $nm; ++$i) {
-			// MSODRAWING record
-			$record = 0x00EC;			// Record identifier
-
-			// chunk of Escher stream for one shape
-
-			$dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]);
-
-			$length = strlen($dataChunk);
-			$header = pack("vv", $record, $length);
-
-			$this->_append($header . $dataChunk);
-
-			// OBJ record
-			$record = 0x005D; // record identifier
-			$objData = '';
-
-			// ftCmo
-			$objData .=
-				pack('vvvvvVVV'
-					, 0x0015	// 0x0015 = ftCmo
-					, 0x0012	// length of ftCmo data
-					, 0x0008	// object type, 0x0008 = picture
-					, $i		// object id number, Excel seems to use 1-based index, local for the sheet
-					, 0x6011	// option flags, 0x6011 is what OpenOffice.org uses
-					, 0			// reserved
-					, 0			// reserved
-					, 0			// reserved
-				);
-			// ftEnd
-			$objData .=
-				pack('vv'
-					, 0x0000	// 0x0000 = ftEnd
-					, 0x0000	// length of ftEnd data
-				);
-
-			$length = strlen($objData);
-			$header = pack('vv', $record, $length);
-			$this->_append($header . $objData);
-		}
-
 	}
 
 	/**
@@ -3006,4 +2953,4 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 		return 0;
 	}
 
-}
+}
\ No newline at end of file
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
index 9246a34..27632f3 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer_Excel5
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 // Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class):
diff --git a/libraries/PHPExcel/PHPExcel/Writer/HTML.php b/libraries/PHPExcel/PHPExcel/Writer/HTML.php
index 3c892cf..b6667f5 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/HTML.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/HTML.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -152,6 +152,8 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 		// garbage collect
 		$this->_phpExcel->garbageCollect();
 
+		$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog;
+		PHPExcel_Calculation::getInstance()->writeDebugLog = false;
 		$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
 		PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
 
@@ -182,6 +184,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 		fclose($fileHandle);
 
 		PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
+		PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog;
 	}
 
 	/**
@@ -330,7 +333,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 	    	// row min,max
 			$rowMin = $dimension[0][1];
 			$rowMax = $dimension[1][1];
-			
+
 			// calculate start of <tbody>, <thead>
 			$tbodyStart = $rowMin;
 	    	$tbodyEnd   = $rowMax;
@@ -338,7 +341,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 			$theadEnd   = 0; // default: no </thead>
 			if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
 				$rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop();
-				
+
 				// we can only support repeating rows that start at top row
 				if ($rowsToRepeatAtTop[0] == 1) {
 					$theadStart = $rowsToRepeatAtTop[0];
@@ -346,7 +349,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 					$tbodyStart = $rowsToRepeatAtTop[1] + 1;
 				}
 			}
-			
+
 			// Loop through cells
 	    	$rowData = null;
 	    	for ($row = $rowMin; $row <= $rowMax; ++$row) {
diff --git a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
index ec5331e..35fd689 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/PDF.php b/libraries/PHPExcel/PHPExcel/Writer/PDF.php
index 570ce9d..f588635 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/PDF.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/PDF.php
@@ -22,7 +22,7 @@
  * @package		PHPExcel_Writer
  * @copyright	Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version		1.7.3c, 2010-06-01
+ * @version		1.7.4, 2010-08-26
  */
 
 
diff --git a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
index 603c4f7..51616b4 100644
--- a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
+++ b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php
@@ -22,7 +22,7 @@
  * @package    PHPExcel_Writer
  * @copyright  Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
- * @version    1.7.3c, 2010-06-01
+ * @version    1.7.4, 2010-08-26
  */
 
 
@@ -163,10 +163,10 @@ class PHPExcel_Writer_Serialized implements PHPExcel_Writer_IWriter
 
 		// PHPExcel
 		$objWriter->startElement('PHPExcel');
-		$objWriter->writeAttribute('version', '1.7.3c');
+		$objWriter->writeAttribute('version', '1.7.4');
 
 			// Comment
-			$objWriter->writeComment('This file has been generated using PHPExcel v1.7.3c (http://www.codeplex.com/PHPExcel) It contains a base64 encoded serialized version of the PHPExcel internal object.');
+			$objWriter->writeComment('This file has been generated using PHPExcel v1.7.4 (http://www.codeplex.com/PHPExcel) It contains a base64 encoded serialized version of the PHPExcel internal object.');
 
 			// Data
 			$objWriter->startElement('data');
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10090-ge539a03
                        
                        
by Dieter Adriaenssens 11 Sep '10
                    by Dieter Adriaenssens 11 Sep '10
11 Sep '10
                    
                        The branch, master has been updated
       via  e539a03ef938fb5df7950603bc196d2506c2c9b4 (commit)
       via  f5879655d58812b978dc975e5dc8d8497d11a3c3 (commit)
      from  4c61dc7f6b59bf7579ce6da9633a689191a3846f (commit)
- Log -----------------------------------------------------------------
commit e539a03ef938fb5df7950603bc196d2506c2c9b4
Merge: 4c61dc7f6b59bf7579ce6da9633a689191a3846f f5879655d58812b978dc975e5dc8d8497d11a3c3
Author: Dieter Adriaenssens <ruleant(a)users.sourceforge.net>
Date:   Sat Sep 11 11:03:15 2010 +0200
    Merge branch 'QA_3_3'
-----------------------------------------------------------------------
Summary of changes:
 libraries/import.lib.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/libraries/import.lib.php b/libraries/import.lib.php
index bacc6a4..98221de 100644
--- a/libraries/import.lib.php
+++ b/libraries/import.lib.php
@@ -739,7 +739,7 @@ function PMA_detectType($last_cumulative_type, &$cell) {
         if ($cell == (string)(float)$cell && strpos($cell, ".") !== false && substr_count($cell, ".") == 1) {
             return DECIMAL;
         } else {
-		if ($cell > 2147483647) {
+		if (abs($cell) > 2147483647) {
 			return BIGINT;
 		} else {
 			return INT;
hooks/post-receive
-- 
phpMyAdmin
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0